因公司做小型IPTV系统,需要负载均衡。所以在网上查资料,自己试验了一下。记录如下
1. 概图
首先使网络正常,各个主机之间能正常通信。关闭防火墙或者打开相应端口。
查看版本都可以用 lsb_release -a
LVS服务器 | centos8 |
R1 109 | ubuntu18.4 |
R2 9 | ubuntu18.4 |
VIP:192.168.1.10 LVS服务器和后端服务器都必须配置。
2. arp_ignore arp_announce值
arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作。
限制响应 arp_ignore
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
限制通告 arp_announce
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
[root@centos8 ~]# cat /proc/sys/net/ipv4/conf/lo/arp_ignore
0
[root@centos8 ~]# cat /proc/sys/net/ipv4/conf/lo/arp_announce
0
4.LVS服务器:
安装ipvsadm
#!/bin/bash
ipvsadm -A -t 192.168.1.10:9081 -s rr
ipvsadm -a -t 192.168.1.10:9081 -r 192.168.1.9:9081 -g -w 1
ipvsadm -a -t 192.168.1.10:9081 -r 192.168.1.109:9081 -g -w 1
ifconfig lo:1 192.168.1.10 broadcast 192.168.1.255 netmask 255.255.255.255 up #也必须配VIP
配置后使用ipvsadm -Ln查看
[root@centos8 home]# 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.1.10:9081 rr
-> 192.168.1.9:9081 Route 1 0 0
-> 192.168.1.109:9081 Route 1 0 0
如果配置错误或者清除配置
ipvsadm -C
清除VIP
ip address del 192.168.1.10 dev lo:1
5. 后端服务器
R1:
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 192.168.1.10 broadcast 192.168.1.255 netmask 255.255.255.255 up
R2:
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 192.168.1.10 broadcast 192.168.1.255 netmask 255.255.255.255 up
配置后能实现轮询。但是还需要设置检测后端在线情况。
6. 检测
客户端使用curl 192.168.1.10:9081测试
在LVS服务器上检测
[root@centos8 home]# ipvsadm -ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.1.10:9081 0 1 0 218 0
-> 192.168.1.9:9081 0 1 0 204 0
-> 192.168.1.109:9081 0 0 0 14 0
CPS (current connection rate) 每秒连接数
InPPS (current in packet rate) 每秒的入包个数
OutPPS (current out packet rate) 每秒的出包个数
InBPS (current in byte rate) 每秒入流量(字节)
OutBPS (current out byte rate) 每秒入流量(字节)
[root@centos8 home]# ipvsadm -l --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP centos8:9081 0 1 0 43 0
-> 192.168.1.9:9081 0 1 0 30 0
-> 192.168.1.109:9081 0 0 0 13 0
Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节)
在R服务器上检测
tcpdump -nn port 直接以端口显示
root@ubuntu18s:/home# tcpdump -nn port 9081
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
02:28:33.367742 IP 192.168.1.134.14403 > 192.168.1.10.9081: Flags [S], seq 1352389272, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
02:28:33.368508 IP 192.168.1.134.14403 > 192.168.1.10.9081: Flags [.], ack 2444804585, win 4106, length 0
02:28:33.368519 IP 192.168.1.134.14403 > 192.168.1.10.9081: Flags [P.], seq 0:81, ack 1, win 4106, length 81
02:28:33.371357 IP 192.168.1.134.14403 > 192.168.1.10.9081: Flags [F.], seq 81, ack 343, win 4104, length 0
02:28:33.372418 IP 192.168.1.134.14403 > 192.168.1.10.9081: Flags [.], ack 344, win 4104, length 0