8. LVS部署命令介绍
8.1 LVS软件相关信息
1.程序包:ipvsadm
2.Unit File: ipvsadm.service
3.主程序:/usr/sbin/ipvsadm
4.规则保存工具:/usr/sbin/ipvsadm-save
5.规则重载工具:/usr/sbin/ipvsadm-restore
6.配置文件:/etc/sysconfig/ipvsadm-config
7.ipvs调度规则文件:/etc/sysconfig/ipvsadm
8.2 ipvsadm命令
# 安装
yum install -y ipvsadm
8.2.1 核心功能
- 集群服务管理:增、删、改
- 集群服务的RS管理:增、删、改
- 查看命令参数
管理集群服务 ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \
service-address(集群地址;VIP) \
[-s scheduler(调度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags] ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空
ipvsadm –R 重载
ipvsadm -S [-n] 保存管理集群中的real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w weight](权重)ipvsadm -d -t|u|f service-address -r server-address 删除RSipvsadm -L|l [options] 查看RSipvsadm -Z [-t|u|f service-address] 清楚计数器
8.2.2 参数解释
参数 | 功能 |
---|---|
-A --add-service | 添加一条新的虚拟服务 |
-E --edit-service | 编辑虚拟服务 |
-D --delete-service | 删除虚拟服务 |
-C --clear | 清除所有的虚拟服务规则 |
-R --restore | 恢复虚拟服务规则 |
-a --add-server | 在一个虚拟服务中添加一个新的真实服务器 |
-e --edit-server | 编辑某个真实服务器 |
-d --delete-server | 删除某个真实服务器 |
-L | -l --list | 显示内核中的虚拟服务规则 |
-n --numeric | 以数字形式显示IP端口 |
-c --connection | 显示ipvs中目前存在的连接,也可以用于分析调度情况 |
-Z --zero | 将转发消息的统计清零 |
-p --persistent | 配置持久化时间 |
–set tcp tcpfin udp | 配置三个超时时间(tcp/tcpfin/udp) |
-t | -u | TCP/UDP协议的虚拟服务 |
-g | -m | -i | LVS模式为:DR | NAT | TUN |
-w | 配置真实服务器的权重 |
-s | 配置负载均衡算法,如:rr, wrr, lc等 |
–timeout | 显示配置的tcp/tcpfin/udp超时时间 |
–stats | 显示历史转发消息统计(累加值) |
–rate | 显示转发速率信息(瞬时值) |
8.3 LVS集群中的增删改
8.3.1 管理集群服务中的增删改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]-A # 添加
-E # 修改
-t # tcp服务
-u # udp服务
-s # 指定调度算法,默认为WLC
-p # 设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f # firewall mask 火墙标记,是一个数字# 增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000 # 修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000 # 删除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66
8.3.2 管理集群中RealServer的增删改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]-a # 添加realserver
-e # 更改realserver
-t # tcp协议
-u # udp协议
-f # 火墙 标签
-r # realserver地址
-g # 直连路由模式
-i # ipip隧道模式
-m # nat模式
-w # 设定权重
-Z # 清空计数器
-C # 清空lvs策略
-L # 查看lvs策略
-n # 不做解析
--rate # 输出速率信息
# 添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2 # 更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1 # 删除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
[root@DR-server ~]# ipvsadm -Ln
[root@DR-server ~]# ipvsadm -Ln --rate[root@DR-server ~]# ipvsadm -C
[root@DR-server ~]# ipvsadm -Z -t 172.25.254.20:80
[root@DR-server ~]# ipvsadm -Ln --rate
- pvs规则:/proc/net/ip_vs
- ipvs连接:/proc/net/ip_vs_conn
# 保存
# 1.第一种方法
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm-config # 此过程很慢;想要快点可以去/etc/hosts做dns解析# 2.第二种方法
# 相当于 lvs:http <==> 172.25.254.100:80
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm-config
# 恢复策略如下图(也可在NAT部署实战查看详细):

11. LVS实战案例
11.1 部署NAT模式集群案例
11.1.1 架构图如下
11.1.2 部署过程如下
1. 实验环境
主机 | IP | VIP | 网关 | 角色 |
---|---|---|---|---|
lvs | 192.168.0.100 | 172.25.254.100 | 172.25.254.2 | 调度器VS |
webserver-01 | 192.168.0.10 | NULL | 192.168.0.100 | 真实服务器RS |
webserver-02 | 192.168.0.20 | NULL | 192.168.0.100 | 真实服务器RS |
Client | 172.25.254.200 | NULL | 172.25.254.2 | 客户端 |


1.LVS使用vmset.sh之后记得将第二张网卡(仅主机)的网关与DNS删除即可NAT:172.25.254.100 仅主机:192.168.0.100
2.两台webserver需要提前将网卡调整至仅主机模式,如下图所示:s-01:192.168.0.10 # 网关:192.168.0.100 为LVS仅主机的IPs-02:192.168.0.20 # 网关:192.168.0.100 为LVS仅主机的IP
3.客户端client使用vmset.sh之后即可NAT:172.25.254.200systemctl disable --now firewalld # 四台主机都执行!

2. 配置命令
(1)LVS中打开内核路由功能
# 查询一下连接状态
[root@LVS ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0# 写入参数并查看
[root@LVS ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@LVS ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1# 启用
[root@LVS ~]# sysctl -p
net.ipv4.ip_forward = 1

(2)两台server主机进行测试,并在lvs里面进行必要的测试
dnf install -y httpdecho xxxxxx > /var/www/html/index.html # 测试时xxxx的内容最好不一样可以看得更直观一点!# 在真实生产环境中,两台server配置必须一模一样!
systemctl enable --now httpd# 完成之后可以在LVS里面进行检测;
[root@lvs ~]# curl 192.168.0.10[root@lvs ~]# curl 192.168.0.20# 如果出现'No route to host'问题,建议关闭火墙或者增添必要火墙命令
(3)在lvs中安装lvs软件–ipvsadm
[root@lvs ~]# dnf install -y ipvsadm
(4)添加调度策略、并查看
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr# -A:添加策略# -t:tcp协议# 172.25.254.100:80 集群地址:端口# -s rr -s:调度算法 rr:轮询算法[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m# -a:新添一台RS# -t:tcp协议# 172.25.254.100:80 集群地址:端口# -r:RS地址(端口)# -m:LVS模式为NAT模式[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m[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 172.25.254.100:80 rr-> 192.168.0.10:80 Masq 1 0 0-> 192.168.0.20:80 Masq 1 0 0

(5)客户端测试
[root@client ~]# hostname -I
172.25.254.200
[root@client ~]# for i in {1..10}; do curl 172.25.254.100; done
webserver-01 - 192.168.0.10
webserver-02 - 192.168.0.20
webserver-01 - 192.168.0.10
webserver-02 - 192.168.0.20
webserver-01 - 192.168.0.10
webserver-02 - 192.168.0.20
webserver-01 - 192.168.0.10
webserver-02 - 192.168.0.20
webserver-01 - 192.168.0.10
webserver-02 - 192.168.0.20

(6)进行策略保存
# 1.第一种方法
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm-config # 此过程很慢;想要快点可以去/etc/hosts做dns解析[root@lvs ~]# more /etc/sysconfig/ipvsadm-config
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -m -w 1
-a -t lvs:http -r 192.168.0.20:http -m -w 1# 2.第二种方法
# 相当于 lvs:http <==> 172.25.254.100:80
[root@lvs ~]# ipvsadm -Sn
-A -t 172.25.254.100:80 -s rr
-a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1
-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm-config

可选–(7)命令测试:删除所有规则并重载规则、并客户端测试
[root@lvs ~]# ipvsadm -C # 清空规则
[root@lvs ~]# ipvsadm -Ln# 重新加载规则(前提:进行过保存...)
[root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm-config
[root@lvs ~]# ipvsadm -Ln# 在客户端中再次进行测试
[root@client ~]# for i in {1..20}; do curl 172.25.254.100; done
可选–(8)将ipvsadm.service调为开机自启
systemctl enable --now ipvsadm.service
可选–(9)算法测试:轮询算法–>权重调用算法
[root@lvs ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr
[root@lvs ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
[root@lvs ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1[root@lvs ~]# ipvsadm -Sn
-A -t 172.25.254.100:80 -s wrr
-a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1# 客户端测试
[root@client ~]# for i in {1..30}; do curl 172.25.254.100; done

11.2 部署DR模式集群案例
11.2.1 架构图如下

11.2.2 部署过程如下
1. 实验环境
主机 | 网络适配器 (NAT/仅主机/双网卡) | IP、VIP | GateWay | 角色 |
---|---|---|---|---|
CLIENT | NAT | NAT:172.25.254.200 | 172.25.254.100 | 客户端 |
ROUTER | 双网卡 | NAT:172.25.254.100 仅主机:192.168.0.100 | null | 路由器 |
LVS | 仅主机 | 仅主机: lo:VIP:192.168.0.200 DIP:192.168.0.50 | 192.168.0.100 | 负载调度器 |
WEBSERVER-01 | 仅主机 | 仅主机: lo:VIP:192.168.0.200 DIP:192.168.0.10 | 192.168.0.100 | 真实服务器-01 |
WEBSERVER-02 | 仅主机 | 仅主机: lo:VIP:192.168.0.200 DIP:192.168.0.20 | 192.168.0.100 | 真实服务器-02 |



cat /etc/NetworkManager/system-connections/网卡名.nmconnection# 查看一下网卡配置
# 提示:如果是使用的vmset.sh配置的信息,记得要修改仅主机网卡的网关及相关信息
# 仅主机模式下,三台主机(LVS+WS-01+WS-02)的网关都为路由器(ROUTER)仅主机模式下的IP地址# 可以使用 route -n 查看路由表

[root@WEBSERVER-01 ~]# route -n
[root@WEBSERVER-02 ~]# route -n# 由此可知,两台主机的网关都在路由器的内网接口上!

# 测试一下路由器与客户端是否可以ping通全网(如下图所示):
# 客户端:
[root@CLIENT ~]# hostname -I
172.25.254.200
[root@CLIENT ~]# ping -c1 172.25.254.100
[root@CLIENT ~]# ping -c1 192.168.0.50
[root@CLIENT ~]# ping -c1 192.168.0.10
[root@CLIENT ~]# ping -c1 192.168.0.20# 路由器:
[root@ROUTER ~]# hostname -I
172.25.254.100 192.168.0.100
[root@ROUTER ~]# ping -c1 172.25.254.200
[root@ROUTER ~]# ping -c1 192.168.0.50
[root@ROUTER ~]# ping -c1 192.168.0.10
[root@ROUTER ~]# ping -c1 192.168.0.20

# 关闭SELinux及火墙
# 由于母盘已将SELinux关闭,此处不考虑;只考虑火墙
# 为每一台主机(除过)进行火墙关闭!
systemctl disable --now firewalld
- ROUTER 主机打开内核路由功能
[root@ROUTER ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0[root@ROUTER ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf[root@ROUTER ~]# sysctl -p
net.ipv4.ip_forward = 1
2. 解决vip响应配置部署步骤
(1)在LVS与WEBSERVER中设定lo:VIP
[root@LVS ~]# ip addr add dev lo 192.168.0.200/32
[root@WEBSERVER-01 ~]# ip addr add dev lo 192.168.0.200/32
[root@WEBSERVER-02 ~]# ip addr add dev lo 192.168.0.200/32# 也可以lvs直接使用回环网卡(但是需要桥接网络,不推荐),如下图配置:
# 但是建议RS-01与RS-02写入配置
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
address1=127.0.0.1/8,
address2=172.25.254.200/32,
method=manual


(2)在WEBSERVER-01与WEBSERVER-02中解决响应问题(可以写入配置文件)
# arp广播的作用:获取MAC地址# server-01:
# 全局限制arp响应(防止arp冲突 --> all.arp_ignore = 1 )
# 全局限制arp宣告(确保服务器不将VIP宣告到外部网络 --> all.arp_announce = 2 ;2-->只响应本机;1-->响应外部网络)
# 隔离环回接口接应(lo.arp_ignore = 1)
# 隔离环回接口宣告(lo.arp_announce = 2)
[root@WEBSERVER-01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@WEBSERVER-01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce[root@WEBSERVER-01 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@WEBSERVER-01 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore[root@WEBSERVER-01 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 0
net.ipv4.conf.eth0.arp_ignore = 0
net.ipv4.conf.lo.arp_ignore = 1[root@WEBSERVER-01 ~]# sysctl -a | grep arp_announce
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 0
net.ipv4.conf.eth0.arp_announce = 0
net.ipv4.conf.lo.arp_announce = 2[root@WEBSERVER-01 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
[root@WEBSERVER-01 ~]# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
[root@WEBSERVER-01 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf
[root@WEBSERVER-01 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf[root@WEBSERVER-01 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2# server-02:
# 全局限制arp响应(防止arp冲突 --> all.arp_ignore = 1 )
# 全局限制arp宣告(确保服务器不将VIP宣告到外部网络 --> all.arp_announce = 2 )
# 隔离环回接口接应(lo.arp_ignore = 1)
# 隔离环回接口宣告(lo.arp_announce = 2)
[root@WEBSERVER-02 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@WEBSERVER-02 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce[root@WEBSERVER-02 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@WEBSERVER-02 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore[root@WEBSERVER-02 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 0
net.ipv4.conf.eth0.arp_ignore = 0
net.ipv4.conf.lo.arp_ignore = 1[root@WEBSERVER-02 ~]# sysctl -a | grep arp_announce
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 0
net.ipv4.conf.eth0.arp_announce = 0
net.ipv4.conf.lo.arp_announce = 2[root@WEBSERVER-02 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
[root@WEBSERVER-02 ~]# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
[root@WEBSERVER-02 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
[root@WEBSERVER-02 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf[root@WEBSERVER-02 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

(3)在LVS中配置策略、保存/还原
# 先下载命令
[root@LVS ~]# dnf install -y ipvsadm# 配置策略
[root@LVS ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -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.0.200:80 wrr-> 192.168.0.10:80 Route 1 3 0-> 192.168.0.20:80 Route 2 4 0# 进行策略保存
[root@LVS ~]# ipvsadm-save > /etc/sysconfig/ipvsadm-config# 后期开机后如果被清空ipvsadm -C
# 策略还原
[root@LVS ~]# ipvsadm-R < /etc/sysconfig/ipvsadm-config
3. 测试
# 两台RS主机下载httpd进行测试
# RS-01:
[root@WEBSERVER-01 ~]# yum install -y httpd
[root@WEBSERVER-01 ~]# systemctl enable --now httpd
[root@WEBSERVER-01 ~]# echo "this is WEBSERVER-01: `hostname -I`" > /var/www/html/index.html# RS-02:
[root@WEBSERVER-02 ~]# yum install -y httpd
[root@WEBSERVER-02 ~]# systemctl enable --now httpd
[root@WEBSERVER-02 ~]# echo "this is WEBSERVER-02: `hostname -I`" > /var/www/html/index.html