在RHEL6搭建 LVS Load Balancer

环境

简单的LVS架构 来源: redhat.com

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 ~]# yum -y install 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 ~]# yum install arptables_jf -y
[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-0 ~]# echo "Real Server 0" > /var/www/html/index.html
[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.

[root@lvs-router ~]# cat /etc/yum.repos.d/rhel.repo
[iso]
name=iso
baseurl=file:///mnt/yum
enabled=1
gpgcheck=0

[loadbalance]
name=loadbalance
baseurl=file:///mnt/yum/LoadBalancer/
enabled=1
gpgcheck=0
[root@lvs-router ~]# yum -y groupinstall "Load Balancer"

2. 在 LVS router 启动图形化服务,用于进行配置操作。

[root@lvs-router ~]# chkconfig piranha-gui on
[root@lvs-router ~]# /etc/init.d/piranha-gui start

为 prianha 用户设定登录密码

[root@lvs-router ~]# piranha-passwd

3. 为便于测试,关闭 iptables.

[root@lvs-router ~]# /etc/init.d/iptables stop
[root@lvs-router ~]# chkconfig iptables off

4. 允许 ip_forward.

[root@lvs-router ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[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 会分别回复请求。

[root@KVM-Host ~]# curl 192.168.122.108
Real Server 1
[root@KVM-Host ~]# curl 192.168.122.108
Real Server 0

ARPUPDATE 选项

搞了这么一堆,是因为客户问,文档[2]中提到的功能,跟 real server 中的 arptable 设置有什么关系。

在使用 ifup 启动网卡时,启动脚本在添加完 ip 地址后,会执行以下两条命令:

# arping -A -c 1 -I eth0 192.168.122.108 ; sleep 2; arping -U -c 1 -I eth0 192.168.122.108

192.168.122.108 是这个网卡对应的 IP 地址。它实际上会广播两个包,告诉同一网络的其他机器“请更新arp缓存,我拥有 192.168.122.108”. 从网络抓包可以看到,它实际上是 Gratuitous ARP 包。

3   2018-06-21 08:56:43.343938  RealtekU_ad:0e:6b       ARP 62  Gratuitous ARP for 192.168.122.252 (Reply)
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