天天看点

Linux虚拟服务器(lvs)-负载均衡

参考

​​http://www.ducea.com/2008/06/16/lvs-persistence/​​

​​http://zh.linuxvirtualserver.org/node/2487​​

​​http://shaguangzhaojiaren.blogspot.com/2017/12/lvs30.html​​

​​http://zh.linuxvirtualserver.org/node/2903​​

​​https://cloud.tencent.com/developer/article/1355733​​

一、lvs介绍

1.1 基础概念

VIP:virtual IP,LVS服务器上接收外网数据包的网卡IP地址

DIP:director IP,LVS服务器上转发数据包到realserver的网卡IP地址,用于和内部主机进行通讯

RIP:realserver(常简称为RS)上接收Director转发数据包的IP,即提供服务的真实服务器IP。

CIP:客户端的IP

1.2 lvs 三种模式

DR模式

NAT模式

TUN模式

备注下:

masquerade(masquerade 看成是升级版本的nat,普通的nat在iptables里面指定的地址是静态的, masquerade可以动态的获取本地的ip,然后做地址转换 )

1.3 lvs 调度算法

可分为静态算法和动态算法

静态算法

rr:轮询调度(Round-Robin Scheduling,rr)

wrr:加权轮询调度(Weighted Round-Robin Scheduling,wrr),权重大的多分发请求,权重小的少分发请求

sh:源地址散列调度,对源地址哈希,在一定时间内,同一个客户端的请求,被发送到同一个RS上

dh:目的地址散列调度,对目标地址哈希,在一定时间内,发往同一目标IP的请求,被发送到同一个RS上

动态算法

lc:最少连接调度(Least-Connection Scheduling,lc)

此算法会根据后端每台RS的连接数多少来分发请求,对于连接数少的服务器,会多分发客户端请求,以尽可能利用资源占用少的机器。当后端各个服务器的处理能力不同时,该算法不理想。

wlc:加权最小连接调度(Weighted Least-Connection Scheduling,wlc)

动态的获取后端不同服务器的真实负载情况,并调整对应的加权值,从而保证将请求分发到性能优异且较空闲的机器,从而提高处理效率。

sed:Shortest Expect Delay

最短期望延迟;此算法是对WLC的一种改进

nq:Never Queue,永不排队算法

此种算法,当客户端请求到达时,会首先根据SED算法进行选择一个RS,然后把请求分配给这个服务器,同时从算法列表中将此台服务器排除,下次请求到达时,只会在剩下的服务器列表中根据SED进行选择,等到每一台主机都分配到连接后,调度器此后每次都会根据SED算法在所有的服务器中进行计算选择;

lblc:基于局部性的最链接(Locality-Based Least Connections)

“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。

lblcr :带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

最近公司上线了缓存集群服务器,但是还依旧选择了wrr算法,使得线上流量分配不均匀,现调研lblc负载均衡算法在做算法时的可行性。

LVS的负载均衡算法,不同的应用场景,应选择合适的负载均衡算法,充分了解每一种算法背后的思想,才能更好的做出选择。

二、 LVS持久化连接

2.1 持久化连接使用

使用方法: ipvsadm -p 

功能:无论ipvs使用何种调度算法,都会将来自同一个client的所有连接请求始终定向至第一次调度时挑选出的后端RS。

如果不设置,则持久化连接的默认超时时间为300秒

持久连接模板:独立于调度算法(而且优先于 调度算法)

缺省情况下是 持久化 client ip来的连接,也可以设置netmask,将同一网段的client ip的连接重定向到同一个后端RS上

-M, —netmask netmask = Specify the granularity with which clients are grouped for persistent virtual services. The source address of the request is masked with this netmask to direct all clients from a network to the same real server. The default is 255.255.255.255, that is, the persistence granularity is per client host. Less specific netmasks may be used to resolve problems with non-persistent cache clusters on the client side.

example:

ipvsadm -A -t VIP:80 -p 3600 -s -wrr -M 255.255.255.0

ipvsadm -a -t VIP:80 -R RS1 -g -w 1

ipvsadm -a -t VIP:80 -R RS2 -g -w 1

2.2 持久化连接的分类

对于LVS的持久连接来说常见的分为三种PCC,PPC和基于防火墙标记的持久连接,下面我们就来分别讨论

PCC(persistent client connections 不常用):  同一个client ip                               到 同一个vip 的所有访问都会调度到同一台RS

​ipvsadm -A -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​0​

​​ ​

​-s wlc -p ​

​​

​600​

​​

​(单位是s)​

​ipvsadm -a -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​0​

​​ ​

​-r ​

​​

​192.168​

​​

​.​

​​

​1.2​

​​ ​

​-w ​

​​

​4​

​​ ​

​-g​

​ipvsadm -a -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​0​

​​ ​

​-r ​

​​

​192.168​

​​

​.​

​​

​1.3​

​​ ​

​-w ​

​​

​2​

​​ ​

​-g​

开启PCC策略,使用ipvsadm添加service和server时,指定端口为0即可,实际环境中并不常用

PPC(persistent port connections 常用):就是 同一个 client ip 到同一个 vip+port 的所有访问会调度到同一台RS

​ipvsadm -A -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​80​

​​ ​

​-s wlc -p ​

​​

​600​

​ipvsadm -a -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​80​

​​ ​

​-r ​

​​

​192.168​

​​

​.​

​​

​1.2​

​​ ​

​-w ​

​​

​4​

​​ ​

​-g​

​ipvsadm -a -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​80​

​​ ​

​-r ​

​​

​192.168​

​​

​.​

​​

​1.3​

​​ ​

​-w ​

​​

​2​

​​ ​

​-g​

​ipvsadm -A -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​22​

​​ ​

​-s wlc -p ​

​​

​300​

​ipvsadm -a -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​22​

​​ ​

​-r ​

​​

​192.168​

​​

​.​

​​

​1.2​

​​ ​

​-g​

​ipvsadm -a -t ​

​​

​192.168​

​​

​.​

​​

​0.1​

​​

​:​

​​

​22​

​​ ​

​-r ​

​​

​192.168​

​​

​.​

​​

​1.3​

​​ ​

​-g​

80端口代表http服务,22端口代表ssh服务,所以PPC策略保证的是:

同一个用户在超时时间内对于某个服务的访问都会被重定向到同一台RS上

PFWMC策略(不常用):基于防火墙标记的持久化连接

对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款的时候我们当然不希望https的443跳转到另外一台REALSERVER,很显然应该是同一REALSERVER才对,这时候就要用到基于防火墙标记的持久连接,通过定义端口的姻亲关系来实现

2.3 持久化连接查询和显示

ipvsadm -Ln --persistent-conn

Linux虚拟服务器(lvs)-负载均衡

PersistConn:持久化连接数量,到了超时时间的连接会被删除

ActiveConn:活跃连接数,即处于ESTABLISHED状态的tcp连接

InActConn:不活跃连接数,即除了ESTABLISHED状态的tcp连接,剩余的tcp连接都计算在不活跃连接数中

当时定位问题过程中,发现ActiveConn会比通过netstats看到的ESTABLISHED值高很多,而且数值一直增加,这是怎么回事呢?

LVS自身对tcp和udp有默认超时时间,一条tcp的连接经过lvs后,lvs会把这台记录默认保存15分钟,而不管这条连接是不是已经失效!

所以如果你的服务器在15分钟以内有大量的并发请求连进来的时候,你就会看到这个数值直线上升.

2.4 持久化连接的实现原理

当一个client ip访问VIP时,ipvs会添加一条状态为NONE的记录到connection template哈希表中,记录的key是clientip,记录的保存时间是persistent timeout值,

在超时时间内,这条记录都存在于connection template哈希表。

后续同一个client ip访问VIP时,会到connection template哈希表查找clientip是否存在,如果存在记录则会将其转发到后端的同一台RS。

三、LVS连接追踪

在某些应用场景中,LVS需要基于“连接追踪”实现将由同一个客户机的请求始终发往其第一次被分配至的RS,以保证其请求的完整性等。lvs内部除了connection template持久连接表外,还维护了一个名为timeout_table的哈希表。

使用命令 ipvsadm -lcn显示当前lvs中的连接信息

Linux虚拟服务器(lvs)-负载均衡

FIN_WAIT状态和NONE状态解析

FIN_WAIT的值就是tcpfin的超时时间,当NONE的expire值为0时,对应项的FIN_WAIT还存在,那么NONE的expire值会重新变成60秒再继续减少,一直到FIN_WAIT消失以后,NONE才会消失,只要NONE存在,同一client的访问,都会分配到同一RS上。

ASSURED状态

connection template持久化连接表的状态分为两种NONE和ASSURED,ASSURED是一个正常状态。

Add support for state bits
and for the first "assured" bit which indicates that some
connection controlled by this template was established or assured
by the real server. In a followup patch we will use it to drop
templates under SYN attack.      

看提交patch的说明,这个状态的作用,是在遭受SYN攻击时,通过ASSURED状态,来弃用connection template持久化连接表

获取tcp和udp的timeout值,可以用一下命令查看

ipvsadm -L --timeout

为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。

LVS为记录“连接超时”定义了三个计时器:

1、空闲TCP会话(建立连接后,无数据收发)

2、客户端正常断开连接后的TCP会话;

3、无连接的UDP数据包(记录其两次发送数据包的时间间隔);

上面三个计时器的值可以用–set参数来修改,其后面的值依次对应于上述的三个计时器:

ipvsadm --set 28800 30 600

四、LVS高可用

一般来说,会在Director上运行service monitor,定期检查后端server是否健康

如果在指定时间内,后端server对于访问请求或icmp ECHO_REQUEST 都无响应,service monitor会认为后端server deaded(不可用),会把它从Director的server列表中删除,新的请求将不会再转发给它。

当service monitor检测到后端server正常工作了,会将其重新加会可用server列表。

主备模式

primary backup 

一定时间内没收到primary的心跳信息,backup将接管VIP,提供负载均衡服务。

当失败的load balancer 恢复工作后,有两种解决方法

1.自动成为backup load balancer

2.active load balance释放VIP,新恢复的机器重新接管VIP,提供负载均衡服务。

现在线上使用的lvs + keepalived的模式来实现高可用服务。

五、其他方面

fwm:

firewall mark

在 prerouting chain 给连接打上标记, 后面lvs 更具规则调度打上特定标记的包 (man iptables extension)

example:

将2个服务 的连接打上 相同的标记:10

iptables -t mangle -A PREROUTING -p tcp -d $VIP --dport 80 -j MARK --set-mark 10 (10是标记)

iptables -t mangle -A PREROUTING -p tcp -d $VIP --dport 22 -j MARK --set-mark 10 (10是标记)

ipvs:

ipvsadm -A -f 10 -s rr //不需要指定 port

ipvsadm -a -f 10 -r $RIP1 -g

ipvsadm -a -f 10 -r $RIP2 -g

netfilter:

PREROUTING --> INPUT (lvs 在 INPUT chain 干活) --> POSTROUTING

1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。

 2. PREROUTING检查发现数据包的目标IP是否是本机,是的话则将数据包送至INPUT链。

 3.IPVS比对数据包请求的服务是否为集群服务(是否配置转发规则),若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址

 4.由于Director Server和RS在同一个网络中,所以是通过二层来传输。

继续阅读