摘要1:https://blog.csdn.net/Jason160918/article/details/100101791
摘要2:https://blog.csdn.net/dap769815768/article/details/87010773
首先为了测试机器,准备两台服务器:
host1 192.168.1.11
host2 192.168.1.9
虚拟ip(vip) 192.168.1.20
第一步:在线安装keepalived中间件
sudo yum install -y keepalived
有时候需要先卸载再安装
sudo yum -y remove keepalived
第二步:配置 keepalived
(1)host1 上 keepalived 配置
$ vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.20
}
}
简单的解释下参数:
ens33是网卡,有些是eth0,可以通过ifconfig命令进行查看;可参考博客:网卡类型
priority 是用来标记主从服务器的,priority 101表示主服务器,priority 100表示从服务器;
virtual_ipaddress表示虚拟ip的地址(随意设置ip,和主从服务器同一网段就行)
(2)host2 上 keepalived 配置
$ vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.20
}
}
这两个配置文件差别就在priority 101与priority 100,分别表示主从关系。
第三步: 启动 keepalived 服务
systemctl start keepalived.service
systemctl enable keepalived.service
第四步:查看IP地址信息
host1上 IP 地址信息
ip addr show ens33
得到输出:
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:61:c8:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 73811sec preferred_lft 73811sec
inet 192.168.1.20/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 240e:398:381:adc0:a396:c304:2e99:860d/64 scope global noprefixroute dynamic
valid_lft 3293sec preferred_lft 3293sec
inet6 fe80::31c7:a65f:a3a7:ec72/64 scope link noprefixroute
valid_lft forever preferred_lft forever
其中可以看到 192.168.1.20/32 scope global ens33,说明现在host1是作为虚拟IP的master来运行的。
host2 上 IP 地址信息
$ ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:45:87:50 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.9/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 71367sec preferred_lft 71367sec
inet6 240e:398:381:adc0:1b29:493b:38c0:cc22/64 scope global noprefixroute dynamic
valid_lft 2645sec preferred_lft 2645sec
inet6 fe80::5fb9:e2ab:8323:f220/64 scope link noprefixroute
valid_lft forever preferred_lft forever
此时host2上ip地址信息中不包含虚拟IP “192.168.1.20” 信息。
第五步:验证 IP 地址 Failover
现在手动停止host1上的 keepalived 服务
systemctl stop keepalived.service
重新查询host1的ip信息
ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:61:c8:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 71285sec preferred_lft 71285sec
inet6 240e:398:381:adc0:a396:c304:2e99:860d/64 scope global noprefixroute dynamic
valid_lft 2564sec preferred_lft 2564sec
inet6 fe80::31c7:a65f:a3a7:ec72/64 scope link noprefixroute
valid_lft forever preferred_lft forever
此时host1上ip地址信息中不包含虚拟IP “192.168.1.20” 信息。
接着在host2上面先停止再开启keepalived服务
systemctl stop keepalived.service
systemctl start keepalived.service
再次查询host2的IP的信息
$ ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:45:87:50 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.9/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
valid_lft 71238sec preferred_lft 71238sec
inet 192.168.1.20/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 240e:398:381:adc0:1b29:493b:38c0:cc22/64 scope global noprefixroute dynamic
valid_lft 2516sec preferred_lft 2516sec
inet6 fe80::5fb9:e2ab:8323:f220/64 scope link noprefixroute
valid_lft forever preferred_lft forever
现在可以看到 host2 上 ip 地址信息中已经包含虚拟IP “192.168.1.20” 信息了。
此时如果再把 host1 上的 keepalived 服务启动,会发现虚拟IP “192.168.1.20” 又重新绑定到 host1 上了。
如何添加ipv6地址类型为虚拟IP(vip)
思路是一样的,在确认好服务器支撑ipv6的情况下,将vip换成ipv6格式的地址就行,若是服务器不支持ipv6,则可以根据教程来添加ipv6支持!
如将192.168.1.20改成2001:fecc:0:622::a/64
首先:重新修改houst1上的keepalived.conf文件
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
2001:fecc:0:622::a/64 #ipv6地址
}
}
重启keepalived服务
systemctl restart keepalived.service
再次查看IP信息
$ ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:ab:d2:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.11/24 brd 172.28.23.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 2001:fecc:0:622::a/64 scope global nodad #虚拟的ipv6地址
valid_lft forever preferred_lft forever
inet6 2001:fecc:0:623::9/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:feab:d219/64 scope link
valid_lft forever preferred_lft forever
其他操作和之前添加vip是一样的。
pgsql测试双机热备
由于11这台机器的priority是101,比9的大,所以,这个时候,vip应该是被11占用着的。为了测试方便,我分别在两台服务器上安装了数据库postgresql,11里面有一个数据库tab_11,9里面有一个数据库tab_09,如图:
测试之前先把两台机器的防火墙都关掉:systemctl stop firewalld。然后使用192.168.1.20这个vip链接数据库,如前所述,当前是11占用着vip,因此使用padmin3尝试链接上数据库之后,应该看到11的数据库,如图:
把11的keepalived进程杀掉或者关机:
systemctl stop keepalived.service
再尝试用20链接数据库,看到的应该是9数据库了,表明9服务器接管了当前服务变为主服务器了:
现在恢复11服务器,修改掉配置文件里面的priority为99(比9当前的值要小),然后启动keepalived,这样11就由原来的主服务器变为备用服务器了。重新用20这个vip链接数据库,看到的应该仍然是9数据库:
现在还有一个问题,前面说的是主备自动切换,两台服务器互为主从的模式,如果我们希望把其中一台服务器作为主服务器,当它宕机的时候,备用服务器接管,当它恢复后,将备用服务器的接管权抢占过来,该怎么做呢,方法就是利用priority这个属性。前面我们说过谁的值大,谁就会抢占vip,然后作为主服务器,也就是说在主服务器宕机恢复后,只要确保它的priority值大于备用服务器,那么它就会自动抢占vip,从而成为主服务器。这里我就不演示了,有需要的话自己可以尝试下。