LVS DR模式到TUN模式的平滑迁移。

一般情况下大家在使用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
ip link set tunl0 up
ip link set tunl0 arp off
for IP in $VIP
do
        NO=$((NO+1))
        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加如,分别重启


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
此条目发表在lvs分类目录。将固定链接加入收藏夹。