LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟服务器集群系统。LVS 的实现模式常用的有三种,我们讲下第三种 Tunnel 模式,常用于跨机房分发。

网络拓扑

拓扑如图:

网络地址

网络地址规划如表,router 需要开启转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward

身份端口地址网关
client192.168.18.250/24192.168.18.254
routereth0192.168.18.254/24
routereth1192.168.19.1/24
lvseth0192.168.19.254/24192.168.19.1
lvstunl0192.168.19.100/32
rs1eth0192.168.19.2/24192.168.19.1
rs1tunl0192.168.19.100/32
rs2eth0192.168.19.3/24192.168.19.1
rs2tunl0192.168.19.100/32

数据走向

客户发起请求:

类型来源目的
MACclientlvs
IP18.25019.100
PORT3345680

LVS 响应请求并再次封包分发请求给 RS:

类型来源目的
MAClvsrs1
IP19.25419.2
IP18.25019.100
PORT3345680

回应请求:

类型来源目的
IP18.25019.100
PORT3345680

操作步骤

  • lvs 服务器:
1
2
3
4
route add -host 192.168.19.100 dev tunl0
ipvsadm -A -t 192.168.19.100:80 -s rr
ipvsadm -a -t 192.168.19.100:80 -r 192.168.19.2 -i
ipvsadm -a -t 192.168.19.100:80 -r 192.168.19.3 -i
  • rs1 服务器:
1
2
3
4
5
route add -host 192.168.19.100 dev tunl0
echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo web1 > /var/www/html/index.html
systemctl start httpd
  • rs2 服务器:
1
2
3
4
5
route add -host 192.168.19.100 dev tunl0
echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo web2 > /var/www/html/index.html
systemctl start httpd

命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
route add -host 192.168.19.100 dev tunl0
# 把 19.100 添加到路由表,防止走 192.168.19.0 网段
ipvsadm -A -t 192.168.19.100:80 -s rr
# ipvsadm 为 LVS 的管理命令,-A 指定虚拟 IP,-t 是 TCP 的协议,后面接的地址需要有端口号,-s 指定轮询的方式
ipvsadm -a -t 192.168.19.100:80 -r 192.168.19.2 -i
# -a 用于添加 RS,-r 指定轮询 IP,-g 是 Tunnel 的模式
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# 收到 ARP 请求闭嘴不说话
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 可以封虚 IP 的回包
echo web1 > /var/www/html/index.html
# 将默认页面内容改为 web1
systemctl start httpd
# 启动 httpd 的服务

注意:如果 httpd 之前有启动,可使用 systemctl restart httpd 重启。

实现效果

效果如图: