LVS基本原理
简介
负载调度器、真实服务器群节点一起被称为LVS。LVS负载调度器(有时也称为负载平衡器),接收所服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求。
1)负载调度器(Director):作为整个集群的前端,主要将用户请求分发至真实服务器中进行处理。
2)真实服务器池:由多个功能相同的真实服务器组成,为用户提供真正的网络服务,如Web服务、邮件服务等。且虚拟服务器集群作为一个可伸缩的集群,可自由添加或删除真实服务器而并不影响整个集群的正常工作。
3)共享存储:作用就是让每一个用户访问的资源都是一样的。服务器支持写操作,才建议使用。
一、LVS集群架构
用户(CIP,源IP)通过层层路由的Internet网络与负载均衡器(VIP,服务客户端的IP)联系,负载均衡器通过(DIP,与后端通信的IP)经过交换机(局域网)或路由器(Internet)连接。
在数据的传递过程中,发向真实服务器的入站数据先到达VIP,经过负载均衡器及到达DIP,最后到达真实服务器的RIP。
二、LVS在内核中的过程
1、当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2、PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3、IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
4、POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
三、lvs的组成
lvs有两段代码组成,ipvsadm和ipvs
ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。
四、lvs集群的类型
在LVS集群中,集群作为一个整体,通常使用负载均衡器(Director)作为 与外部通讯的中介,因此把如何将数据从外部请求经由负载均衡器转发至内部真实服务器的方式作为对LVS集群分类的依据。目前LVS数据转发主要有三种方式:网络地址转换(LVS-NAT),直接路由(LVS-DR)和IP隧道(LVS-TUN)。即使在一个负载均衡器上可以实现多种转发方法,一般在实际的使用中我们只选择其中一种转发方式。
在实除的集群部署中,我们发现与LVS配合使用的最佳的转发方法是LVS-DR,而其中最容易构建的方式是LVS-NAT。然而一般情况下,在使用LVS集群处理关键的数据转发时,我们不会用到LVS-TUN,因为LVS-TUN的转发方法允许真实服务器和负载均衡器在不同的物理网段中,这使得只要断开了负载均衡器和真实服务器之间的连接,客户端计算机发出的请求兢会丢失,从而增加整个集群发生崩溃的可能性。
1)直接路由(LVS-DR)
①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
③、IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
④、由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
⑤、RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
⑥、响应报文最终送达至客户端
特点:多了一个mac地址,作用是让rs可以找到客户端,直接发送响应报文,并且整个过程的客户端ip(cip)和负载均衡器的ip都没有改变,只是mac地址变了,目的是让客户知道,你发送请求的报文,和响应你报文的是一个人。
2)网络地址转换(LVS-NAT)
①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
③、IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ④、POSTROUTING链通过选路,将数据包发送给Real Server
⑤、Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
⑥、Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
3)IP隧道(LVS-TUN)
①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
③、IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP ④、POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
⑤、RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
⑥、响应报文最终送达至客户端
三种类型比较
五、LVS的调度方法
在讨论了将数据包转发给集群内部的节点的王种方式后,来看一下如何在集群节点么间分配工作负荷。当有用户访问负载均衡器上的VIP请求集群服务时,负载均衡器需要从真实服务器池中选择一台真实服务器为其提供服务。负载均衡器可用于作出该决定的调度方法分成两个基本的类别;静态调度和动态调度。
静态:仅根据调度算法本身,不考虑背后服务器的负载
(1)rr:round robin,轮流,轮询
调度器通过“轮询”的调度算法,按照顺序将请求分配到后端的真实服务器上,无论后端服务器的负载状态如何,都会平均“轮询”调度。
(2)WRR:weightd round robin,带权重的轮序
指的是能者多劳,服务器性能强的,就会分配的比较多。所以根据后端真实服务器的性能来进行调度,根据后端真实服务器负载情况,修改权重值来实现动态的调度
(3)sh:source hashing 源地址hash
源地址与挑选地址绑定,将来自于同一个源IP的请求将始终被定向至同一个RS,这个目的是为了session持久功能,仅实现session的绑定.
(4)dh:destination hashing,目标地址hash,主要用于实现当你的内部主机上有多个防火墙出口时有用。 (仅作了解)
动态:根据算法及各RS当前的负载状况进行调度
(1)lc:least connection,最少连接,通过监控后端RS的连接数,根据TCP协议中的某些计数器来判断。将请求调度到已建立的连接数最少后端的真实服务器上。
计算方法:Overhead=Active*256+Inactive,Overhead越小,表示负载越低
(2)wlc:weight lc,加权的lc
计算方法:Overhead=(Active*256+Inactive)/weight
(3)sed:shortest expertion delay最短期望延迟
Overhead = (ACTIVE+1)*256/加权,数目最小的,接受下次请求
(4)nq:Never Queue,永不排队
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。
(5)lblc:Locality-Based Least connection基于本地的最小连接
该算法根据请求的目标IP地址找出该目标IP地址最近使用的Real Server,若该服务器是可用的且没有超载,就会使用“最少链接”来挑选一台可用的服务器,将请求发送到该服务器
(6)lblcr:Replicated lblc带复制功能的lblc,是dh算法的一种改进
该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器?同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
转载:linux运维部落