1. 负载均衡概述
负载均衡的基本思路是:在一个服务器集群中尽可能的平衡负载量。通常的做法是在服务器前端设置一个负载均衡器(一般是专门的硬件设备)。然后负载均衡器将请求的连接路由到最空闲的可用服务器。下图显示了一个典型的大型网站负载均衡设置,其中一个负载均衡器用于HTTP流量,另一个用于MySQL访问。
负载均衡有5个常见的目的。
(1)可扩展性:负载均衡对于某些扩展策略有所帮助,例如读写分离时从备库读数据。
(2)高效性:负载均衡有助于更有效的使用资源,因为它能够控制请求被路由到何处。
(3)可用性:一个灵活的负载均衡解决方案能够使用时刻保持可用的服务器。
(4)透明性:客户端无须知道是否存在负载均衡设置,也不需要关心在负载均衡器的背后有多少机器,名字是什么。负载均衡器给客户端看到的只是一个虚拟的服务器。
(5)一致性:如果应用是有状态的(数据库事务、网站会话等),那么负载均衡器就应将相关的查询指向同一个服务器,以防止数据丢失。应用无须去跟踪到底连接哪一个服务器。
2. 四层/七层负载均衡
服务器负载均衡,顾名思义就是对一组服务器提供负载均衡业务。这一组服务器一般来说都处于同一个局域网络内,并同时对外提供一组(或多组)相同(或相似)的服务。服务器负载均衡是数据中心最常见的组网模型。
服务器负载均衡分为四层(L4)服务器负载均衡和七层(L7)服务器负载均衡两种:
- L4服务器负载均衡支持IPv4协议和IPv6协议,是基于流的服务器负载均衡,对报文进行逐流分发,将同一条流的报文分发给同一个服务器。L4服务器负载均衡对基于HTTP的7层业务无法做到按内容进行分发,限制了负载均衡业务的适用范围。依据转发方式,L4服务器负载均衡分为NAT方式和DR方式。
- L7服务器负载均衡只支持IPv4协议,是基于内容的服务器负载均衡,对报文的承载内容进行深度解析,包括HTTP协议、RTSP协议等,根据其中的内容进行逐包分发,按既定策略将连接导向指定的服务器,实现了业务使用范围更广泛的服务器负载均衡。L7服务器负载均衡仅支持NAT方式。
2.1 NAT方式L4服务器负载均衡
NAT方式L4服务器负载均衡的组网灵活,后端服务器可以位于不同的物理位置,不同的局域网内。NAT方式下,LB设备分发服务请求时,进行目的IP地址转换(目的IP地址为实服务的IP),通过路由将报文转发给各个实服务。NAT方式L4服务器负载均衡的典型组网如图所示。
NAT方式L4服务器负载均衡包括以下几个基本元素:
- LB Device:负责分发各种服务请求到多个Server的设备。
- Server:负责响应和处理各种服务请求的服务器。
- VSIP:对外提供的虚拟IP,供用户请求服务时使用。
- Server IP:服务器的IP地址,供LB Device分发服务请求时使用。
(1) 实现原理
客户端将到VSIP的请求发送给服务器群前端的负载均衡设备,负载均衡设备上的虚服务接收客户端请求,依次根据持续性功能、ACL策略、调度算法,选择真实的服务器,再通过网络地址转换,用真实服务器地址重写请求报文的目标地址后,将请求发送给选定的真实服务器;真实服务器的响应报文通过负载均衡设备时,报文的源地址被还原为虚服务的VSIP,再返回给客户端,完成整个负载调度过程。
(2) 工作流程
NAT方式L4服务器负载均衡的工作流程图如图所示。
流程简述如下:
步骤 | 说明 | 备注 |
(1) | Host发送服务请求报文 | 源IP为Host IP、目的IP为VSIP |
(2) | LB Device接收到请求报文后,借助持续性功能或调度算法计算出应该将请求分发给哪台Server | - |
(3) | LB Device使用DNAT技术分发报文 | 源IP为Host IP、目的IP为Server IP |
(4) | Server接收并处理请求报文,返回响应报文 | 源IP为Server IP、目的IP为Host IP |
(5) | LB Device接收响应报文,转换源IP后转发 | 源IP为VSIP、目的IP为Host IP |
从以上一系列的说明可以看出——在负载均衡时使用网络地址转换技术,NAT方式因此而得名。
(3) 技术特点
组网灵活,对服务器没有额外要求,不需要修改服务器配置,适用于各种组网。
2.2 DR方式L4服务器负载均衡
相对于NAT方式,DR方式L4服务器负载均衡中只有客户端的请求报文通过LB,服务器的响应报文不经过LB,从而减少了LB的负载,有效的避免了LB成为网络瓶颈。DR方式下,LB设备分发服务请求时,不改变目的IP地址,而将报文的目的MAC替换为实服务的MAC后直接把报文转发给实服务。DR方式L4服务器负载均衡的典型组网如图所示。
DR方式L4服务器负载均衡包括以下几个基本元素:
- LB Device:负责分发各种服务请求到多个Server的设备。
- Server:负责响应和处理各种服务请求的服务器。
- VSIP:对外提供的虚拟IP,供用户请求服务时使用。
- Server IP:服务器的IP地址,供LB Device分发服务请求时使用。
(1) 实现原理
DR方式L4服务器负载均衡时,除了LB设备上配置了VSIP,真实服务器也都配置了VSIP,配置的VSIP要求不能响应ARP请求,例如在环回接口上配置VSIP。实服务除了VSIP,还需要配置一个真实IP,用于和LB通信,LB设备和真实服务器在同一个链路域内。发送给VSIP的报文,由LB分发给相应的真实服务器,从真实服务器返回给客户端的报文直接通过交换机返回。
(2) 工作流程
DR方式L4服务器负载均衡的工作流程图如图所示。
流程简述如下:
步骤 | 说明 | 备注 |
(1) | Host发送服务请求报文 | 源IP为Host IP、目的IP为VSIP |
(2) | General Device收到请求后转发给LB Device | Server上的VSIP不会响应ARP请求 |
(3) | LB Device接收到请求报文后,借助持续性功能或调度算法计算出应该将请求分发给哪台Server | - |
(4) | LB Device分发报文 | 源IP为Host IP,目的IP为VSIP,目的MAC为Server的MAC地址 |
(5) | Server接收并处理请求报文,返回响应报文 | 源IP为VSIP、目的IP为Host IP |
(6) | General Device收到响应报文后,直接将报文转发给Host | - |
从以上一系列的说明可以看出——负载均衡设备没有采用传统的转发方式(查找路由表)来分发请求报文,而是通过修改目的MAC直接路由给服务器,DR方式也因此而得名。
(3) 技术特点
只有单边报文经过负载均衡设备,负载均衡设备负担小,不易成为瓶颈,转发性能更强。
2.3 L7服务器负载均衡
L7服务器负载均衡的典型组网如图所示。
L7服务器负载均衡包括以下几个基本元素:
- LB Device:负责分发各种服务请求到多个Server的设备。
- Server:负责响应和处理各种服务请求的服务器。
- Service group:实服务组是一个逻辑概念,是指依据多个服务器的一些公共属性,将服务器划分成不同的组。例如:可以按照不同的功用划分为静态资料存储服务器组和动态交换服务器组;还可以按照不同的内容划分为歌曲服务器组、视频服务器组或图片服务器组等。
- VSIP:对外提供的虚拟IP,供用户请求服务时使用。
- Server IP:服务器的IP地址,供LB Device分发服务请求时使用。
(1) 实现原理
客户端首先与服务器群前端的负载均衡设备建立TCP连接,然后将到VSIP的请求发送给负载均衡设备。负载均衡设备上的虚服务接收客户端请求,依次根据持续性功能、实服务组匹配策略、调度算法,选择真实的服务器。然后,负载均衡设备先用客户端地址与真实服务器建立TCP连接,再用真实服务器地址重写客户端请求报文的目标地址,并将请求发送给真实服务器。真实服务器的响应报文通过负载均衡设备时,报文的源地址被还原为虚服务的VSIP,再返回给客户端,完成整个负载调度过程。
(2) 工作流程
L7服务器负载均衡的工作流程图如图所示。
流程简述如下:
步骤 | 说明 | 备注 |
(1)~(3) | Host发起TCP连接请求,与LB Device建立TCP连接 | TCP连接请求的源IP为Host IP、目的IP为VSIP |
(4) | Host发送服务请求报文 | 源IP为Host IP、目的IP为VSIP |
(5) | LB Device收到请求后,根据匹配策略为该请求选择一个合适的实服务组,再借助调度算法计算出应该将请求分发给该实服务组中的哪台Server,并缓存该请求报文 | - |
(6) | LB device向Server发SYN报文,序列号为Host的SYN报文序列号 | 源IP为Host IP、目的IP为Server IP |
(7) | Server发送SYN ACK报文 | 源IP为Server IP、目的IP为Host IP |
(8) | LB device接收Server的SYN ACK报文后,回应ACK报文 | 源IP为Host IP、目的IP为Server IP |
(9) | 修改步骤(5)中缓存的请求报文的目的IP和TCP序列号,然后发给Server | 源IP为Host IP、目的IP为Server IP |
(10) | Server发送响应报文到LB device | 源IP为Server IP、目的IP为Host IP |
(11) | LB device修改响应报文的源地址和TCP序列号后转发给Host | 源IP为VSIP、目的IP为Host IP |
(3) 技术特点
对报文进行深度解析获取报文载荷中携带的信息,实现按内容进行分发,拓宽了负载均衡业务的适用范围。适用于不同的服务器提供不同功能的组网。
3. LVS
基于LVS的服务器集群主要由两部分组成,即负载调度器(Load Balancer,简称LB)和真正提供服务的服务器(Real Server,简称RS)。RS对外是不可见的,用户需要通过访问LB来获得服务,所以LB也称为虚拟服务器(Virtual Server),它对外公开的IP称为VIP(Virtual IP)。
LB接收到用户的请求后,会根据设置的转发模式和负载均衡调度算法将请求转发给RS,RS再将结果返回给LB或用户(返回给谁跟转发模式有关)。
3.1 转发模式
LVS的转发模式主要有三种:网络地址转换(NAT,Network Address Translation)、IP隧道(TUN,IP Tunneling)和直接路由(DR,Direct Routing)。
NAT模式
网络地址转换技术应该都不陌生,就是将一个IP地址转换为另一个IP地址的技术。通常当一个内部网络中的主要要访问Internet或被Internet访问时,就需要采用NAT技术,将内部地址(10.0.0.0/255.0.0.0、172.16.0.0/255.240.0.0、192.168.0.0/255.255.0.0)转化为在Internet上可用的外部地址。
下面是LVS采用NAT模式的部署图:
假设一个IP为200.200.200.2的用户来访问我们的虚拟服务器,VIP为200.200.200.1。集群使用的内部IP是10.10.10.0网段。那么请求和响应的过程可以用下图表示:
DR模式
NAT模式中,请求和响应的数据包都需要通过LB,当RS的数目过多时,LB可能成为整个集群的新瓶颈。因为大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即LB只负责调度请求而响应直接返回给客户,将极大地提高整个集群的吞吐量。
DR模式的部署图
DR模式有几点和NAT不同:
1. 不仅LB上配置了VIP,RS上也都配置了VIP
2. LB和RS都只需要一个真实网卡,LB的VIP配置在eth0:0上,RS的VIP配置在lo:0上
3. LB和RS上真实网卡的IP都需要是公网IP
4. LB不需要开启路由转发功能
5. 响应报文不经过LB
当用户通过VIP访问集群时,LB会收到这个请求,再按照设置的调度算法选择一个RS,并在一个hash表中存储这次连接。然后将请求报文的目的MAC地址改为所选择的RS的MAC并转发给它。RS收到请求后,发现报文的目的IP为VIP,而自己的lo:0上配置了这个IP,RS就处理这个请求并将响应报文直接发送给用户。当该用户再次发送请求时,LB就根据hash表找到对应的RS,并再次将请求转发给它。
TUN模式
IP隧道技术是将一个IP数据报封装成另一个IP数据报的技术,使得被封装的数据报可以被转发到另一个IP地址。
TUN模式与DR模式基本相同。不同的是:
1. TUN模式中,LB和RS必须支持“IP Tunneling”或者“IP Encapsulation”协议
2. LB和RS的VIP配置在tunl0虚拟网卡上
3. LB将请求报文封装成一个新的IP报文,新的IP包的目的IP是某一RS的IP,然后转发给RS,RS收到报文后解封装,取出用户的请求报文,发现目的IP是VIP,而自己的tunl0网卡上配置了这个IP,从而处理请求并将结果直接发送给客户。DR模式中LB修改的是目的MAC
4. LB与真实服务器不必在同一网段,只要路由可达即可。如果不再同一网段,不会存在arp问题
3.2 调度策略
现在LVS已实现了10种调度策略(man ipvsadm可以查看)。
(1)轮询调度(Round Robin,rr)
调度器通过“轮询”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
(2)加权轮询(Weighted Round Robin,wrr)
调度器通过“加权轮询”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
(3)最少链接(Least Connections,lc)
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
(4)加权最少链接(Weighted Least Connections,wlc)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
(5)基于局部性的最少链接(Locality-Based Least Connections,lblc)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。
(6)带复制的基于局部性最少链接(Locality-Based Least Connections with Replication,lblcr)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
(7)目标地址散列(Destination Hashing,dh)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
(8)源地址散列(Source Hashing,sh)
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
(9)最短的期望的延迟(Shortest Expected Delay Scheduling SED,sed)
基于wlc算法。这个必须举例来说了
ABC三台机器分别权重123,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根据运算结果,把连接交给C。
(10)最少队列调度(Never Queue Scheduling,nq)
如果有台real server的连接数=0就直接分配过去,不需要在进行sed运算
参考文献:
1. 《高性能MySQL》第11章 可扩展的MySQL
2. 《负载均衡技术白皮书》杭州华三通信技术有限公司
http://www.h3c.com.cn/Products___Technology/Technology/Dependability/Other_technology/Technology_book/200906/637219_30003_0.htm