在生产环境中,负载均衡的实现方式有多种,常见的集中方式有:DNS方式、专业负载均衡设备(硬件)、众多的负载均衡软件,如nginx、lvs、haproxy等..
三种实现的方式相比较的话,使用负载均衡软件实现是最常用的,优点配置简单、灵活、扩展性强。
软件的实现方式又可以按工作层进行划分,有的是软件是工作在四层(传输层),而有的软件是工作在七层(应用层)
工作层/ | 优点 | 缺点 |
传输层/四层 |
通用、灵活、效率高、 无套接字限制 |
不能识别应用层报文 |
应用层/七层 | 精确、根据报文的内容进行分发 | 受限于随机套接字限制 |
介绍一下lvs
lvs由中国的章文嵩博士研发,全称Linux Virtual Server;
lvs是工作在四层上的负载均衡软件;内置多种调度算法,可以工作在不同的模式上;
lvs由VS(Virtula server)和RS(real server)组成,VS也可以称为Director,负责调度后端的RS;
lvs是由内核中的netfilter实现对报文的控制的,类似于iptables的工作原理;
通过下图了解netfilter的工作机制:
netfilter是内核系统中的Linux防火墙,提供了一套hook函数的管理机制:
iptables是用户空间的管理工具;
netfilter是内核空间上的框架;
再看一下lvs和工作机制:
LVS是基于netfilter框架,工作在INPUT链上,在INPUT上注册ip_vs_in HOOK函数,进行IPVS主流程,大概原理如下图:
bo
用户发起的请求报文通过层层路由后到达LVS主机的网卡上,进入内核网络层,进入PREROUTING后经路由查找,确定访问的目的IP为本机IP地址,所有数据包进入INPUT链上。
IPVS 是工作在INPUT链上,会根据访问的ip+port判断报文是否输入IPVS定义的服务,如果是IPVS负责分发的服务则根据调度算法选择一台后端RS服务器,修改报文的IP或MAC或PROT后发送至POSTROUTING链上,转发至RS服务器上;
CIP:客户端的IP
VIP:lvs主机负责接收客户端请求的IP
DIP:lvs主机负责与后端RS服务器通信的IP
RIP:RS服务器与lvs主机通信的IP
NAT模式实现原理
用户发出请求数据包经过层层网络,此时数据包源IP是CIP,目的IP是VIP,到达lvs主机;
lvs接收,检查数据包是否为ipvs的集群服务,如果是,将数据包的目标IP修改为RS服务器中其中一台的RIP(根据调度算法选择RS),然后发往后端RS,此时数据包源IP为CIP,目标IP为RIP;
到达RS服务器的数据包经过检查确认,确认后生成响应数据包,因为RS的默认网关设置为lvs服务器的DIP,所以发回给lvs服务器(VS端),发出的数据包源IP为RIP,目标IP为CIP;
lvs接收到RS的响应数据包后,将数据包的源IP修改为VIP后发送至客户端,此时数据包源IP是VIP,目的IP是CIP;这样就完成了一次请求和响应的交互;
lvs-nat模式是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑选出的RS的RIP和PORT实现转发;
要点:1.RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP; 2.请求报文和响应报文都必须由Director转发;Director易于称为系统瓶颈; 3.支持端口映射,可修改请求报文的目标PORT; 4.vs必须是Linux系统,rs可以是任意系统;
DR模式实现原理
lvs-DR:
1.客户端发起请求报文,数据包经过互联网中的层层路由到达lvs服务器的网关路由器,网关路由经过交换机到达lvs服务器所在的局域网内,数据包内源IP是客户端的CIP,目标IP是LVS对外的VIP,此时源MAC地址是CMAC,其实是连接LVS的路由器或交换机的MAC地址( 为了容易理解记为CMAC),目标MAC地址是VIP对应的MAC,记为VMAC;
2.lvs接收数据包后判断是否为IPVS服务的集群服务,如果是,根据调度算法选择一台RS,然后将目标MAC地址修改为选择的RS的MAC地址,记为RMAC,源MAC修改为LVS和RS同网段通信对应的MAC地址,记为DMAC,然后通过交换机发送给RS;
3.请求数据包到达RealServer后,链路层检查目的MAC地址是自己网卡的地址,到网络层,检查到目的IP是VIP地址(lo上配置了VIP),判断是自己的数据包,开始响应,发出响应报文,源IP为VIP,目的IP为CIP,源MAC是ReadServer的RMAC,目标MAC是下一跳(路由器)的MAC地址,记为CMAC(方便理解),然后数据包通过路由器转发至网络到客户端;
小总结:
DR模式是通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
VS和RS都要配置使用VIP;
1.确保前端路由器将目标IP为VIP的请求报文发送Director;三种方式
a.在前端网关做静态绑定;
b.在RS上使用arptables;
c.在RS上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
2.RS的RIP可以使用私网地址,也可以是公网地址;RIP和DIP在同一IP网络;RIP的网关不能指向DIP;确保响应报文不会经由Director;
3.RS跟Director要在同一个物理网络;
4.不支持端口映射;
LVS-Tunnel模式
1.用户请求数据包经过层层网络到达lvs网卡,此时数据包源IP是CIP,目的IP是VIP;
2.lvs判断是否为IPVS服务的集群,如果是则根据算法选择一台RS,然后在数据包上额外增加一个Tunnel头部,Tunnel头部的源IP为DIP,目标IP为RIP,经过层层路由发送至RS所属的网络中;
3.后端RS服务器接收到数据包后,ipip模块将Tunnel头部拆除,正常看到源IP是CIP,目标IP为VIP,由于所有RealServer的tunl0上都配置了VIP,则RS判断为本机IP数据包,应用层生成响应数据包发送给客户端,发出的数据包源IP为VIP,目标IP为CIP;
lvs-tun
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再额外封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP);
1.DIP,VIP,RIP都应该是公网地址;
2.RS的网关不能,也不可能指向DIP;
3.请求报文要经由Diretor,但响应不能经由Director;
4.不支持端口映射;
5.RS的OS得支持隧道功能;
LVS-FULLNAT模式
总结:
lvs-nat,lvs-fullnat:请求和响应报文都要经由Director;
lvs-nat:RIP的网关的要指向DIP;
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信;
lvs-dr,lvs-tun:
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发;
lvs-tunnel:通过在原IP报文额外封装新的IP首部实现转发,支持远距离通信;