首先为了测试机器,准备两台服务器:

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,如图:

Centos 8 双机热备 linux 双机热备教程_服务器


测试之前先把两台机器的防火墙都关掉:systemctl stop firewalld。然后使用192.168.1.20这个vip链接数据库,如前所述,当前是11占用着vip,因此使用padmin3尝试链接上数据库之后,应该看到11的数据库,如图:

Centos 8 双机热备 linux 双机热备教程_服务器_02


把11的keepalived进程杀掉或者关机:

systemctl stop keepalived.service

再尝试用20链接数据库,看到的应该是9数据库了,表明9服务器接管了当前服务变为主服务器了:

Centos 8 双机热备 linux 双机热备教程_IP_03


现在恢复11服务器,修改掉配置文件里面的priority为99(比9当前的值要小),然后启动keepalived,这样11就由原来的主服务器变为备用服务器了。重新用20这个vip链接数据库,看到的应该仍然是9数据库:

Centos 8 双机热备 linux 双机热备教程_IP_03


现在还有一个问题,前面说的是主备自动切换,两台服务器互为主从的模式,如果我们希望把其中一台服务器作为主服务器,当它宕机的时候,备用服务器接管,当它恢复后,将备用服务器的接管权抢占过来,该怎么做呢,方法就是利用priority这个属性。前面我们说过谁的值大,谁就会抢占vip,然后作为主服务器,也就是说在主服务器宕机恢复后,只要确保它的priority值大于备用服务器,那么它就会自动抢占vip,从而成为主服务器。这里我就不演示了,有需要的话自己可以尝试下。