环境
feichashao_RHEL610_real-server-0 192.168.122.152
feichashao_RHEL610_real-server-1 192.168.122.9
feichashao_RHEL610_lvs_router 192.168.122.146
VIP: 192.168.122.108
在这个环境中,有一个 LVS router 和两个 Real Server. LVS Router 负责把流量转发到 Real Server 中, Real Server 是真正处理请求的。
搭建步骤 - real servers
1. 在两个 real servers 中,安装 apache httpd 服务。
[root@real-server-0 ~]# iptables -F
[root@real-server-0 ~]# chkconfig iptables off
2. 配置 arptable 规则。在这个测试中,LVS 使用 Direct Route 模式, LVS router 和两个 Read Server 都配有 VIP 192.168.122.108. 所以,两个 Read Server 在看到 arp 请求时,不应该作任何应答,否则流量会绕过 LVS router 直接到达 Real Server.
[root@real-server-0 ~]# ip addr add 192.168.122.108 dev eth0
[root@real-server-0 ~]# arptables -A IN -d 192.168.122.108 -j DROP
[root@real-server-0 ~]# arptables -A OUT -s 192.168.122.108 -j mangle --mangle-ip-s 192.168.122.146
[root@real-server-0 ~]# service arptables_jf save
[root@real-server-0 ~]# chkconfig arptables_jf on
3. 在两个 read server 分别配置不同的网页,后续测试中可以辨别是由哪个 read server 给出的回应。
[root@real-server-1 ~]# echo "Real Server 1" > /var/www/html/index.html
搭建步骤 - LVS router
1. 在 LVS router 中,安装 "Load Balancer" 相关软件包。这些软件包不在 base channel里,需要开启 Load Balancer 的相关 channel.
[iso]
name=iso
baseurl=file:///mnt/yum
enabled=1
gpgcheck=0
[loadbalance]
name=loadbalance
baseurl=file:///mnt/yum/LoadBalancer/
enabled=1
gpgcheck=0
2. 在 LVS router 启动图形化服务,用于进行配置操作。
[root@lvs-router ~]# /etc/init.d/piranha-gui start
为 prianha 用户设定登录密码
3. 为便于测试,关闭 iptables.
[root@lvs-router ~]# chkconfig iptables off
4. 允许 ip_forward.
[root@lvs-router ~]# sysctl -p
5. 通过浏览器打开 Web UI 进行配置。
a. 在 Global Settings 里,设置 LVS router 的 IP 地址,然后选择 Direct Routing.
b. 在 Virtual Servers 里,设置 VIP,以及端口。
c. 在 Real Server 里填上 Real Server 的真实地址。
测试
在一个能连上 LVS router 的机器进行测试。可以看到,在 round-robin 的模式下,Real Server 0 和 Real Server 1 会分别回复请求。
Real Server 1
[root@KVM-Host ~]# curl 192.168.122.108
Real Server 0
ARPUPDATE 选项
搞了这么一堆,是因为客户问,文档[2]中提到的功能,跟 real server 中的 arptable 设置有什么关系。
在使用 ifup 启动网卡时,启动脚本在添加完 ip 地址后,会执行以下两条命令:
192.168.122.108 是这个网卡对应的 IP 地址。它实际上会广播两个包,告诉同一网络的其他机器“请更新arp缓存,我拥有 192.168.122.108”. 从网络抓包可以看到,它实际上是 Gratuitous ARP 包。
4 2018-06-21 08:56:45.347882 RealtekU_ad:0e:6b ARP 62 Gratuitous ARP for 192.168.122.252 (Request)
在 LVS direct routing 环境中,如果 real server 的网卡配置中写有 VIP, 那么在启动这个网卡时,它会广播上述的 arp 包,导致网络中的其他机器刷新 arp 记录,把本该发送到 LVS router 的流量直接发送到了 real server 中,绕过了 LVS.
因此,在这种情况下,需要在 real server 的 ifcfg-ethX 文件中,添加 ARPUPDATE=no 的选项,这样在启动网卡时,real server 不会向外广播 Gratuitous ARP [3].
参考文档
[1] LOAD BALANCER ADMINISTRATION
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/load_balancer_administration/index
[2] The ARPUPDATE option for ifcfg-* files has been introduced
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/6.10_release_notes/new_features_installation_and_booting
[3] https://wiki.wireshark.org/Gratuitous_ARP