sapliang 2019-10-25
LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩(花名 正明)
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
VS:Virtual Server 虚拟的服务器
RS:Real Server(lvs) 真正提供服务的服务器
CIP:Client IP 客户端的IP
VIP: Virtual serve IP LVS服务器针对互联网的客户端设置的IP,是虚拟IP
DIP: Director IP 局域网内LVS服务器设置的IP
RIP: Real server IP 真实服务器的IP
LVS服务器,客户端访问流程图
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
如上图所示,客户端通过路由去访问LVS对外开放的VIP,当LVS收到请求报文时,会将其拦截下来,通过自身的DIP将请求报文传给其中的一台RS服务器(DIP和RIP需要在同一个局域网,同一个网段)。RS服务器收到请求报文后,发送响应报文通过LVS服务器发送给客户端(相当于怎么来的就怎么回去)。在用户访问的过程中,LVS服务器实际上是对VIP进行了地址转换,转换成了正式服务器的IP,从而实现互相通讯。
NAT模式IP包调度过程
NAT模式内部的工作原理图
LVS服务器之所以能实现将发送给自己的数据包转交给其他主机,是因为LVS是潜伏在钩子函数INPUT这里,一旦发现有用户访问的数据包通过PREROUTING后发送给INPUT,LVS会将其截获下来,改变目标地址为真实服务器的地址,转而发给POSTROUTING,从而发送给真实服务器,实现调度转发的功能。
1、NAT技术将请求的报文和响应的报文都需要通过LVS进行地址改写,因此网站访问量比较大的时候LVS负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点
2、只需要在LVS上配置一个公网IP地址就可以了。(也可以通过iptables规则实现NAT,这样私网地址也可以的)
3、每台内部的节点服务器的网关地址必须是调度器LB的内网地址。(如果LVS的DIP和RIP在同一个局域网并且在同一个网段,不需要指定网关)
4、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
DR模型,请求报文,和响应报文走的不是同一个路径,请求报文经过LVS发送给RS,响应报文在回应的时候,不需要原路返回,它可以直接返回给客户端。
这种模型带来的最大的好处就是LVS服务i去的压力变小了。因为只有请求报文需要通过VS服务器发送给RS服务器,而RS服务器的响应报文是直接发送给客户端的,不需要经过LVS服务器。而且一般请求报文相对响应报文来说要小的多。这样就使得LVS的服务器的压力小了很多。
LVS-DR模式图解
因为RS服务器需要直接将请求报文发送给客户端,而客户端访问的IP是VIP,只有来自VIP的包客户端才会接收,所以我们需要在RS服务器上也配置VIP。但是这样的话LVS和RS都有了一样的IP,这样就会带来地址冲突的问题。我们需要解决地址冲突的问题。
我们需要在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
DR模型特点:LVS的压力小,通过改变MAC地址来实现调度转发,不能映射端口号。
LVS-DR模式数据包流转的过程
转发方式:不修改请求报文的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) 请求报文要经由Director,但响应不经由Director
(4) 不支持端口映射
(5) RS的OS须支持隧道功能
lvs-fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
(1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
(2) RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
(3) 请求和响应报文都经由Director
(4) 支持端口映射
LVS的调度又分为静态方法和动态方法。
静态方法:仅根据算法本身进行调度
1、RR:roundrobin,轮询,即按顺序分配请求,即使某个机器性能不好,或者宕机,也会将请求分配给这台主机
2、WRR:Weighted RR,加权轮询,跟RR的区别再于它可以通过对每个RS服务器去设置权重,来实现依照服务器性能的优略分配任务,性能好的分配任务多点,性能差的分配任务少点。也会存在RR一样的缺点
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定。
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商。
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、LC:least connections 适用于长连接应用
Overhead=activeconns*256+inactiveconns
2、WLC:Weighted LC,默认调度方法
Overhead=(activeconns*256+inactiveconns)/weight
3、SED:Shortest Expection Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡
问题,从负载重的复制到负载轻的RS
Overhead 表示优先级、
activeconns 正处于连接的数量
inactiveconns 非活动连接的数量
weight 权重
优点:
Lvs属于内核级的功能,它的并发量是相当大的,能达到几百万的并发
缺点:
没有所谓的高可用功能,不能检查后端服务器的健康性,(后端服务器宕机了,lvs是没有办法去管理的)
前言:在涉及到对外项目,经手许多小中型网站的架构,F5、LVS及Nginx都比较多,我想一种比较通俗易懂的语气跟大家说明下何谓负载均衡,何谓Linux集群,帮助大家走出这个误区,真正意义上来理解它们。