0%

常见应用扩展方案(一)

常见应用扩展方案(一)

总结一下互联网应用常见的扩展方案,从最开始的单体应用到能够满足百万用户的分布式系统。

单服务器

它的架构也非常简单,也是互联网中最常见的应用架构系统,正如它的名称它只有一台服务器提供服务,在服务器上装有web服务和数据库。

在理想情况下,一款优化良好的单体服务器可以支持数千到数万的并发用户,具体并发还需要根据服务器配置决定。但是,当用户量达到一定规模时,单体架构可能会面临扩展性和维护性的挑战。

市面上能被大家叫得出名字的软件那肯定需要支持高并发的服务架构,比如微信、微博等等,但是除了这些软件系统,还有千千万万的小公司小组织,他们用的系统我们可能连名字都叫不上来。

平心而论,单体服务器架构已经可以满足大部分公司或者组织使用的软件系统,这些软件系统用的人不多,并发量不会很大。

请求流程

下面这个图展示了用户通过手机或电脑在单服务器上请求的流程

Untitled

  1. 用户访问域名www.savage.com,这个时域名会被DNS(Domain Name System,域名系统)接收
  2. DNS解析这个域名,返回给客户端一个IP地址
  3. 客户端通过IP地址请求服务器
  4. 服务器根据请求的内容返回相应的HTML

DNS的工作原理

  1. 用户输入域名:用户在浏览器中输入一个域名,如www.example.com
  2. 查询本地缓存:操作系统首先会检查本地缓存中是否有这个域名的对应IP地址,如果有,直接返回该IP地址。
  3. 查询递归DNS服务器:如果本地缓存没有找到,操作系统会向配置好的递归DNS服务器(通常是ISP提供的)发起查询。
  4. 递归查询过程
    • 递归DNS服务器首先查询根DNS服务器,根DNS服务器返回负责该顶级域(如“.com”)的顶级域名服务器(TLD DNS)的地址。
    • 然后,递归DNS服务器查询TLD DNS服务器,TLD DNS服务器返回负责具体域名(如“example.com”)的权威DNS服务器的地址。
    • 最后,递归DNS服务器向权威DNS服务器查询,权威DNS服务器返回最终的IP地址。
  5. 返回结果:递归DNS服务器将IP地址返回给用户的操作系统,操作系统再将其发送给浏览器,浏览器使用这个IP地址与目标服务器建立连接。

随着用户量的增加我们的应用开始出现卡顿的情况,这时候我们需要做点什么了。

增加缓存

查询内存的时间大概是100ns,查询硬盘的速度大概是10ms,对于某些请求量大的数据我们可以把它放在内存的缓存中,这样会服务器会更快的拿到请求结果。

常见操作时间可以参考估算最佳设计 | Savage (gaoxuefeng.xyz)

Untitled

请求缓存流程

  • server向cache请求数据,如果数据获取成功则直接返回数据
  • server向cache请求数据为空,则cache向database请求数据,保存请求的数据到cache,以便下次使用

加上缓存之后我们的应用已经可以满足大部分需求了,但是随着用户量的增加,JVM、cache、database都会使用我们的服务器内存,最终会发生资源的争抢,导致系统变慢。看看我们还能做些什么!

纵向扩展和横向扩展

纵向扩展说的是提升服务器的配置,比如把内核数从8提升到16,内存从16G提升到32G,有点类似8层的楼住满人了,那就把楼加盖到16层,只不过我们这里是提升服务器的配置。

纵向扩展的好处就是简单,加钱加配置,但是缺点也很明显。

  • 服务器配置不可能无限制的增加
  • 纵向扩展不能解决但服务器没有故障转移和冗余这个问题,这一台服务器宕机会影响整个服务都变得不可用

横向扩展则更像8层的楼住满人了,那就再盖一个8层的楼,其实就是再加一台服务器。横向扩展可以更灵活的处理故障的问题,大型应用 一般是采用横向扩展,这种方案的缺点就是会增加应用的复杂度,提升运维难度。

然而在实际生成中,根据应用服务的实际情况可以综合各项因素评估一下,纵向横向一起扩展也是可以的。

下一篇总结横向扩展需要注意的问题。

《搞定系统设计》

如果觉得我的文章对您有用,赏我一包辣条吧!您的支持将鼓励我继续创作!也可以加我微信一起交流学习,折腾点有意思事情。