keepalived.conf

# 192.168.56.155 keepalived.conf配置
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL_CEPH
}

vrrp_script chk_ceph_port {
#检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/script/ceph.sh"
    #这里通过脚本监测
    interval 2
    #脚本执行间隔,每2s检测一次
    weight -5
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1
    #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    #指定虚拟ip的网卡接口
    mcast_src_ip 192.168.56.155
    #本机IP
    virtual_router_id 51
    #路由器标识,MASTER和BACKUP必须是一致的
    priority 101
    # 非抢占式标识
    nopreempt
    #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 
    advert_int 1
    unicast_peer {
        192.168.56.156
        192.168.56.157
    }
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.56.199
    }

    track_script {
        chk_ceph_port
    }
}

virtual_server 192.168.56.199 80 {
    delay_loop 2   #每2秒检查一次
#    lb_algo rr
#    lb_kind NAT  LVS模式,如果不关闭,服务器不能通过VIP连接MySQL
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    #IP为当前主机IP,80为检测端口
    real_server 192.168.56.155 80 {
        weight 3
        #当mysql服务宕了时,执行杀死keepalieved脚本
        notify_down /etc/keepalived/script/ceph.sh
          TCP_CHECK{
            connect_timeout 3  #连接超时时间
            nb_get_retry 3  #重连次数
            delay_before_retry 3  #重连间隔时间
            connect_port 80  #检查的端口
        }
    }
}

ceph.sh

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "80"|wc -l)
if [ "${counter}" == 0 ];then
   systemctl stop keepalived
fi