一、负载均衡架构演进
一台标准化的服务器所能承受的并发量是有限的。在业务发展初期,单台服务器即可满足业务要求,但是随着业务的发展,用户群体越来越大,服务所承受的并发量也会越来越来大,当超过单台服务器所承受的并发极限时,如何解决大并发量问题?目前业界通用的解决方案是用多台服务器处理,即集群技术。
如何将流量均衡分布到集群?本文将介绍从一百个并发到亿级并发情况下如何将流量负载到服务器集群方案演进。
1.1 单机处理流程及并发极限计算
1.1.1 单机处理流程
在业务初期,用户量和服务访问量都很低,在不考虑容灾的情况下,一台服务器即可满足业务场景需要。搭建一台单机服务器,我们需要定义一个域名,在DNS服务器配置域名和服务器IP的映射关系,并在服务器上部署应用程序。
当用户通过访问域名请求服务时,首先会请求DNS服务器,得到域名对应的服务器ip,然后通过ip地址找到后端应用服务器,经后端服务器处理,后端服务器将请求结果返回给用户。
单机架构处理流程
1.1.2 单机并发量计算
并发数定义:1s种处理的请求数。
场景定义:假如服务的处理时间为30ms,其中CPU处理时间10ms,IO等待时间为20ms,采用4核8G服务器。
在上述场景中,最佳线程数为12。
对于大于7.X版本的tomcat(支持NIO),当线程数为12时,此时的并发量最大,因为此时CPU没有因为等待io导致空闲,也没有不合理的线程切换导致的CPU损耗。
假设忽略线程切换导致的cpu开销,1s内单核可处理个请求,4核8G服务器可支持400并发量请求。
1.2 nginx负载均衡
当服务并发量超过400时,单台服务器已无法满足需求,此时需要多台服务器进行处理。如何将流量分发到多台服务器?此时需要用到负载均衡组件。这里nginx负载均衡组件。
1.2.1 niginx负载均衡处理流程
当用户请求后端服务时,请求首先会到达nginx服务器,nginx服务器将请求分发到后端服务器,后端处理完后将数据返回给nginx服务器,nginx服务器将结果数据返回给用户。
nginx负载均衡处理流程
1.2.2 nginx原理
nginx是一个七层负载均衡组件,nginx由一个master进程和多个worker进程构成,主线程用于创建和管理work进程的功能。当work进程创建监听socket以后,会fork对个子进程,子进程可对nginx服务器的请求进行监听。
work进程接受到nginx请求后,根据特定负载均衡策略,选择目标服务器,将请求转发到目标服务器进行处理,目标服务器处理完后,将结果返回至work进程,然后由work进程将结果返回给用户。
nginx采用的是epllo多路复用模型(NIO模型),nginx几乎不处理业务相关的逻辑,仅仅只做请求的转发。所以cpu处理时间极短,这也是nginx可支持高并发的根本原因。假设处理时间为0.1ms,对于一个4核8G的机器来说,1s内可处理的请求数为4W。
1.3 LVS负载均衡
LVS是工作两层到四层的负载均衡器,由章文嵩博士发明,是国内最早出现的自由软件项目之一。
1.3.1 LVS负载均衡架构处理流程
当请求进入LVS服务器时,在传输层(四层)或数据链路层(两层),将报文的ip地址或mac地址更改位目标服务器的IP地址或mac地址,请求处理完后,将结果返回给用户。
1.3.2 LVS负载均衡原理
NAT模式(网络地址转换)
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。
优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
DR模式(直接路由模式)
原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上
TUN模式(IP隧道模式)
原理:首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
LVS在数据链路层(二层)进行传输层(四层)进行负载均衡,相比于nginx在应用层(七层)的负载均衡,少了拆包逻辑和序列化操作,并且没有业务逻辑,所以CPU占用很低。此外LVS负载均衡不用建立连接,不用创建socket资源,,不用创建用户态进程和线程,仅仅对请求进行转发,所以内存占用基地。
LVS的瓶颈主要在CPU软中断,网卡性能和ipvs内核模块的限制。一台普通机器部署LVS可抗住20w左右的并发。
1.4 硬件负载均衡
硬件负载均衡是通过专门的负载均衡设备,对流量进行分发,目前应用比较广泛的有F5负载均衡器。
处理流程如下:
1、客户发出服务请求到VIP
2、BIGIP接收到请求,将数据包中目的IP地址改为选中的后台服务器IP地址,然后将数据包发出到后台选定的服务器
3、后台服务器收到后,将应答包按照其路由发回到BIGIP
4、BIGIP收到应答包后将其中的源地址改回成VIP的地址,发回客户端,由此就完成了一个标准的服务器负载平衡的流程。
相比于普通计算机,硬件负载均衡设备做了很多定制化处理,使其能承受更大的并发量。但是价格也比较昂贵,目前一台F5负载均衡器报价30W左右。
1.5 DNS轮询负载均衡
当有亿级并发,已超越单台硬件负载均衡极限时,此时可以采用多机房部署,一个域名申请多个公网ip,每个ip对应一个机房。