实例设置vip漂移
我们可以通过 Keepalived 来实现这个过程。 Keepalived 是一个基于 VRRP 协议(Virtual Router Redundancy Protocol,即虚拟路由冗余协议)来实现的LVS(负载均衡器)服务高可用方案,可以利用其来避免单点故障。
一个 LVS 服务会有2台服务器运行 Keepalived,一台为主服务器(MASTER),另一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master,保证路由器的高可用,继续提供服务,从而保证了高可用性。
先来准备两台机器,IP地址如下:
A: 172.24.8.101
B: 172.24.8.107
我们现在要实现添加一个虚IP:172.24.8.150,当 A 机器正常时,172.24.8.150 指向 A,当 A 出现故障时指向 B。
此时通过 ping 可以看到 172.24.8.150 是无法 ping 通的。
安装 Keepalive
$ sudo yum install -y keepalived
配置 Keepalived
A 的配置
$ cat keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface enp7s0f0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.24.8.150
}
}
B 的配置
vrrp_instance VI_1 {
state MASTER
interface enp7s0f0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.24.8.150
}
}
启动 A 和 B 上的 Keepalived 服务
sudo systemctl restart keepalived.service
将 Keepalived 加入开机启动
sudo systemctl enable keepalived.service
测试
通过 ping 172.24.8.150 发现已经可以通了。
查看 A 的 IP信息
$ ip addr show enp7s0f0
2: enp7s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 6c:92:bf:0d:09:47 brd ff:ff:ff:ff:ff:ff
inet 172.24.8.101/24 brd 172.24.8.255 scope global enp7s0f0
valid_lft forever preferred_lft forever
inet 172.24.8.150/32 scope global enp7s0f0
valid_lft forever preferred_lft forever
inet6 fe80::6e92:bfff:fe0d:947/64 scope link
valid_lft forever preferred_lft forever
其中可以看到 inet 172.24.8.150/32 scope global enp7s0f0,说明现在 A 是作为虚拟IP的 master 来运行的。
查看 B 的 IP信息
$ ip addr show enp7s0f0
2: enp7s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 6c:92:bf:0d:21:49 brd ff:ff:ff:ff:ff:ff
inet 172.24.8.107/24 brd 172.24.8.255 scope global enp7s0f0
valid_lft forever preferred_lft forever
inet6 fe80::6e92:bfff:fe0d:2149/64 scope link
valid_lft forever preferred_lft forever
此时 B 中没有虚拟IP 的信息。
验证 Failover
我们手动停止 A 上的 Keepalived 服务
sudo systemctl stop keepalived.service
此时 A 的 IP信息为
$ ip addr show enp7s0f0
2: enp7s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 6c:92:bf:0d:09:47 brd ff:ff:ff:ff:ff:ff
inet 172.24.8.101/24 brd 172.24.8.255 scope global enp7s0f0
valid_lft forever preferred_lft forever
inet6 fe80::6e92:bfff:fe0d:947/64 scope link
valid_lft forever preferred_lft forever
可以看到 A 已经不在有 虚拟IP 的信息了。
查看 B 的 IP信息
ip addr show enp7s0f0
2: enp7s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 6c:92:bf:0d:21:49 brd ff:ff:ff:ff:ff:ff
inet 172.24.8.107/24 brd 172.24.8.255 scope global enp7s0f0
valid_lft forever preferred_lft forever
inet 172.24.8.150/32 scope global enp7s0f0
valid_lft forever preferred_lft forever
inet6 fe80::6e92:bfff:fe0d:2149/64 scope link
valid_lft forever preferred_lft forever
可以看到 B 的 IP信息中 已经有虚拟IP 172.24.8.150 的信息了。
此时如果再把 A 上的 Keepalived 启动,可以看到 虚拟IP 又重新绑定到了 A 上。