一般情况下大家在使用LVS的时候都很喜欢直接用DR模式,觉得DR模式的效率是最高。不过实际上DR模式在很多时候给我们带来的约束也非常大,最明显的莫过于LVS机器需要和RS机器能有一张网卡共处在一个vlan下。机房环境比较复杂的时候还用DR模式经常会受到各种的约束,比如同一个VLAN的IP都被用光了、同一个交换机下机柜没有空位了,etc。所以实际上我们也经常使用TUN模式。最近遇到一个之前使用DR模式,现在不能扩容的情况,上午就尝试在测试环境测试了一下DR模式到TUN模式的切换,整体影响和LVS主备切换的时候差不多,影响可控。实际的背景是现在LVS1和LVS2做互备给DNS1、DNS2做负载均衡。但是因为找不到机为能和LVS机器挂同一个VLAN下,所以我现在需要把LVS的模式修改为TUN模式,以便对RS直接扩容。机器列表:

LVS:
192.168.100.16 LVS1-slave
192.168.100.17 LVS2-slave
VIP:192.168.100.8
DNS Server:
192.168.100.18 DNS1
192.168.100.22 DNS2
192.168.100.38 DNS3(NEW)
192.168.128.29 DNS4(NEW)

keepalived原来的配置文件:

vrrp_instance dns {
!state MASTER
state BACKUP
interface bond0
lvs_sync_daemon_interface bond0

    virtual_router_id 51     priority 99     advert_int 1     nopreempt     garp_master_delay 1     authentication {         auth_type PASS         auth_pass 1111     }     virtual_ipaddress {         192.168.100.8/22 dev bond0 label bond0:1         #配置的时候主要掩码不要写错了     } }

virtual_server 192.168.100.8 53 {     delay_loop 30     lb_algo rr     lb_kind DR     ha_suspend     persistence_timeout 0     protocol TCP     real_server 192.168.100.18 53 {         weight 100           TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }

        }     real_server 192.168.100.22 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }

} virtual_server 192.168.100.8 53 {     delay_loop 30     lb_algo rr     lb_kind DR     ha_suspend     persistence_timeout 0     omega     protocol UDP     real_server 192.168.100.18 53 {         weight 100           TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }

        }     real_server 192.168.100.22 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }

}

基本的步奏:1. 在RS服务器上把tun设备加上,直接绑定上VIP。有报错提示IP加重复了也没有关系。

#!/bin/bash VIP=‘192.168.100.8’ case $1 in start)

modprobe -r ipip
modprobe ipip
```bash
ip link set tunl0 up
ip link set tunl0 arp off
for IP in $VIP
do
        NO=$((NO+1))
```bash
ip addr add $IP/32 br $IP label tunl0:$NO dev tunl0
ip route add $IP/32 dev tunl0

done

echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

;;

stop)
modprobe -r ipip

;; *)

echo "$0: Usage: $0 {start|stop|status}"
exit 1
;
;
esac
  1. 先把目前做backup状态的LVS配置文件修改掉,改成使用TUN模式。重启好keepalived后把主的服务器停掉,观察主备切换后是否正常。不出问题就可以继续把停掉的这台的配置文件也修改好重启。
  2. 向keeplived里把其他要扩容的RS加如,分别重启

先把目前做backup状态的LVS配置文件修改掉,改成使用TUN模式。重启好keepalived后把主的服务器停掉,观察主备切换后是否正常。不出问题就可以继续把停掉的这台的配置文件也修改好重启。

向keeplived里把其他要扩容的RS加如,分别重启

vrrp_instance test {
!state MASTER
state BACKUP
interface bond0
lvs_sync_daemon_interface bond0

    virtual_router_id 51     priority 99     advert_int 1     nopreempt     garp_master_delay 1     authentication {         auth_type PASS         auth_pass 1111     }     virtual_ipaddress {         192.168.100.8/22 dev bond0 label bond0:1     } }

virtual_server 192.168.100.8 53 {     delay_loop 30     lb_algo rr     #lb_kind DR     lb_kind TUN     ha_suspend     persistence_timeout 0     protocol TCP     real_server 192.168.100.18 53 {         weight 100           TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }

        }     real_server 192.168.100.22 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }     real_server 192.168.100.38 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }

    real_server 192.168.128.29 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }

} virtual_server 192.168.100.8 53 {     delay_loop 30     lb_algo rr     lb_kind TUN     #lb_kind DR     ha_suspend     persistence_timeout 0     omega     protocol UDP     real_server 192.168.100.18 53 {         weight 100           TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }

        }     real_server 192.168.100.22 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }     real_server 192.168.100.38 53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }

    real_server 192.168.128.29  53 {         weight 100                   TCP_CHECK {                         connect_port    53                         connect_timeout 3                         nb_get_retry 3                         delay_before_retry 10                 }     }

}

IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.100.8:53 rr

-> 192.168.128.29:53             Tunnel  100    0          223
-> 192.168.100.38:53             Tunnel  100    0          227
-> 192.168.100.22:53             Tunnel  100    0          224
-> 192.168.100.18:53             Tunnel  100    0          220

TCP  192.168.100.8:53 rr

-> 192.168.128.29:53             Tunnel  100    0          0
-> 192.168.100.38:53             Tunnel  100    0          0
-> 192.168.100.22:53             Tunnel  100    0          0
-> 192.168.100.18:53             Tunnel  100    0          0