如何搞定高并发系统设计? - 博创网

博创网 首页 > 科技

如何搞定高并发系统设计?

2019-08-31 20:33 CSDN

作者 | 菜菜

责编| 郭芮

YY妹:菜菜哥,上次你给我讲的分库分表策略对我帮助很大。

菜菜:有帮助就好,上次请我的咖啡也很好喝。

YY妹:不过随着访问量的不断加大,网站我又加了Nginx做负载均衡。

菜菜:哇哦,看来要进阶高级工程师啦。

YY妹:负载均衡也很简单吧,一个Nginx就搞定了!现在可以说我精通负载均衡了吧:)

菜菜:其实负载均衡的内容还有很多......

一个系统发展初期,往往都是单机系统。应用和数据库在一台服务器上,随着业务的发展,访问量的增大,一台服务器性能就会出现天花板,往往已经难以支撑业务量了。这个时候就要考虑把数据库和应用服务器分开,访问继续增加,就会考虑数据库分库分表,应用服务器做负载均衡,其实这也属于分布式系统的一个范畴。

分布式系统的核心概念就是一个“分”字,一台服务器支撑不住,那就两台,三台,四台......当然分之后会带来其他问题,比如最常见的数据一致性问题、调用链监控等问题,不过限于篇幅,这些不在今日的讨论范围内。

很多项目做“分布式”部署提高系统性能,首期采用的往往是负载均衡策略。

负载均衡

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

负载均衡既然属于“分”策略的一种表现形式,就会涉及到任务的分配者,任务执行者,分配算法。这里的任务分配者就是我们常说的负载均衡器,任务执行者就是处理任务的服务器,分配算法就是常说的轮训等分配策略。这里把任务的分配者叫做负载均衡器其实是不正确的,负载均衡器这个概念注重的更多是均匀分配任务,让每个任务的计算单元的任务量达到均衡状态,而现实中任务的分配更多是出于每个计算单元的性能或者业务来考虑。让每个计算单元处理几乎相同数量的任务只是分布式均衡器其中的一部分内容。

以HTTP请求为例,在一个HTTP请求的过程中,其实会遇到有很多负载均衡的过程,一个系统在什么阶段做负载均衡取决于它的请求量,这和常说的QPS/TPS/DAU等有直接关系。假设系统的请求量非常少,其实完全没有必要做负载均衡,当然有时候为了达到高可用的目的也做负载均衡。

那一个HTTP请求到底可以经过哪些负载均衡器呢?其请求过程如下图所示:

DNS负载均衡

当一个client向一个url发起请求(这里不考虑直接请求IP地址的情况),第一步需要做的就是请求DNS服务器去做域名解析,把请求的域名转换成IP地址。DNS解析同一个域名可以根据来源返回不同的IP地址,利用这个特性可以做DNS负载均衡。client请求离自己最近的资源才是最快的,所以可以把系统部署在不同区域的机房,每个client经过DNS解析只请求离自己最近的机房资源,比请求异地的机房资源要快的多。

例如:一个网站可以同时部署在北京机房和深圳机房,河北的用户请求网站的时候都会被导向北京机房,比访问深圳的速度要快的多。

DNS负载均衡仅限于解析域名的时机,所以它的力度是很粗的,相应的负载均衡算法也有限。但是这种方案实现起来比较简单,成本也很低,而且在一定程度了缩短了用户的响应时间,加快了访问速度。由于DNS信息都有很长时间的缓存,所以更新的时候会有一段时间的信息差异,会导致部分用户正常业务的访问的错误。

硬件负载均衡

当一个请求知道了要访问的目标IP,便会通过层层的网关和路由器到达目标IP的机房,在这之前属于网络传输的范畴,一般很难进行干预。



上海快三 上海快三 上海快三 上海快3 上海快3 上海快三 上海快3 上海快三 上海快3 上海快3