共计 8379 个字符,预计需要花费 21 分钟才能阅读完成。
LVS 是 Linux Virtual Server 的简称,即 Linux 虚拟服务器。从 Linux 内核 2.4 版本之后,已经将 LVS 内置于内核中,提供负载均衡技术。
目录
- LVS 理论基础
- ipvsadm 命令
- DR 和 NAT 实验
- LVS 持久连接
- LVS 健康监测
LVS 理论基础
1、LVS 的优势
高并发能力强 LVS 基于内核网络层工作,有着超强的并发处理能力,单台 LVS 可以承受上万的并发连接。
稳定性高 LVS 是基于 4 层的负载均衡软件,因此 LVS 在所有负载均衡软件中性能最强,稳定性最高,消耗 CPU 和内存少。
应用范围广 LVS 是工作在 4 层,所以它可以对应用层的所有协议作负载均衡,包括 http、DNS、ftp 等。
2、LVS 的组件
ipvsadm LVS 已经集成于内核中,用户是无法直接操作内核空间的程序的,因此需要一个用户空间的管理工具,ipvsadm 就是一个用户空间的命令行工具,用于管理集群。
ipvs 工作于内核 netfilter INIPUT 钩子上的一个程序,并且根据 ipvsadm 定义的规则实现请求的转发。
查看 Linux 内核是否支持 ipvs:
`grep -i -C 10 –color=auto ipvs /boot/config-2.6.32-696.el6.x86_64`
3、LVS 的工作流程
1、用户请求的数据包到达负载均衡器的内核空间,首先经过的是内核的 PREROUTING 链,
2、因为请求的数据包的目的地址一定是本机,然后将数据包送到 INPUT 链,
3、ipvs 就工作在 INPUT 链上,ipvs 利用 ipvsadm 定义的规则工作,ipvs 对数据包进行检查,如果目的地址和端口不在规则里边,则将数据包送往用户空间,
4、如果目的地址和端口在规则里边,则将数据包的目的地址和端口修改为后端真实服务器,然后将修改后的数据包送往 POSTROUTING 链,
5、最后经过 POSTROUTING 链将数据包转发给后端服务器。
4、LVS 的工作模式
NAT ①客户端发送数据包至负载均衡器,数据包的源 IP 是 CIP,目的 IP 是 VIP。数据包首先到达的是内核空间的 PREROUTING 链,②PREROUTING 链判断目的 IP 是 VIP,确定 VIP 是本地 IP,然后将其送往 INPUT 链。③INPUT 链上的 ipvs 将数据包的目的 IP 修改为 RIP,然后发送给 POSTROUTING 链。④POSTROUTING 链将数据包发送至后端服务器处理。⑤处理完之后,以源 IP 为 RIP,目的 IP 为 CIP 的响应数据包返回给负载均衡器,⑥LVS 收到之后再次修改数据包的 IP 地址,将数据包的源 IP 修改为 VIP,目的 IP 保持不变仍为 CIP,然后发往客户端。
NAT 工作模式中,请求的流量和回应的流量都必须经过前端的调度器,一次调度器成为了整个服务器集群的瓶颈,一旦调度器宕机,则整个集群将出去瘫痪状态,因此就出现了 DR 工作模式。
DR Direct Routing,①客户端发送数据包至负载均衡器,数据包的源 IP 是 CIP,目的 IP 是 VIP。数据包首先到达的是内核空间的 PREROUTING 链,②PREROUTING 链判断目的 IP 是 VIP,确定 VIP 是本地 IP,然后将其送往 INPUT 链。③ipvs 将数据包通过 DIP 的网卡发送给 POSTROUTING 链,其中源 MAC 自动修改为 DIP 的 MAC(因为从 DIP 的网卡发送出去的),并且将目的 MAC 修改为 RIP 的 MAC,源 IP 和目的 IP 保持不变,④POSTROUTING 链将数据包发送给交换机,交换机根据 RIP 的 MAC 地址将数据包送往指定的后端服务器,⑤处理外后将数据包通过 lo 接口转发至 eth0 接口,由 eth0 将数据包发送出去,此时数据包的源 IP 和 MAC 是 VIP:VIP 的 MAC,目的 IP 和 MAC 是 CIP:CIP 的 MAC,⑥响应数据包最终交付给客户端。
DR 工作模式的特点:因为 DR 工作模式是根据 MAC 进行数据包转发,因此 RS 跟负载均衡器必须在同一个局域网(广播域)中;所有的请求报文都经过负载均衡器,所有的响应报文不经过负载均衡器;因为 DR 工作模式的响应报文是 RS 直接回应的,因此负载均衡器和 RS 必须都配置同一个 VIP 地址,RS 的 lo 接口配置 VIP,这样一来同一个局域网会有多个相同的 IP,在进行 ARP 广播的时候会出现紊乱,这时需要通过修改 RS 的内核参数从而阻止 RS 对 ARP 广播进行回应,这样只有负载均衡器对 VIP 的 ARP 请求进行回应;由于 DR 工作模式仅需要分析数据包的 MAC 首部,因此 DR 的处理能力特别高,拥有和硬件负载均衡设备相媲美的网络吞吐和负载均衡能力。
TUN ①客户端发送请求至负载均衡器,该数据包的源 IP 是 CIP,目的 IP 是 VIP,②LVS 收到数据包后,将该数据包的首部再封装一层 IP 首部,其中源 IP 为 DIP,目的 IP 为 RIP,将重整后的数据包送往后端服务器,③RS 两次处理该数据包,将响应数据包通过 lo 接口送往 eth0 接口,然后直接发送给客户端。
其中 NAT 和 DR 调度算法必须保证调度器和 RS 在同一个局域网中,也就是他们无法跨网段通信,而 TUN 调度算法则可以使得调度器和 RS 在不同的局域网中。
另外,通过对 NAT 工作模式进行改进,可以使得其跨网段通信,改进之后的工作模式为 fullnat 模式。工作流程和原理如图所示,
5、LVS 的调度算法
1、轮询(rr)
请求按顺序轮流分配到后端服务器上,后端每台服务器接受请求的概率是一样的。
2、加权轮询 (wrr)
LVS 根据后端服务器的处理能力给后端每台服务器设置权值。LVS 可以自动询问真实服务器的负载情况,然后动态的调整权值,权值大的收到请求的概率大。
3、目标地址散列(dh)
根据请求的目标 IP 地址,得出 hash 值,进而找出对应的服务器,这种调度算法适用于缓存服务器的负载均衡。
4、源地址散列 (sh)
根据请求的源 IP 地址,得出 hash 值,进而找出对应的服务器,这种调度算法适用于 session 共享的情况。
5、最少连接 (lc)
动态地将请求调度到后端连接数最少的服务器上。这种调度算法适用于后端每台服务器性能相近的情况下。
6、加权最少连接(默认)(wlc)
LVS 动态调整后端服务器的权值,权值大的将承受较大比例的活动连接负载。
7、最短延迟调度(sed)
8、永不排队 / 最少队列调度(nq)
ipvsadm 命令
ipvs 是集成与内核空间的,用户无法直接操作,因此需要借助管理工具 ipvsadm,通过定义规则使得 ipvs 工作,类似于 iptables。同样该工具可以借助 yum 安装和源码安装。
常用选项:
-A –add-server 新加一条虚拟服务器记录
-E –edit-server 编辑虚拟服务器记录
-D –delete-server 删除一条虚拟服务器记录
-C –clear 清空所有的虚拟服务器记录
-S –save 保存虚拟服务器规则
-R –restore 恢复虚拟服务器规则,从 - S 保存的规则中恢复
-t –tcp-service 表示 tcp 服务,指虚拟服务器
-u –udp-service 表示 udp 服务,指虚拟服务器
-s –schedule 使用的调度算法
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq the default scheduler is wlc
-p 代表持久连接
-f 代表防火墙的标记
例子:
ipvsadm -A -t 192.168.239.129:80 -s wlc
ipvsadm -E -t 192.168.239.129:80 -s rr
ipvsadm -S > /etc/sysconfig/ipvsadm
ipvsadm -R < /etc/sysconfig/ipvsadm
-a 添加一条新的真实主机记录
-r 添加真实主机的地址
-m 指定 LVS 的工作模式为 NAT
-w 指定真实服务器的权值
-g 指定 LVS 的工作模式为 DR(默认)
-i 指定 LVS 的工作模式为 TUN
例子:
ipvsadm -a -t 192.168.239.129:80 -r 192.168.239.130 -m -w 1
-e 编辑一条虚拟服务器记录中的某条真实服务器
-d 删除一条虚拟服务器记录中的某条真实服务器
-L|-l 列出所有的虚拟服务器记录
-Z 清空当前的连接数(- l 会显示虚拟服务器中连接数量)
例子:
ipvsadm -e -t 192.168.239.129:80 -r 192.168.239.130 -g -w 3
ipvsadm -d -t 192.168.239.129:80 -r 192.168.239.230
实验
LVS-DR 模型
环境拓扑:
主机 | IP | 功能 |
---|---|---|
LVS | 192.168.239.250 | 调度器 |
Web1 | 192.168.239.129 | RS |
Web2 | 192.168.239.133 | RS |
前端负载均衡器的配置:
# 配置 VIP 至网卡别名
[root@LVS ~]# ifconfig eth0:0 192.168.239.250 netmask 255.255.255.0 up
# 定义 LVS 规则
[root@LVS ~]# ipvsadm -A -t 192.168.239.250:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.239.250:80 -r 192.168.239.129:80 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.239.250:80 -r 192.168.239.133:80 -g -w 2
[root@LVS ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.239.250:80 wrr
-> 192.168.239.129:80 Route 1 0 0
-> 192.168.239.133:80 Route 2 0 0
后端 RS 的配置(两台 RS 的配置过程一样,下面仅以 Web1 为例):
[root@Web1 web]# ifconfig lo:0 192.168.239.250 broadcast 192.168.239.250 netmask 255.255.255.255 up
[root@Web1 web]# route add -host 192.168.239.250 dev lo:0
# 抑制 ARP
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
上面的配置过程中有几个问题要说明:
① 把 VIP 绑定至 RS 的 lo 回环接口上边,并且广播地址为自身和子网掩码为 4 个 255,这样做是为了防止 VIP 冲突。
② 关于 arp_ignore 和 arp_announce 两个内核参数的意义,请参考 ARP 抑制
然后在两台 RS 上边部署 Nginx 的 Web 环境,分别往首页写入静态内容
This is Web1
This is Web2
然后在浏览器的地址列中输入 VIP–192.168.239.250,刷新页面,页面内容能够实现调转说明负载均衡功能实现。
LVS-NAT 模型
环境拓扑
主机 | IP | 功能 |
---|---|---|
LVS | VIP:192.168.0.105 | 调度器 |
LVS | DIP:192.168.239.130 | 调度器 |
Web1 | 192.168.239.129 | RS |
Web2 | 192.168.239.133 | RS |
前端负载均衡配置:
[root@LVS ~]# ipvsadm -A -t 192.168.0.105:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.105:80 -r 192.168.239.129:80 -m -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.0.105:80 -r 192.168.239.133:80 -m -w 2
# 这样 ipvs 的规则已经定义完成
# 因为 NAT 工作模式涉及到地址转换,因此需要修改内核的 ip_forward 参数
[root@LVS ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 修改完成之后使其生效
[root@LVS ~]# sysctl -p
后端 RS 的配置:
# 因为 NAT 的工作模式中,请求数据和回应数据都需要经过调度器,因此需要将后端服务器的默认网关指向调度器的 DIP
[root@Web1 ~]# route add default -gw 192.168.239.130
[root@Web2 ~]# route add default -gw 192.168.239.130
测试:
分别配置 RS 的 web 服务器,我这里将 html 文本内容作为后端 RS 的 web 内容,
[root@Web1 ~]# curl localhost
This is web1
[root@Web2 ~]# curl localhost
This is web2
然后访问调度的 VIP,查看返回的 web 内容,出现如下图的效果说明负载均衡已经实现。
LVS 持久连接
HTTP 协议是一种无状态的协议,即每次发送请求之后就会马上断开连接。假如这种无状态的协议运用在 LVS 负载均衡中,就会出现这样的情况,以购物网站为例子,用户浏览一商品并加入购物车,这时候请求被送往 RS1,然后就断开连接,之后用户又浏览一商品并加入购物车,这时候请求又被送往 RS2,这样用户再次访问购物车的时候,反馈给用户的信息是购物车里只有一件商品(假如请求被调度到 RS1 或 RS2 的其中一台),这样肯定是不行的。
解决这种问题的办法是可以利用源地址 hash 调度算法,当然还可以利用 LVS 的持久连接。
# 基于上面例子中的 NAT 模型试验,为其增加持久连接
[root@LVS ~]# ipvsadm -E -t 192.168.0.105:80 -s wrr -p
现在规划这样一个场景,客户通过访问 VIP 发来 http 请求,需要将 80 端口的请求和 8080 端口的请求在一定时间范围内调度到后端同一台服务器上,就是 端口联姻 。完成这样的需求需要借助 防火墙的标记 和持久连接。为了看到测试的效果,规划这样的环境拓扑:
主机 | IP | 备注(或 html 页面内容) |
---|---|---|
LVS | VIP:192.168.0.105 | 调度器(NAT) |
LVS | DIP:192.168.239.130 | 调度器(NAT) |
Web1 | 192.168.239.129:80 | This is web1 with 80 |
Web1 | 192.168.239.129:8080 | This is web1 with 8080 |
Web2 | 192.168.239.133:80 | This is web2 with 80 |
Web2 | 192.168.239.133:8080 | This is web2 with 8080 |
前端调度器的配置:
# 在防火墙上将 VIP 的 80 端口请求和 8080 端口请求都标记为 100
[root@LVS ~]# iptables -F
[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.105 -p tcp –dport 80 -j MARK –set-mark 100
[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.105 -p tcp –dport 8080 -j MARK –set-mark 100
# 利用标记添加 ipvs 规则(借助 ipvsadm 命令的 - f 选项)
[root@LVS ~]# ipvsadm -C
[root@LVS ~]# ipvsadm -A -f 100 -s wrr -p
[root@LVS ~]# ipvsadm -a -f 100 -r 192.168.239.129 -m -w 1
[root@LVS ~]# ipvsadm -a -f 100 -r 192.168.239.133 -m -w 2
后端 RS 的配置:
# 开通后端服务器的 80 端口和 8080 端口的服务,然后他们各自的访问内容分别如下
[root@Web1 ~]# curl http://localhost:80
This is web1 with 80
[root@Web1 ~]# curl http://localhost:8080
This is web1 with 8080
[root@Web2 ~]# curl http://localhost:80
This is web2 with 80
[root@Web2 ~]# curl http://localhost:8080
This is web2 with 8080
# 因为是 NAT 的工作模式,因此需要将后端 RS 的网关指向 DIP
[root@Web1 ~]# route add default gw 192.168.239.130
[root@Web2 ~]# route add default gw 192.168.239.130
最后访问 VIP 的 80 端口和 8080 端口,发现请求都会被调度到同一台 RS 上。
LVS 健康监测
LVS 本身是无法监测后端服务器的状态的,即使后端某台服务器宕机,LVS 还是会把请求调度到这台宕机的服务器上边,这样用户就会无法得到响应,这对用户的体验是极差的。因此为 LVS 加入了后端服务器健康状态检测机制,只有后端正常的服务器才会接受请求。
这里引入一个新的软件包 ldirectord,这个软件包会为系统开启一个名叫 ldirectord 的守护进程,该进程专门用来管理 ipvs 的规则。该软件的 rpm 包下载地址如下:
ldirectord-3.9.6(CentOS6)下载
下载完成之后完成安装即可。安装命令如下:
[root@LVS ~]# yum -y localinstall ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
ldirectord 软件包的主配置文件为
/etc/ha.d/ldirectord.cf
其中软件包中会默认提供一个主配置文件的模板文件供参考,它是
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf
以实验的 LVS-DR 模型的环境拓扑为例,这里使用 ldirectord 定义 ipvs 的规则,而不再使用 ipvsadm 命令。ldirectord 的主配置文件的主要参数与其意义如下:
checktimeout=5 # 超时时间
checkinterval=1 # 两次检查的时间间隔
autoreload=yes # 如果 ldirectord 的配置文件更新,是否主动重读配置文件
logfile=”/var/log/ldirectord.log” # 定义日志文件
quiescent=no # 当后端某台服务器故障的时候,yes 表示将节点的权值降为 0,no 表示将节点剔除 ipvs 的规则,当恢复正常后自动恢复值 ipvs 规则中
virtual=192.168.239.250:80 # 虚拟 IP:port
real=192.168.239.129:80 gate 1 # RS 的 IP:port+< 工作模式 >+[权值]
real=192.168.239.133:80 gate 2
service=http
scheduler=wrr # 调度算法
#persistent=600
protocol=tcp
# ldirectord 实际上是根据下面参数来具体地监控 RS 是否正常
checktype=negotiate # ldirectord 进程监控 RS 的方法
checkport=80 # 监控的 Port
request=”check.html” # 监控的文件
receive=”This web is OK” # 监控的文件内容
VIP 的设置和后端服务器的 ARP 抑制的相关操作请参考实验的 LVS-DR 模型,这里不再重写。
在后端的服务器的 web 根目录下放入监控的文件
[root@Web1 web]# pwd
/data/web
[root@Web1 web]# cat check.html
This web is OK
[root@Web2 web]# pwd
/data/web
[root@Web2 web]# cat check.html
This web is OK
开启 ldirectord 进程,ipvsadm 查看 ipvs 规则如下
现在将后端 Web1 的监控的页面内容改成其他内容,再次查看 ipvs 规则,结果如下图。
[root@Web1 web]# pwd
/data/web
[root@Web1 web]# cat check.html
This web is Down
: