案例研究:使用VRRP进行失败切换

作为示例,我们可以引入如下LVS拓扑:

架构描述

要使用VRRPv2协议创建虚拟LVS转发器,我们定义如下架构:

  • 2个处于主动-主动配置的LVS转发器。
  • 每个LVS转发器4个VRRP实例:2个处于MASTER状态的VRRP实例和2个处于BACKUP状态的VRRP实例。我们在每个LVS转发器上使用对称状态。
  • 2个处于相同状态的VRRP实例将进行同步,以定义持久化虚拟路由路径。
  • 强认证:IPSEC-AH用于保护我们的VRRP通告免受欺骗和回复攻击。

VRRP实例与以下IP地址混合:

  • VRRP实例VI_1:拥有VRRP VIPs VIP1和VIP2。此实例在LVS转发器1上默认为MASTER状态。它与VI_2保持同步。
  • VRRP实例VI_2:拥有DIP1。此实例在LVS转发器1上默认为MASTER状态。它与VI_1保持同步。
  • VRRP实例VI_3:拥有VRRP VIPs VIP3和VIP4。此实例在LVS转发器2上默认为MASTER状态。它与VI_4保持同步。
  • VRRP实例VI_4:拥有DIP2。此实例在LVS转发器2上默认为MASTER状态。它与VI_3保持同步。

Keepalived配置

整个配置在 /etc/keepalived/keepalived.conf 文件中完成。在我们的案例研究中,LVS转发器1上的该文件如下所示:

vrrp_sync_group VG1 {
    group {
        VI_1
        VI_2
    }
}
vrrp_sync_group VG2 {
    group {
        VI_3
        VI_4
    }
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type AH
        auth_pass k@l!ve1
    }
    virtual_ipaddress {
        192.168.200.10
        192.168.200.11
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth1
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type AH
        auth_pass k@l!ve2
    }
    virtual_ipaddress {
        192.168.100.10
    }
}
vrrp_instance VI_3 {
    state BACKUP
    interface eth0
    virtual_router_id 53
    priority 100
    advert_int 1
    authentication {
        auth_type AH
        auth_pass k@l!ve3
    }
    virtual_ipaddress {
        192.168.200.12
        192.168.200.13
    }
}
vrrp_instance VI_4 {
    state BACKUP
    interface eth1
    virtual_router_id 54
    priority 100
    advert_int 1
    authentication {
        auth_type AH
        auth_pass k@l!ve4
    }
    virtual_ipaddress {
        192.168.100.11
    }
}

然后我们在LVS转发器2上定义对称配置文件。这意味着LVS转发器2上的VI_3和VI_4处于MASTER状态,具有更高的优先级150且从稳定状态开始。LVS转发器2上的VI_1和VI_2处于默认的BACKUP状态,优先级较低为100。此配置文件为每个物理网卡指定2个VRRP实例。当您在LVS转发器1上运行Keepalived而不在LVS转发器2上运行它时,LVS转发器1将拥有所有VRRP VIP。因此,如果您使用ip使用程序(在Debian上,ip实用程序是iprouter的一部分),您可能会看到类似的东西:

[root@lvs1 tmp]# ip address list
1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:00:5e:00:01:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.5/24 brd 192.168.200.255 scope global eth0
    inet 192.168.200.10/32 scope global eth0
    inet 192.168.200.11/32 scope global eth0
    inet 192.168.200.12/32 scope global eth0
    inet 192.168.200.13/32 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:00:5e:00:01:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.5/24 brd 192.168.201.255 scope global eth1
    inet 192.168.100.10/32 scope global eth1
    inet 192.168.100.11/32 scope global eth1

然后只需在LVS转发器2上启动Keepalived,您将看到:

[root@lvs1 tmp]# ip address list
1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:00:5e:00:01:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.5/24 brd 192.168.200.255 scope global eth0
    inet 192.168.200.10/32 scope global eth0
    inet 192.168.200.11/32 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:00:5e:00:01:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.5/24 brd 192.168.201.255 scope global eth1
    inet 192.168.100.10/32 scope global eth1

在LVS转发器2中你会看到对称的:

[root@lvs2 tmp]# ip address list
1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:00:5e:00:01:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.5/24 brd 192.168.200.255 scope global eth0
    inet 192.168.200.12/32 scope global eth0
    inet 192.168.200.13/32 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:00:5e:00:01:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.5/24 brd 192.168.201.255 scope global eth1
    inet 192.168.100.11/32 scope global eth1

所用到的VRRP VIP如下:

  • VIP1 = 192.168.200.10
  • VIP2 = 192.168.200.11
  • VIP3 = 192.168.200.12
  • VIP4 = 192.168.200.13
  • DIP1 = 192.168.100.10
  • DIP2 = 192.168.100.11

使用VRRP关键字 sync_instance 意味着我们已经为每个LVS转发器(VI_1,VI_2)和(VI_3,VI_4)定义了一对MASTER VRRP实例。这意味着如果LVS转发器1上的eth0失败,那么LVS转发器2上的VI_1进入MASTER状态,因此两个转发器上的MASTER实例分布将是:转发器1的(VI_2)和转发器2上的(VI_1,VI_3和VI_4)。使用 sync_instance,因此LVS转发器1上的VI_2将被强制进入BACKUP状态。最终的VRRP MASTER实例分布将是:LVS转发器1的(无)和LVS转发器2的(VI_1,VI_2,,VI_3和VI_4)。如果LVS转发器1上的eth0成为可用时,分布将转换回初始状态。

有关此状态转换的更多信息,请参阅 使用VRRPv2的Linux虚拟服务器的高可用性 (可从http://www.linux-vs.org/~acassen/获得)一文,该文章解释了此功能的实现。

使用此配置,两个LVS转发器都处于主动状态,因此为全局转发器共享LVS转发器。这样我们就引入了虚拟LVS转发器。

注解

此VRRP配置示例演示了高可用性路由器(不是特定于LVS的路由器)。它可以用于许多更常见/简单的需求。