lvs -> vs/dr 负载均衡配置

DR 负载均衡模式数据分发过程中不修改 IP 地址,只修改 MAC 地址,由于实际处理请求的真实物理 IP 地址和数据请求目的 IP 地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR 模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

vs/dr

DR 模式下需要 LVS 和 RS 集群绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现);
与 NAT 的不同点在于:请求由 LVS 接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过 LVS。

一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木;
RS 收到 LVS 转发来的包时,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。
而当 RS 返回响应时,只要直接向源 IP(即用户 IP)返回即可,不再经过 LVS,因此效率相比 NAT 模式大大提高。

实验环境说明

OS:CentOS 7.2
vip:192.168.255.111
dip:192.168.255.103
rip1:192.168.255.104
rip2:192.168.255.105

负载均衡配置

VS(192.168.255.103)
安装 ipvsadm:yum -y install ipvsadm
安装 vs/dr 服务脚本:

vim /etc/init.d/lvs_dr
--- lvs_dr ---
#!/bin/bash

. /etc/init.d/functions

vip=192.168.255.111
rip1=192.168.255.104
rip2=192.168.255.105

case $1 in
start)
    ip addr add $vip/32 broadcast $vip dev eno16777736
    ip route add $vip/32 dev eno16777736
    ipvsadm -C
    ipvsadm -At $vip:80 -s rr
    ipvsadm -at $vip:80 -r $rip1:80 -g
    ipvsadm -at $vip:80 -r $rip2:80 -g
    ;;
stop)
    ipvsadm -C
    ip addr del $vip/32 dev eno16777736
    ip route del $vip/32 dev eno16777736
    ;;
status)
    ipvsadm -ln
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
    ;;
esac

exit 0
--- lvs_dr ---

chmod +x /etc/init.d/lvs_dr

RS(192.168.255.104/105)
为了便于实验,我们让两台 RS 的网页内容不一样,以便识别,实际生产中应保持一致!:

### 192.168.255.104 ###
echo '<h1>104</h1>' > /usr/share/nginx/html/index.html

### 192.168.255.105 ###
echo '<h1>105</h1>' > /usr/share/nginx/html/index.html

安装 vs/dr 服务脚本:

vim /etc/init.d/lvs_dr
--- lvs_dr ---
#!/bin/bash

. /etc/init.d/functions

vip=192.168.255.111

case $1 in
start)
    ip addr add $vip/32 broadcast $vip dev lo
    ip route add $vip/32 dev lo
    echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore 
    echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce 
    echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore 
    echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
    ;;
stop)
    ip addr del $vip/32 dev lo
    ip route del $vip/32 dev lo
    echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore 
    echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce 
    echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore 
    echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
    ;;
*)
    echo "Usage: $0 {start|stop}"
    exit 1
esac

exit 0
--- lvs_dr ---

chmod +x /etc/init.d/lvs_dr

负载均衡测试

先运行 vs/dr 脚本:

### vs: 192.168.255.103
service lvs_dr start

### rs1: 192.168.255.104
service lvs_dr start

### rs2: 192.168.255.105
service lvs_dr start

正常情况
vs/dr
down 机时(192.168.255.105 -> systemctl stop nginx
vs/dr
恢复正常时(192.168.255.105 -> systemctl start nginx
vs/dr