lvs

lvs

一、lvs简介

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到DirectorServer上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(realserver)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

LVS是 Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网是 http://www.linuxvirtualserver.org 现在 LVS 已经是Linux内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的Linux服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

二、工作原理

简易原理图如下:

lvs原理

  • 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间

  • PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链

  • IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链

  • POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器.

三、LVS的组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

  • ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。

  • ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

四、LVS相关术语

  • DS:Director Server。指的是前端负载均衡器节点。
  • RS:Real Server。后端真实的工作服务器。
  • VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  • RIP:Real Server IP,后端服务器的IP地址。
  • CIP:Client IP,访问客户端的IP地址。

五、lvs的工作模式

1) lvs-nat

lsv-nat

(1)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2)PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(3)IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(4)POSTROUTING链通过选路,将数据包发送给Real Server
(5)Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(6)Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP

lvs-nat 模型特性

  • RS应该使用私有地址,RS的网关必须指向DIP
  • DIP和RIP必须在同一个网段内
  • 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
  • 支持端口映射
  • RS可以使用任意操作系统
  • 缺陷:对Director Server压力会比较大,请求和响应都需经过director server

2) lvs-dr

lvs-dr

(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)由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(5)RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(6)响应报文最终送达至客户端

lvs-dr 特性

  • 前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
  • RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
  • RS跟Director Server必须在同一个物理网络中
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  • 不支持地址转换,也不支持端口映射
  • RS可以是大多数常见的操作系统
  • RS的网关绝不允许指向DIP(因为我们不允许他经过director)
  • RS上的lo接口配置VIP的IP地址
  • 缺陷:RS和DS必须在同一机房中

3) lvs-tun

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)

lvs-tun特性:

  • DIP, VIP, RIP都应该是公网地址
  • RS的网关一般不能指向DIP
  • 请求报文要经由Director,但响应不能经由Director
  • 不支持端口映射
  • RS的OS须支持隧道功能

4) lvs-fullnat

lvs-fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP –> DIP VIP –> RIP

lvs-fullnat特性

  • VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
  • RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  • 请求和响应报文都经由Director
  • 支持端口映射

注意:此类型kernel默认不支持

5) 工作模式总结

工作模式

  • lvs-nat与lvs-fullnat:请求和响应报文都经由Director
  • lvs-nat:RIP的网关要指向DIP
  • lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
  • lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

六、lvs的调度算法

  • 静态方法:仅根据算法本身进行调度

    • RR:roundrobin,轮询

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

  • WRR:Weighted RR,加权轮询

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

  • SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定

它是根据源地址散列算法进行静态分配固定的服务器资源,现在好多用户都是一个的snat,出口就一个ip,后端rs记录的访问地址,也是一个ip,明显的不符合实际情况。

  • DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡。

该算法是根据目标 IP 地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

  • 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

    • LC:least connections 适用于长连接应用 Overhead=activeconns*256+inactiveconns
    • WLC:Weighted LC,默认调度方法 Overhead=(activeconns*256+inactiveconns)/weight
    • SED:Shortest Expection Delay,初始连接高权重优先 Overhead=(activeconns+1)*256/weight
    • NQ:Never Queue,第一轮均匀分配,后续SED
    • LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
    • LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

七、ipvs的常用命令

1)集群服务的增改 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

2)集群服务的删除 ipvsadm -D -t|u|f service-address

  • -t: TCP协议的端口,VIP:TCP_PORT
  • -u: UDP协议的端口,VIP:UDP_PORT
  • -f:firewall MARK,标记,一个数字
  • [-s scheduler]:指定集群的调度算法,默认为wlc

3)管理集群上的RS:增、改 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

4)集群上的删除 ipvsadm -d -t|u|f service-address -r server-address

  • server-address:rip[:port] 如省略port,不作端口映射
  • -g: gateway, dr类型,默认
  • -i: ipip, tun类型
  • -m: masquerade, nat类型
  • -w weight:权重

5)清空定义的所有内容:ipvsadm –C
清空计数器:ipvsadm -Z [-t|u|f service-address]
查看:ipvsadm -L|l [options]

  • –numeric, -n:以数字形式输出地址和端口号
  • –exact:扩展信息,精确值
  • –connection,-c:当前IPVS连接输出
  • –stats:统计信息
  • –rate :输出速率信息

6)保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service

7)重载:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service

八、lvs-dr注意事项

  • DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

    • 在前端网关做静态绑定
    • 在各RS使用arptables
    • 在各RS修改内核参数,来限制arp响应和通告的级别
    • 限制响应级别:arp_ignore

      • 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
      • 1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
    • 限制通告级别:arp_announce

      • 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
      • 1:尽量避免将接口信息向非直接连接网络进行通告
      • 2:必须避免将接口信息向非本网络进行通告

九、常用的配置脚本

rs的配置脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
vip=10.0.0.100
mask='255.255.255.255‘
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac

vs的配置脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
vip='10.0.0.100'
iface='eth0:1'
mask='255.255.255.255'
port='80'
rs1='192.168.0.101'
rs2='192.168.0.102'
scheduler='wrr'
type='-g'
case $1 in
start)
ifconfig $iface $vip netmask $mask #broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w
;;
stop)
ipvsadm -Cifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
esac

注意:

lvs是基于四层的调度转发,不能基于url进行转发,而且默认的不能对后端rs进行状态检查,通常借助ldirectord实现

-------------本文结束感谢您的阅读-------------