负载均衡简介
在网站架构中,负载均衡集群是网站架构伸缩性的主要方案。例如当并发用户压力过大时,通过在集群中增加服务器缓解并发访问压力。
LVS负载均衡
LVS是章文嵩开发的一个国产开源负载均衡软件,后来集成到Linux的内核之中,有不少开源牛人都为LVS开发过辅助工具和辅助组件,最出名的就是Alexandre为LVS编写的Keepalived,它最初专门用于监控LVS,后来加入了通过VRRP实现高可用的功能。
LVS是四层和七层的负载均衡工具,不过七层负载功能不太完善,所以大多数都是用它的四层负载功能。
LVS工作在内核的组件叫ipvs,ipvs工作在内核的Netfilter中的INPUT链上,不需要监听在套接字上,摆脱了套接字最大并发的限制,所以说LVS在四层负载并发上甩Nginx或HAproxy几条街。ipvs通过用户空间程序的ipvsadm工具来管理。该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter的关系一样。
LVS-ipvs的四种工作模式
LVS术语
在理解四种工作模式之前,先来说明下LVS的专用术语。
VS:虚拟服务器,调度器,负载均衡器
RS:真实服务器,后端服务器,上流服务器
CIP:client ip,客户IP
VIP:virtual ip,用于跟客户cip通信
DIP:director ip,调度器ip,用于跟rip通信
RIP:real server ip,真实服务器的ip,用于跟dip通信
四种模式简介:
lvs/nat,通过地址转换把客户请求的数据包发到后端,后端响应后,由VS发回给客户,这样VS承担着请求和响应的数据包,容易称为瓶颈,所以有了通过IP隧道实现的虚拟服务功能lvs/tun,和直接通过路由实现的虚拟服务功能lvs/dr,而FULL-NAT则更像是VS/NAT的扩展
LVS/NAT
客户端发送请求到达Director,Director改写请求报文的目标地址为根据负载均衡算法得出的后端服务器的RIP,RS处理完后,把响应报文响应给Director,Director把响应报文的源地址改成VIP,回复给客户端。
特性:
1.DIP和RIP必须在同一子网中,而且直接通信。
2.RS的网关必须指向Director。
3.由于请求和响应报文都经由Director,而且响应报文通常报文主体部分数据很大所以Director容易成为瓶颈。
4.Director必须是linux系统,RS可以是任意系统
5.支持端口映射
LVS/TUN
LVS/NAT模式由于请求和响应报文都需要经过Director所以在Director容易出现瓶颈,解决此问题,可以使用TUN模式,Director只处理请求报文,而响应报文通过IP隧道发送到由后端的RS返回给客户端,这样能极大解放Director,集群系统的最大吞吐量可以提高10倍。
工作原理:
IP隧道也称IP封装技术,它在原来的报文上,再添加一层网络首部,并且再RS服务器上配置tun接口的IP为VIP。
1.VS/TUN模式下,客户发送报文到VIP上,被Director接受后,Director再次报文上,增加IP隧道两端的IP地址(DIP<--->RIP),形成新的数据包,发送到后端的RS上。
2.后端的RS服务器收到后,解封报文得到原有的CIP <--> VIP,发现里面的VIP和自己的tun接口上的IP一样,所以接受。
3.响应报文不通过Director出去,而响应报文的源IP和目的IP,则为VIP --> CIP
特性:
1.VIP,DIP,RIP都应该是公网地址
2.RS的网关不能设置为Director
3.Real server的tun接口需要配置VIP。
4.通过隧道传输时,隧道外层的报文源地址是DIP,目的地址是RIP,而RS响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP。这样客户端就无法区分这个VIP到底是director的还是服务器组中的。
一般来说,VS/TUN模式会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同网络环境,可以就近返回数据给客户端。在请求对象不能在Cache服务器本地命中的情况下,Cache服务器要向源服务器发请求,将结果取回,最后将结果返回给客户。
LVS/DR
简介:
VS/DR模式跟VS/TUN类型,对于客户端发来的数据包网络层数据不做任何修改,而是修改链路层数据,把源MAC修改为DIP的网卡MAC,把目标MAC修改为后端用负载算法计算出来的RIP网卡MAC,由于使用MAC直接通信,所以DIP跟RIP必须在同一子网内。
在RS上,也需要在lo接口上配置VIP,响应报文在lo接口上发给跟网关通信的网卡上出去。
特点:
1.确保前端路由器将目标IP为VIP的请求报文发往Director,所以在RS上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
2.RS跟Director Server必须在同一个物理网络中
3.RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
4.RS的网关不能指向Director
FULL-NAT
双向转换。这个模式是NAT的扩展,更像一个反代模型,对于客户的请求报文,Director把源地址改为DIP,目的地址改问RIP;在RS响应时,响应报文直接响应给Director,然后Director修改报文的源地址为VIP,目的地址为CIP,这种模式并不依赖拓扑,RS也不需要把网关指向Director。因为RS认为请求是Director发出的。
负载均衡算法
Director如何选择后端服务呢,依靠的是负载均衡算法来实现。
LVS的负载均衡算法有两种类型:静态和动态。
静态算法讲求起点公平,即它不管后端负载情况,直接根据算法计算后,轮到谁就调度给谁。举个简单例子,如开始有1000个请求,RS1和RS2各分担了500个,下个请求到来前,RS1已经把490请求完成了,并且断开了,剩10个连接,而RS2连接数还有490,才断开了10个,如果说根据算法,下个请求应该轮到RS2了,那么该请求还是调度到RS2上。
动态算法讲求结果公平,它根据后端服务器的负载压力,把请求调度到负载压力低的服务器上。负载均衡算法考虑服务器的实时负载和响应情况,不断调整服务器间处理请求的比例,来避免有些服务器超载时依然收到大量请求,从而提高整个系统的吞吐率
静态算法调度
RR:(Round Robin Scheduling)轮询,简单来说,就是轮流调度
WRR:(Weighted Round Robin Scheduling)加权轮询,举个例子,有2台RS,比例2:3,即第一台RS会被调度2次,第二台被调度3次。
SH:(Source Hashing Scheduling)源地址哈希,在一定时间内,只要是来自同一个客户端的请求,就发送至同一个RS;实现方法:在一块内存地址种,对IP进行哈希计算,以键值保存在内存中,而键值对应的值则是RS服务器。
DH:(Desitnation Hashing scheduling)目的地址哈希,通常用于正向代理集群中,对于访问同一IP的请求,发送到同一RS上。
动态反馈调度
主要根据每RS当前的负载状态及调度算法进行调度,算法有个指标叫overhead。越少即负载越低。
LC:least connections 最少连接
公式:Overhead=activeconns*256+inactiveconns
调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某服务器,其连接数加1;当连接中止或超时,其连接数减1。当各个服务器的处理能力不同时,该算法不理想。
WLC:Weighted LC 加权最少连接
公式:Overhead=(activeconns*256+inactiveconns)/weight
具有较高权重的服务器将承受较大比例的连接请求
SED:Shortest Expection Delay 最短的延迟的预期
公式:Overhead=(activeconns+1)*256/weight
不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权重过大的时候,会导致空闲服务器一直处于无连接状态。
NQ:Never Queue
如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。
LBLC:Locality-Based Least Connections Scheduling 基于本地的最少连接
将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。 主要用于Cache集群
LBLCR:Locality-Based Least Connections with Replication Scheduling,lblcr 带复制的基于局部性最少连接
对于已绑定的客户,忽略绑定,至于缓存,通过缓存项复制 主要用于Cache集群