深入浅出LVS

一. LVS

1.1 LVS简介

Linux虚拟服务器(Linux Virtual Server)是一个虚拟的服务器集群系统,是由章文嵩博士在1998年5月成立的一个开源项目,同时,也是国内最早出现的自由软件项目之一,目前属于Linux标准内核的一部分。

Linux Virtual Server项目的目标 :使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

  • 可伸缩性(Scalability),当服务的负载增长时,系统能被扩展来满足需求,且不降低服务质量。
  • 高可用性(Availability),尽管部分硬件和软件会发生故障,整个系统的服务必须是每天24小时可用的。
  • 可管理性(Manageability),整个系统可能在物理上很大,但应该容易管理。

LVS是基于TCP/IP的负载均衡技术,采用了IP负载均衡技术和基于内容请求分发技术,工作于OSI七层参考模型的第四层(传输层),是一个虚拟的四层交换集群系统,其根据目标地址和目标端口实现用户请求转发,转发效率极高,具有处理百万级并发连接请求的能力。

目前,LVS提供了一个能实现可伸缩网络服务的LVS框架,在该框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请求分发的内核七层交 换机KTCPVS和集群管理软件。

1.2 LVS工作原理

当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUTIPVS是工作在INPUT链上的, 当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTINGPOSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

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

  • ipvs (ip virtual server):LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。

  • ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那 ipvsadm 就是类似 iptables 工具的地位。

1.3 LVS集群结构

LVS集群分为三层结构:

  • 负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
  • 服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
  • 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

1.4 LVS集群的特点

  • 拥有实现了三种IP负载均衡技术和十种连接调度算法的IPVS软件。在IPVS的内部实现上,采用了高效的哈希函数和垃圾回收机制,能正确处理与所调度报文相关的ICMP消息。

  • 对虚拟服务数量无限制且支持持久的虚拟服务(如HTTP Cookie、HTTPS),并提供较为详细的统计数据。

  • 应用范围较广。后端真实服务器可运行任何支持TCP/IP的操作系统,负载调度器能支持绝大多数的TCP和UDP协议,无须对客户端和服务器做任何修改。

  • 具有良好的伸缩性,可支持百万级的并发连接。若使用百兆网卡,可采用VS/TUN或VS/DR模式,集群系统的吞吐量可高达1Gbit/s;若使用千兆网卡,集群系统的最大吞吐量可接近10Gbit/s。

  • 可靠、稳定、抗负载能力强。LVS仅分发请求,自身不会产生流量且流量不会从它出去,对内存和CPU资源的消耗比较低;LVS具备完整的双机热备方案及防卫策略,保证其能稳定工作。

  • 配置简单易懂,大大减少人为出错的概率。

  • 不支持正则表达式,无法实现动静分离。

1.5 LVS负载均衡的三种工作模式

在调度器的实现技术中,IP负载均衡技术是效率最高的。LVS实现的IP负载均衡技术主要分为三种:

  • Virtual Server via Network Address Translation(VS/NAT)

客户端发起请求时,通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;调度器在连接哈希表中记录这个连接,方便下一个报文处理;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

  • Virtual Server via IP Tunneling(VS/TUN)

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道封装后转发至真实服务器,而真实服务器的响应报文直接返回给客户端,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

  • Virtual Server via Direct Routing(VS/DR)

调度器不修改报文也不封装报文,而是直接将请求报文的MAC地址改为选定的真实服务器的MAC地址,再将修改后的请求发送到真实服务器,而真实服务器将响应报文直接返回给客户端。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器必须在同一个内网。

1.6 LVS 的十种负载调度算法

针对不同的网络服务需求和服务器配置,IPVS调度器实现了十种调度算法,分为静态方法和动态方法。

(1) 静态方法:仅依据算法本身进行调度,不考虑后端真实服务器的负载情况。

  • RR (Round Robin,轮询)

调度器通过`“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

  • WRR (Weighted Round Robin,加权轮询)

调度器通过"加权轮叫"`调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  • SH (Source Hashing,源地址散列)

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

  • DH (Destination Hashing,目标地址散列)

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

(2) 动态方法:依据算法及后端各个真实服务器的负载情况进行调度。

  • LC (Least Connnections,最少链接)

调度器通过`"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

  • WLC (Weighted Least Connnections,加权最少链接)

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  • LBLC (Locality-Based Least Connections,基于局部性的最少链接)

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

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

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

  • SED (Shortest Expected Delay,最小期望延迟)

以最小的期望延迟为依据将请求分配给真实服务器。如果发送到第i台服务器,作业将经历的期望延迟为( Ci+1)/Ui,其中,Ci是第i台服务器上的连接数,Ui是第i台服务器的固定服务速率(权重)。

  • NQ (Never Queue,永不排队)

从不队列调度算法采用两速模型。当有空闲服务器可用时,请求会发送到空闲服务器,而不是等待快速响应的服务器。如果没有可用的空闲服务器,则请求将被发送到服务器,以使其预期延迟最小化(最短预期延迟调度算法)。

1.7 LVS管理工具

LVS的管理工具为ipvsadm,用于管理LVS的策略规则。

YUM安装:

sudo yum install ipvsadm -y

源码安装:

#安装依赖
sudo yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt* libnl*
#下载
wget https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm/ipvsadm-1.31.tar.gz;
tar zxvf ipvsadm-1.31.tar.gz;
cd ipvsadm-1.31;
make;
sudo make install;

验证是否安装成功,需使用sudo权限

sudo ipvsadm -h

ipvsadm命令参考:

  • -A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
    就是增加一台新的虚拟服务器。
  • -E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
  • -D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
  • -C --clear 清除内核虚拟服务器表中的所有记录。
  • -R --restore 恢复虚拟服务器规则
  • -S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
  • -a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
    记录。也就是在一个虚拟服务器中增加一台新的真实服务器
  • -e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
  • -d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
  • -L|-l --list 显示内核虚拟服务器表
  • -Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
  • --set tcp tcpfin udp 设置连接超时值
  • --start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说
    明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的

其他的选项:
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
[vip:port] or [real-server-ip:port]

-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务
[vip:port] or [real-server-ip:port]

-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。

-s --scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

  • 默认的调度算法是: wlc.
    -p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
    户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
  • -M --netmask netmask persistent granularity mask
  • -r --real-server server-address 真实的服务器[Real-Server:port]
  • -g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
  • -i --ipip 指定LVS 的工作模式为隧道模式
  • -m --masquerading 指定LVS 的工作模式为NAT 模式
  • -w --weight weight 真实服务器的权值
  • --mcast-interface interface 指定组播的同步接口
  • -c --connection 显示LVS 目前的连接 如:ipvsadm -L -c
  • --timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
  • --daemon 显示同步守护进程状态
  • --stats 显示统计信息
  • --rate 显示速率信息
  • --sort 对虚拟服务器和真实服务器排序输出
  • --numeric -n 输出IP 地址和端口的数字形式

1.8 VS/DR (LVS-DR)

1.8.1 Real Server配置

1.8.1.1 安装nginx
  1. 新增nginx yum源
sudo tee -a /etc/yum.repos.d/nginx.repo <<-'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
EOF
  1. 安装
sudo yum install -y nginx
  1. 启动
sudo systemctl start nginx
  1. 添加测试页并测试
sudo sh -c 'echo 192.168.118.170 > /usr/share/nginx/html/index.html';
sudo sh -c 'echo 192.168.118.171 > /usr/share/nginx/html/index.html';
curl http://192.168.118.170
1.8.1.2 rs脚本

此脚本只是临时生效,要想永久生效,需配置lo:0网卡

sudo tee -a /etc/init.d/realserver <<-'EOF'
#!/bin/bash  
#定义了一个VIP变量,必须跟真实服务在一个网段
VIP=192.168.118.169
case "1" in   
start)             ifconfig lo:0VIP netmask 255.255.255.255 broadcast VIP up             /sbin/route add -hostVIP dev lo:0   
           echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore   
           echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce   
           echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore   
           echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce   
           sysctl -p >/dev/null   
           echo "RealServer Start OK"  
           ;;  
stop)   
           ifconfig lo:0 down   
           route del VIP 2>/dev/null             echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore             echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce             echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore             echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce             echo "RealServer Stoped"            ;;   
*)             echo "Usage:0 {start|stop}"  
           exit 1   
esac   
exit 0
EOF

注: arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作。这两个参数很重要,特别是在LVS的DR场景下,它们的配置直接影响到DR转发是否正常。

  • arp_ignore

  因为DR模式下,每个真实服务器节点都要在环回网卡上绑定虚拟服务IP。这时候,如果客户端对于虚拟服务IP的arp请求广播到了各个真实服务器节点,如果arp_ignore参数配置为0,则各个真实服务器节点都会响应该arp请求,此时客户端就无法正确获取LVS节点上正确的虚拟服务IP所在网卡的MAC地址。假如某个真实服务器节点A的网卡eth1响应了该arp请求,客户端把A节点的eth1网卡的MAC地址误认为是LVS节点的虚拟服务IP所在网卡的MAC,从而将业务请求消息直接发到了A节点的eth1网卡。这时候虽然因为A节点在环回网卡上也绑定了虚拟服务IP,所以A节点也能正常处理请求,业务暂时不会受到影响。但是此时由于客户端请求没有发到LVS的虚拟服务IP上,所以LVS的负载均衡能力没有生效。造成的后果就是,A节点一直在单节点运行,业务量过大时可能会出现性能瓶颈。所以DR模式下要求arp_ignore参数要求配置为1

  • arp_announce

     每个机器或者交换机中都有一张arp表,该表用于存储对端通信节点IP地址和MAC地址的对应关系。当收到一个未知IP地址的arp请求,就会再本机的arp表中新增对端的IP和MAC记录;当收到一个已知IP地址(arp表中已有记录的地址)的arp请求,则会根据arp请求中的源MAC刷新自己的arp表。

  如果arp_announce参数配置为0,则网卡在发送arp请求时,可能选择的源IP地址并不是该网卡自身的IP地址,这时候收到该arp请求的其他节点或者交换机上的arp表中记录的该网卡IP和MAC的对应关系就不正确,可能会引发一些未知的网络问题,存在安全隐患。所以DR模式下要求arp_announce参数要求配置为2。

1.8.1.3 添加权限
sudo chmod +x /etc/init.d/realserver 
1.8.1.4 启动
sudo /etc/init.d/realserver start

1.8.2 Director Server配置

1.8.2.1 开启路由转发
sudo tee -a /etc/sysctl.conf <<-'EOF'
#开启路由转发
net.ipv4.ip_forward = 1
EOF

配置生效

sudo sysctl -p
1.8.2.2 部署ipvsadm
sudo yum install ipvsadm -y
1.8.2.3 配置虚拟ip
sudo ifconfig ens32:0 192.168.118.169 broadcast 192.168.118.169 netmask 255.255.255.255 up

注:此处在ens32设备上绑定了一个虚拟设备ens32:0,同时设置了一个虚拟IP是192.168.118.169,然后指定广播地址也为192.168.118.169,需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。

1.8.2.4 增加路由

sudo route add -host 192.168.118.169 dev ens32:0
1.8.2.5 清除原有ipvsadm配置
ipvsadm -C
1.8.2.6 添加虚拟ip规则,-s指明调度方法rr
sudo ipvsadm -A -t 192.168.118.169:80 -s rr
1.8.2.7 在虚拟IP中添加服务规则
sudo ipvsadm -a -t 192.168.118.169:80 -r 192.168.118.170 -g;
sudo ipvsadm -a -t 192.168.118.169:80 -r 192.168.118.171 -g

注:-g表示指定LVS 的工作模式为直接路由模式。lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

1.8.2.8 查看ipvsadm状态
sudo ipvsadm -Ln
1.8.2.9 测试
curl http://192.168.118.169

注意事项:

  1. 测试时需要在nginx的http中设置keepalive_timeout 0; 取消使用http持久连接模式,保证每次客户端发起请求都需要向服务端建立连接,这样做是为了每次刷新页面都要经过lvs负载转发。

  2. lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

keepalive_timeout说明:

在nginx中keepalive_timeout的默认值是65秒,默认使用http持久连接模式,可使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,可避免建立或重新建立连接。生产环境建议keepalive_timeout不要设置为0。

附:LVS 涉及相关的术语及说明
- DS:Director Server,前端负载均衡节点服务器。
- RS:Real Server,后端真实服务器。
- CIP:Client IP,客户端 IP 地址。
- VIP:Virtual IP,负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
- RIP:RealServer IP,负载均衡后端的真实服务器 IP 地址。
- DIP:Director IP,负载均衡与后端服务器通信的 IP 地址。
- CMAC: 客户端 MAC 地址,LVS 连接的路由器的 MAC 地址。
- VMAC: 负载均衡 LVS 的 VIP 对应的 MAC 地址。
- DMAC: 负载均衡 LVS 的 DIP 对应的 MAC 地址。
- RMAC: 后端真实服务器的 RIP 地址对应的 MAC 地址。

dr模式问答:

1.配置dr模式,需要修改交换机参数吗?
答:不需要,在realserver上修改网络参数就可以了,见问题2、3

2.在dr模式下,director、realserver都绑定了vip,为什么前端的arp广播只有director响应?
答:因为在realserver上要设置echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore, echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 这样的话realserver对vrp广播就不理会了

3.在dr模式下,realserver不经过director(网关不设置为director),而且不用改原地址的情况下,直接回复客户端并且不会被丢包(realserver将接收包的目的地址作为发送包的源地址)?
答:原因有2
a.realserver在lo绑定了vip
b.realserver设置了后面3项 , echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce , echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce , route add -host VIP dev lo:0

4.dr模式下,realserver需要有公网地址吗?
答:不需要,只要realserver能访问外网就行

5.dr模式下,director上的vip绑定在哪个接口
答:绑在实际通讯的那个网络接口,如eth0下,绑成为:eth0:0,单机和双机的用法不一样
单机情况下,ifconfig eth0:1vip broadcast $vip netmask 255.255.255.255 up
双机情况下,在keepalived的配置文件里 virtual_ipaddress { 192.168.118.169}

6.dr模式下,在realserver上为什么设置route add -host 192.168.118.169 dev lo:0?
答:问题3的答案可以回答

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭