Keepalived其它高可用性

详细介绍了vrrp script的使用,以及一些生产实例。最后说了一下如何通过邮件发送通知信息

3.7实现其它应用的高可用性 VRRP Script

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

参考配置文件:

/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck

3.7.1 VRRP Script 配置

分两步实现:

  • 定义脚本
    vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
    通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点
    vrrp_script <SCRIPT_NAME> {
    script <STRING>|<QUOTED-STRING>  #此脚本返回值为非0时,会触发下面OPTIONS执行
    OPTIONS
    }
    
  • 调用脚本
    track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script
    track_script {
    SCRIPT_NAME_1
    SCRIPT_NAME_2
    }
    

3.7.1.1 定义 VRRP script

vrrp_script <SCRIPT_NAME> {         #定义一个检测脚本,在global_defs 之外配置
  script <STRING>|<QUOTED-STRING>   #shell命令或脚本路径
  interval <INTEGER>                #间隔时间,单位为秒,默认1秒
  timeout <INTEGER>                 #超时时间
  weight <INTEGER:-254..254>        #默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
  fall <INTEGER>                    #脚本几次失败转换为失败,建议设为2以上
  rise <INTEGER>                    #脚本连续监测成功后,把服务器从失败标记为成功的次数
  user USERNAME [GROUPNAME]         #执行监测脚本的用户或组   
  init_fail                         #设置默认标记为失败状态,监测成功之后再转换为成功状态
}

3.7.1.2 调用 VRRP script

vrrp_instance VI_1 {
    …
    track_script {
        chk_down
    }
}

3.7.2 实战案例:利用脚本实现主从角色切换

#修改keepalived主配置文件
[root@ka1 ~]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     448803503@qq.com
   }
   notification_email_from 448803503@qq.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#这一部分可以写在子配置文件中,但是可能出现先运行了vrrp的子配置文件而不知道其中调用的脚本是什么的报错,所以建议直接写在主配置文件中
vrrp_script down {
    script "[ ! -f /etc/keepalived/down ]"  #/etc/keepalived/down存在时返回非0,触发权重-30
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}

include /etc/keepalived/conf.d/*.conf


#修改vrrp配置文件
[root@ka1 ~]#cat /etc/keepalived/conf.d/master.conf 
vrrp_instance test1 {
    state MASTER
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    preempt_delay 5
    authentication {
        auth_type PASS
        auth_pass sunxiang
    }
    virtual_ipaddress {
        10.0.0.15 dev ens33 laber ens33:0
    }
    track_script {                          #调用脚本
        down
    }
}   


#重启服务
[root@ka1 ~]#systemctl restart keepalived.service 
#监控日志
[root@ka1 ~]#tail -f /var/log/messages
Dec 30 08:39:09 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:09 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:09 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:09 ka1 avahi-daemon[909]: Registering new address record for 10.0.0.15 on ens33.IPv4.
Dec 30 08:39:14 ka1 Keepalived_vrrp[2474]: (test1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.15
Dec 30 08:39:14 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:14 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:14 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:14 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:39:14 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15


#创建/etc/keepalived/down文件
[root@ka1 ~]#touch /etc/keepalived/down

#查看日志
Dec 30 08:39:23 ka1 systemd[1]: Started Session 4 of user root.
Dec 30 08:39:23 ka1 systemd-logind[1019]: New session 4 of user root.
Dec 30 08:39:39 ka1 Keepalived_vrrp[2474]: Script `down` now returning 1
Dec 30 08:39:41 ka1 Keepalived_vrrp[2474]: VRRP_Script(down) failed (exited with status 1)
Dec 30 08:39:41 ka1 Keepalived_vrrp[2474]: (test1) Changing effective priority from 100 to 70
Dec 30 08:39:44 ka1 Keepalived_vrrp[2474]: (test1) Master received advert from 10.0.0.21 with higher priority 80, ours 70
Dec 30 08:39:44 ka1 Keepalived_vrrp[2474]: (test1) Entering BACKUP STATE
Dec 30 08:39:44 ka1 Keepalived_vrrp[2474]: (test1) removing VIPs.
Dec 30 08:39:44 ka1 avahi-daemon[909]: Withdrawing address record for 10.0.0.15 on ens33.
Dec 30 08:40:26 ka1 Keepalived_vrrp[2474]: Script `down` now returning 0
Dec 30 08:40:27 ka1 Keepalived_vrrp[2474]: VRRP_Script(down) succeeded


#在ka2上查看ip信息
[root@ka2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ff:33:b2 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.21/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.25/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.15/32 scope global ens33                #成功获取虚拟ip
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feff:33b2/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever


#删除/etc/keepalived/down文件
[root@ka1 ~]#rm -f /etc/keepalived/down 


#查看日志
ec 30 08:40:27 ka1 Keepalived_vrrp[2474]: (test1) Changing effective priority from 70 to 100
Dec 30 08:40:27 ka1 Keepalived_vrrp[2474]: (test1) received lower priority (80) advert from 10.0.0.21 - discarding
Dec 30 08:40:28 ka1 Keepalived_vrrp[2474]: (test1) received lower priority (80) advert from 10.0.0.21 - discarding
Dec 30 08:40:29 ka1 Keepalived_vrrp[2474]: (test1) received lower priority (80) advert from 10.0.0.21 - discarding
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: (test1) Receive advertisement timeout
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: (test1) Entering MASTER STATE
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: (test1) setting VIPs.
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: (test1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.15
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:30 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:30 ka1 avahi-daemon[909]: Registering new address record for 10.0.0.15 on ens33.IPv4.
Dec 30 08:40:35 ka1 Keepalived_vrrp[2474]: (test1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.15
Dec 30 08:40:35 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:35 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:35 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:35 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 08:40:35 ka1 Keepalived_vrrp[2474]: Sending gratuitous ARP on ens33 for 10.0.0.15


#在ka1上查看ip信息
[root@ka1 ~]#ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:95:b7:a2 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.11/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.15/32 scope global ens33                #vip成功切回
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe95:b7a2/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

3.7.3 实战案例:实现单主模式的Nginx反向代理的高可用

#两台keepalived服务器安装nginx
[root@ka1 ~]#yum install -y nginx
[root@ka2 ~]#yum install -y nginx

#修nginx改配置文件,配置反向代理(注意:需要将nginx主配置文件中的server部分注释掉)
[root@ka1 ~]#cat /etc/nginx/conf.d/test.conf 
upstream websrvs {
    server 10.0.0.20:80 weight=1;
    server 10.0.0.30:80 weight=1;
}

server {
    listen 80;
    location / {
        proxy_pass http://websrvs;
    }
}

[root@ka2 ~]#cat /etc/nginx/conf.d/test.conf
upstream websrvs {
    server 10.0.0.20:80 weight=1;
    server 10.0.0.30:80 weight=1;
}

server {
    listen 80;
    location / {
        proxy_pass http://websrvs;
    }
}

#启动nginx服务
[root@ka1 ~]#systemctl enable --now nginx.service 
[root@ka2 ~]#systemctl enable --now nginx.service 
#修改keepalived主配置文件创建监脚本
[root@ka1 ~]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     448803503@qq.com
   }
   notification_email_from 448803503@qq.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script nginx {
    script " /usr/bin/killall -0 nginx"
    #script "/etc/keepalived/check_nginx.sh" 支持此写法,一般较复杂的都会用脚本此处写脚本路径即可
    #script "/usr/bin/killall -0 nginx &>/dev/null" 不支持&>此写法
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}

include /etc/keepalived/conf.d/*.conf

#修改vrrp配置文件调用脚本
[root@ka1 ~]#cat /etc/keepalived/conf.d/master.conf 
vrrp_instance test1 {
    state MASTER
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    preempt_delay 5
    authentication {
        auth_type PASS
        auth_pass sunxiang
    }
    virtual_ipaddress {
        10.0.0.15 dev ens33 laber ens33:0
    }
    track_script {
        nginx
    }
}        

#ka2上与ka1上基本相同就改一下优先级、router_id、主备模式即可

#重启服务
[root@ka1 ~]#systemctl restart keepalived.service 
[root@ka2 ~]#systemctl restart keepalived.service 
#查看日志
[root@ka1 ~]#tail -f /var/log/messages
Dec 30 09:15:59 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:15:59 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:15:59 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:15:59 ka1 avahi-daemon[909]: Registering new address record for 10.0.0.15 on ens33.IPv4.
Dec 30 09:16:04 ka1 Keepalived_vrrp[5469]: (test1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.15
Dec 30 09:16:04 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:16:04 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:16:04 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:16:04 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:16:04 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15


#在ka1上停nginx服务
[root@ka1 ~]#systemctl stop nginx.service 

#查看日志
Dec 30 09:16:36 ka1 systemd[1]: Stopping The nginx HTTP and reverse proxy server...
Dec 30 09:16:36 ka1 systemd[1]: nginx.service: Succeeded.
Dec 30 09:16:36 ka1 systemd[1]: Stopped The nginx HTTP and reverse proxy server.
Dec 30 09:16:37 ka1 Keepalived_vrrp[5469]: Script `nginx` now returning 1
Dec 30 09:16:39 ka1 Keepalived_vrrp[5469]: VRRP_Script(nginx) failed (exited with status 1)
Dec 30 09:16:39 ka1 Keepalived_vrrp[5469]: (test1) Changing effective priority from 100 to 70
Dec 30 09:16:42 ka1 Keepalived_vrrp[5469]: (test1) Master received advert from 10.0.0.21 with higher priority 80, ours 70
Dec 30 09:16:42 ka1 Keepalived_vrrp[5469]: (test1) Entering BACKUP STATE
Dec 30 09:16:42 ka1 Keepalived_vrrp[5469]: (test1) removing VIPs.
Dec 30 09:16:42 ka1 avahi-daemon[909]: Withdrawing address record for 10.0.0.15 on ens33.

#启动nginx服务
[root@ka1 ~]#systemctl restart nginx.service

#查看日志
Dec 30 09:17:12 ka1 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Dec 30 09:17:12 ka1 nginx[5605]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Dec 30 09:17:12 ka1 nginx[5605]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Dec 30 09:17:12 ka1 systemd[1]: Started The nginx HTTP and reverse proxy server.
Dec 30 09:17:13 ka1 Keepalived_vrrp[5469]: Script `nginx` now returning 0
Dec 30 09:17:14 ka1 Keepalived_vrrp[5469]: VRRP_Script(nginx) succeeded
Dec 30 09:17:14 ka1 Keepalived_vrrp[5469]: (test1) Changing effective priority from 70 to 100
Dec 30 09:17:14 ka1 Keepalived_vrrp[5469]: (test1) received lower priority (80) advert from 10.0.0.21 - discarding
Dec 30 09:17:15 ka1 Keepalived_vrrp[5469]: (test1) received lower priority (80) advert from 10.0.0.21 - discarding
Dec 30 09:17:16 ka1 Keepalived_vrrp[5469]: (test1) received lower priority (80) advert from 10.0.0.21 - discarding
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: (test1) Receive advertisement timeout
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: (test1) Entering MASTER STATE
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: (test1) setting VIPs.
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: (test1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.15
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:17 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:17 ka1 avahi-daemon[909]: Registering new address record for 10.0.0.15 on ens33.IPv4.
Dec 30 09:17:22 ka1 Keepalived_vrrp[5469]: (test1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.15
Dec 30 09:17:22 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:22 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:22 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:22 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:17:22 ka1 Keepalived_vrrp[5469]: Sending gratuitous ARP on ens33 for 10.0.0.15
Dec 30 09:20:24 ka1 sssd[kcm][5181]: Shutting down (status = 0)
Dec 30 09:20:24 ka1 systemd[1]: sssd-kcm.service: Succeeded.

#连接测试
root@ubuntu1804:~# curl 10.0.0.15
10.0.0.20
root@ubuntu1804:~# curl 10.0.0.15
10.0.0.30
root@ubuntu1804:~# curl 10.0.0.15
10.0.0.20
root@ubuntu1804:~# curl 10.0.0.15
10.0.0.30
root@ubuntu1804:~# curl 10.0.0.11
10.0.0.20
root@ubuntu1804:~# curl 10.0.0.11
10.0.0.30
root@ubuntu1804:~# curl 10.0.0.11
10.0.0.20
root@ubuntu1804:~# curl 10.0.0.11
10.0.0.30

注意:这里是没有关于nginx的virtual_server的配置文件而是单纯的一看nginx的反向代理功能实现的

3.7.4 实战案例:实现双主模式Nginx反向代理的高可用

#在两个节点都配置nginx反向代理
[root@ka1-centos8 ~]vim /etc/nginx/nginx.conf
http {
    upstream websrvs {
        server 10.0.0.7:80 weight=1;
        server 10.0.0.17:80 weight-1;
    }
    upstream websrvs2 {
        server 10.0.0.27:80 weight=1;
        server 10.0.0.37:80 weight-1;
    }

    server {
        listen 80;
        server_name www.a.com;
        location /{
            proxy_pass http://webservs/;
        }
    }
    server {
        listen 80;
        server_name www.b.com;
        location /{
            proxy_pass http://webservs2/;
        }
    }
}

#在两个节点都配置实现双主模式的nginx反向代理高可用
[root@ka1-centos8 ~]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
    global_defs {
        notification_email {
        root@localhost
        }
    notification_email_from kaadmin@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id ka1               #在另一个节点为ka2
    vrrp_mcast_group4 224.100.100.100
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    #script "/usr/bin/killall -0 nginx"
    interval 1
    weight -30
    fall 3
    rise 5
    timeout 2
}

vrrp_instance VI_1 {
    state MASTER                #在另一个节点为BACKUP
    interface eth0
    virtual_router_id 66
    priority 100                #在另一个节点为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {
        10.0.0.10/24 dev eth0 label eth0:1
    }

    track_interface {
        eth0
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    track_script {
        check_nginx
    }
}

vrrp_instance VI_2 {
    state BACKUP #在另一个节点为MASTER
    interface eth0
    virtual_router_id 88
    priority 80 #在另一个节点为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.0.0.20/24 dev eth0 label eth0:2
    }
    track_interface {
        eth0
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    track_script {
        check_nginx
    }
}

[root@ka1-centos8 ~]# yum install psmisc -y

[root@ka1-centos8 ~]# cat /etc/keepalived/check_nginx.sh
#!/bin/bash
/usr/bin/killall -0 nginx
[root@ka1-centos8 ~]# chmod a+x /etc/keepalived/check_nginx.sh

3.7.5 实战案例:实现HAProxy高可用

#在两个ka1和ka2先实现haproxy的配置
[root@ka1 ~]#cat /etc/haproxy/haproxy.cfg
listen magedu_http
     bind 10.0.0.10:80
     server web1 10.0.0.7:80 check
     server web2 10.0.0.17:80 check

listen stats
     mode http
     bind 10.0.0.8:9999
     stats enable
     log global
     stats uri   /haproxy-status
     stats auth  haadmin:123456

#在两个ka1和ka2两个节点启用内核参数
[root@ka1,2 ~]#vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
[root@ka1,2 ~]#sysctl -p

[root@ka1-centos8 ~]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
    global_defs {
        notification_email {
        root@localhost
        }
    notification_email_from kaadmin@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id ka1 #在另一个节点为ka2
    vrrp_mcast_group4 224.0.100.100
}

vrrp_script check_haproxy { #定义脚本
     script "/etc/keepalived/check_haproxy.sh"
     interval 1
     weight -30
     fall 3
     rise 2
     timeout 2
}

vrrp_instance VI_1 {
    state MASTER #在另一个节点为BACKUP
    interface eth0
    virtual_router_id 66
    priority 100 #在另一个节点为80
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 123456
    }

    virtual_ipaddress {
        10.0.0.10/24 dev eth0 label eth0:1
    }

    track_interface {
        eth0
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    track_script {
        check_haproxy #调用上面定义的脚本
    }
}

[root@ka1-centos8 ~]# yum install psmisc -y

[root@ka1-centos8 ~]# cat /etc/keepalived/check_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy

[root@ka1-centos8 ~]# chmod a+x /etc/keepalived/check_haproxy.sh

3.7.6 实战案例:实现MySQL双主模式的高可用

#先实现MySQL的双主架构
[root@ka1-centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=8
log-bin
auto_increment_offset=1     #开始点
auto_increment_increment=2    #增长幅度 

#在ka2第二个节点创建连接MySQL查看同步状态的授权用户
[root@ka2-centos8 ~]#mysql -uroot -p123456
MariaDB [(none)]> grant replication slave on *.* to repluser@'10.0.0.%' identified by '123456';

#实现MySQL的健康性检测脚本1
[root@ka1-centos8 ~]#vi /etc/keepalived/check_mysql.sh
#!/bin/bash
slave_is=( $(mysql -uroot -p123456 -h10.0.0.18 -e "show slave status\G" | grep "Slave_.*_Running:" | awk '{print $2}') )
if [ "${slave_is[0]}" = "Yes" -a "${slave_is[1]}" = "Yes" ];then
    exit 0
else
    exit 1
fi

#实现MySQL的健康性检测脚本2
[root@ka1-centos8 ~]#vi /etc/keepalived/check_mysql.sh
mysqladmin -uroot -p123456  ping &> /dev/null

#实现MySQL的健康性检测脚本3
[root@ka1-centos8 ~]#vi /etc/keepalived/check_mysql.sh
mysql  -uroot -p123456 -e 'status' &> /dev/null

#实现MySQL的健康性检测脚本4
[root@ka1-centos8 ~]#vi /etc/keepalived/check_mysql.sh
systemctl is-active mariadb &> /dev/null

#配置keepalived调用上面脚本
[root@ka1-centos8 ~]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    notification_email {
    root@localhost
    }
    notification_email_from kaadmin@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id ka1 #在另一个节点为ka2
    vrrp_mcast_group4 224.0.100.100
}

vrrp_script check_mysql { #只需在第一个节点上实现脚本
     script "/etc/keepalived/check_mysql.sh"
     interval 1
     weight -30
     fall 3
     rise 2
     timeout 2
}

vrrp_instance VI_1 {
    state MASTER #在另一个节点为BACKUP
    interface eth0
    virtual_router_id 66
    priority 100 #在另一个节点为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {
        10.0.0.10/24 dev eth0 label eth0:1
    }
    track_interface {
        eth0
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"

    track_script {
        check_mysql #只需在第一个节点上实现脚本
    }
}

3.8 同步组

LVS NAT 模型VIP和DIP需要同步,需要同步组,如图

当vip正常时候在ka1上,出现故障进行切换后在ka2上,如果此时dip还是在ka1上那么就会出现无法访问的情况,所以需要将vip与dip进行捆绑,一个切换另一个也跟着切换,这样可以保证报文的正常转发
vrrp_sync_group VG_1 {
group {
     VI_1  # name of vrrp_instance (below)
     VI_2  # One for each moveable IP
     }
}

vrrp_instance VI_1 {
    eth0
    vip
}

vrrp_instance VI_2 {
    eth1
    dip
}

3.9 Keepalived通知脚本配置

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户keepalived_script身份执行脚本,如果此用户不存在,以root执行脚本
可以用下面指令指定脚本执行用户的身份

global_defs {
    ......
    script_user <USER>
    ......
}

3.9.1 通知脚本类型

  • 当前节点成为主节点时触发的脚本
notify_master <STRING>|<QUOTED-STRING>
  • 当前节点转为备节点时触发的脚本
notify_backup <STRING>|<QUOTED-STRING>
  • 当前节点转为“失败”状态时触发的脚本
notify_fault <STRING>|<QUOTED-STRING>
  • 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
notify <STRING>|<QUOTED-STRING>
  • 当停止VRRP时触发的脚本
notify_stop <STRING>|<QUOTED-STRING>

3.9.2创建通知脚本

[root@ka1 ~]#cat /etc/keepalived/notify.sh 
#!/bin/bash
#
#########################################################################
#File Name:               /etc/keepalived/notify.sh
#Author:                    sx
#QQ:                       448803503
#Created Time:            2021-12-30 10:32:33
#role:        The test script
#########################################################################
contact='448803503@qq.com'

notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac

3.9.3脚本调用

在vrrp语句块的最末尾加上以下内容

notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

3.9.4实战案例

3.9.4.1创建通知脚本

3.9.4.2调用脚本(ka1和ka2都要调用)

[root@ka1 ~]#cat /etc/keepalived/conf.d/master.conf 
vrrp_instance test1 {
    state MASTER
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    preempt_delay 5
    authentication {
        auth_type PASS
        auth_pass sunxiang
    }
    virtual_ipaddress {
        10.0.0.15 dev ens33 laber ens33:0
    }
    track_script {
        nginx
    }
    notify_master "/etc/keepalived/notify.sh master"        #切换为主
    notify_backup "/etc/keepalived/notify.sh backup"        #切换为备
    notify_fault "/etc/keepalived/notify.sh fault"          #切换失败
}     

3.9.4.3配置邮件服务(ka1和ka2都要配置)

[root@ka1 ~]#vim /etc/mail.rc
#在配置文件的最后加上下面这几行内容
set from=448803503@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=448803503@qq.com
set smtp-auth-password=***************(授权码)

3.9.4.3重启服务

[root@ka1 ~]#systemctl restart keepalived.service 
[root@ka2 ~]#systemctl restart keepalived.service 

3.9.4.4模拟故障

#在ka1上停服务,再启动服务