keepalived 配置

yum 安装

yum install keepalived -y
yum install tcpdump psmisc

编译安装

cd /opt
yum -y install gcc libnfnetlink-devel libnl3-devel openssl openssl-devel net-snmp-devel wget
wget http://www.keepalived.org/software/keepalived-2.0.5.tar.gz
tar xvf keepalived-2.0.5.tar.gz
cd keepalived-2.0.5
./configure --prefix=/usr/local/keepalived
make
make install

开启接口共享IP功能和内核转发功能

## 修改内核参数: /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

## 允许程序绑定到不属于本地网卡的地址上
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

防火墙配置

## 如果防火墙屏蔽了keepalived间的通讯,可能导致两台master

## keepalived 默认需要使用D类多播地址224.0.0.18 进行心跳通信
## keepalived 使用vrp协议进行通信(协议号码为112)
## VRRP协议既不属于TCP也不属于UDP,在协议类型选项需要选“All traffice”的选项来防止由于防火墙原因造成通信问题。
## 使用单播避免部分网络不允许组播,但vrrp_strict禁用单播,所有不能设置此项

## firewall 配置方法

firewall-cmd --permanent --new-service=vrrp
firewall-cmd --permanent --service=vrrp --set-description="Virtual Router Redundancy Protocol"
firewall-cmd --permanent --service=vrrp --set-short=vrrp
firewall-cmd --permanent --service=vrrp --add-protocol=vrrp
firewall-cmd --permanent --service=vrrp --set-destination=ipv4:224.0.0.18
firewall-cmd --add-service=vrrp --permanent --zone=internal
firewall-cmd --reload


## 或者 oracle 介绍的方式,此方式重启失效

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface "your interface" --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface "your interface" --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload


## 修改配置文件方式
vi /etc/firewalld/direct.xml

<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="filter" ipv="ipv4" chain="OUTPUT">' --out-interface' [ens33] --destination 224.0.0.18 --protocol vrrp -j ACCEPT</rule>
<rule priority="1" table="filter" ipv="ipv4" chain="IN_public_allow">-d 224.0.0.18 -j ACCEPT</rule>
</direct>


## 或者

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" destination address="224.0.0.18" protocol value="vrrp" accept' --permanent
Firewall-cmd --reload


## iptables 配置方法
iptables -A INPUT -d 224.0.0.18 -j ACCEPT

## keepalvied 使用 112 端口通信,加上防火墙规则
iptables -A INPUT -i ens37 -p 112 -j ACCEPT


# /sbin/iptables -I INPUT -i ens37 -d 224.0.0.0/8 -j ACCEPT
# /sbin/iptables -A INPUT -p 112 -i ens37 -j ACCEPT
# /sbin/iptables -A OUTPUT -p 112 -o ens37 -j ACCEPT
# /sbin/service iptables save

Haproxy 结合使用问题

haproxy 监听绑定IP最好用,如*:80 或 0.0.0.0:80,否则无法在绑定vip:80 建立监听。
如果直接绑定vip:80,如果不是master,haproxy启动前机器是backup没有获得vip,那haproxy可能启动不了。

如果不是master,Haproxy 绑定vip:80,又能启动,解决办法就是:
允许程序绑定到不属于本地网卡的地址上
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf

haproxy代理服务器同时也要打开内核的转发功能。

## 检查广播问题,vrrp广播不通会导致脑裂

tcpdump -vvv -n -i ens37 host 224.0.0.18

日志设置

## 修改 /etc/sysconfig/keepalived
## 把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -d -S 0"
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

cat > /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 3"
EOF

sed -i "s/#\$ModLoad imudp/\$ModLoad imudp/g" /etc/rsyslog.conf
sed -i "s/#\$UDPServerRun 514/\$UDPServerRun 514/g" /etc/rsyslog.conf

## #文件最末尾的"&~",如果没有此配置,日志除写入指定文件外,会同步写入messages文件;
cat > /etc/rsyslog.d/keepalived.conf << EOF

local3.* /var/log/keepalived.log
&~

EOF

systemctl restart rsyslog.service

全局配置

global_defs {                               ## 全局配置
    notification_email {                    ## 定义报警邮件地址
        tom@service.com
        IT@service.com
    }

    notification_email_from IT@service.com  ## 定义发送邮件的地址
    smtp_server 127.0.0.1                                  ## 邮箱服务器 
    smtp_connect_timeout 30                                ## 定义超时时间
    router_id haproxy01                                    ## 运行Keepalived服务器的一个标识,是发邮件时显示在邮件主题中的信息。

    vrrp_garp_master_refresh 60                            ## secs, default 0 (no refreshing)
    vrrp_garp_master_delay 5                               ## seconds, default 5, 0 for no second set

    #vrrp_iptables                                          ##禁止keepalived启动生成默认的iptables规则
    #vrrp_mcast_group4 224.17.17.17                         ##定义主备节点通过组播地址进行通告状态
}  

监控检查

## 多个检查脚本,每个脚本权重都会添加,最终优先级=初始优先级+脚本1的权重+脚本2的权重+...

vrrp_script chk_haproxy {            ## 检测该服务器上haproxy服务的健康状态的
    script "/bin/killall -0 haproxy && exit 0 || exit 1"
    #script "/etc/keepalived/chk_haproxy.sh"
    interval 2                       ## 每2秒检测一次
    weight 20                        ## 默认是2. 当脚本执行码为0,权重大于0时,vrrp实例优先级增加;当脚本执行码为非0,权重小于0时,vrrp实例优先级减小,其他情况优先级不变。
    fall 2                           ## 检测两次都失败才失败
    rise 1                           ## 检测一次成功就成功
}


## 检测端口是否开启可以用,如:script "</dev/tcp/127.0.0.1/6379"
## 判断非僵尸进程bash 语句, haproxy 采用master-worker模式,所以进程数要大于1
1
2
3
4
5
6
7
8

cat > /etc/keepalived/chk_haproxy.sh << EOF
#!/bin/bash
[[ \$(ps -C 'haproxy' -o stat,cmd | grep -ve '^[Zz]' | grep -iv 'grep' | wc -l) -ge 2 ]] && exit 0 || exit 1

EOF

chmod u+x /etc/keepalived/chk_haproxy.sh

维护检查

vrrp_script chk_mantaince_down {
    script "/etc/keepalived/chk_down.sh"
    interval 2                       ## 每2秒检测一次
    weight  20                       ## 默认是2. 当脚本执行码为0,权重大于0时,vrrp实例优先级增加;当脚本执行码为非0,权重小于0时,vrrp实例优先级减小,其他情况优先级不变。
    fall 2                           ## 检测两次都失败才失败
    rise 1                           ## 检测一次成功就成功
}
1
2
3
4
5
6
7
cat > /etc/keepalived/chk_down.sh << EOF
#!/bin/bash
[[ -f /etc/keepalived/down ]] && exit 1 || exit 0

EOF

chmod u+x /etc/keepalived/chk_down.sh

同步组

vrrp_sync_group G1 {
    group {
        VI_1
        VI_2
        VI_5
    }
    notify_backup "/usr/local/bin/vrrp.back arg1 arg2"
    notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
    notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
}

虚拟ip配置 vrrp

## 在主备节点设置优先级的时候,要确保当MASTER节点降级后的优先级要比BACKUP的优先级低,否则,VIP是无法进行漂移的。

## 主备不同之处
    1,router_id        不能一致
    2,state            MASTER/BACKUP
    3, priority         权重不能一致
    4, interface ens33  网络接口注意和本机对应


vrrp_instance VI_1 {                ## 定义实例,用来定义对外提供服务的VIP区域及其相关属性。
    state BACKUP                    ## 状态参数 MASTER|BACKUP
    interface ens33                 ## 绑定VIP的网卡
    virtual_router_id 50            ## 取值在0-255之间,用来区分多个instance的VRRP组播。主备此值要相同,同一个集群id一致,不同集群必须不一样。
    priority 100                    ## 节点优先级,值范围0~254,MASTER要比BACKUP高。抢占模式中,优先级高就切换为master。
    advert_int 1                    ## 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
    #garp_master_delay 10            ## 当切为主状态后多久更新ARP缓存,默认5秒。通知设备它现在控制新MAC地址的那些IP,覆盖他们的ARP缓存。
    #garp_master_refresh 60          ## 单位秒,默认0,不再发送ARP。表示master每隔多久发送一次arp更新。
    nopreempt                       ## 默认是抢占模式,要是用非抢占式的,master主机加上nopreempt,同时主备机器的state状态都必须是BACKUP。经测试使用此参数会导致主备不会自动切换,必须关闭keepalive才行。
    smtp_alert                      ## 状态转换时,利用global里的邮件配置,发送邮件通知

    authentication {                ## 认证
        auth_type PASS              ## 认证方式
        auth_pass 1111              ## 密码
    }
    virtual_ipaddress {             ## VIP会绑定在物理网卡,所以不需要新建一个网卡。
        ## <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
        200.200.200.240/24 dev ens33    ## 设备之间使用的虚拟ip地址
        #192.168.200.17/24 dev ens33 label ens33:3
    }

    ## mcast_src_ip <IPADDR>        ## 指定多播源ip地址,用于多播

    ## 配置单播
    unicast_src_ip 200.200.200.212  ## 指定单播源ip地址,本机IP
    unicast_peer {
        200.200.200.213             ## 对端IP地址,必须是绑定vip网卡上的ip,通过单播发送vrrp信息给对端
    }

    track_interface {               ## 监控以下网卡,如果任何一个不通就会切换到FALT状态。
        ens33
    }

    track_script {
        chk_haproxy
        chk_mantaince_down
    }

    #notify_master /home/keepshell/notify_master.sh     ## 作用:当成为MASTER时,以指定的用户和组执行脚本。
    #notify_backup /home/keepshell/notify_backup.sh     ## 作用:当成为BACKUP时,以指定的用户和组执行脚本。
    #notify_fault  /home/keepshell/notify_fault.sh      ## 作用:当该同步组Fault时,以指定的用户和组执行脚本。
    #notify        /home/keepshell/notify_stop.sh       ## 作用:在任何状态都会以指定的用户和组执行脚本。最后执行。

}

配置说明

全局定义模块

! Configuration File for keepalived

global_defs {
notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc #邮件报警
}
notification_email_from Alexandre.Cassen@firewall.loc 指定发件人
smtp_server 192.168.200.1  #指定smtp服务器地址
smtp_connect_timeout 30    指定smtp连接超时时间
router_id LVS_DEVEL  #负载均衡标识,在局域网内应该是唯一的。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

说明:
notification_email:指定当keepalived出现问题时,发送邮件给哪些用户。
notification_emai_from:发送邮件时,邮件的来源地址。
smtp_server <DOMAIN|IP> [<PORT>]:smtp服务器的地址或域名。默认端口为25.如:smtp_server smtp.felix.com 25
smtp_helo_name <HOST_NAME>:指定在HELO消息中所使用的名称。默认为本地主机名。
smtp_connect_timeout:指定smtp服务器连接的超时时间。单位是秒。

router_id:指定标识该机器的route_id. 如:route_id LVS_01
vrrp_mcast_group4 224.0.0.18:指定发送VRRP组播消息使用的IPV4组播地址。默认是224.0.0.18
vrrp_mcast_group6 ff02::12 指定发送VRRP组播消息所使用的IPV6组播地址。默认是ff02::12
default_interface eth0:设置静态地址默认绑定的端口。默认是eth0。
lvs_sync_daemon <INTERFACE> <VRRP_INSTANCE> [id <SYNC_ID>] [maxlen <LEN>] [port <PORT>] [ttl <TTL>] [group <IP ADDR>]
    设置LVS同步服务的相关内容。可以同步LVS的状态信息。
    INTERFACE:指定同步服务绑定的接口。
    VRRP_INSTANCE:指定同步服务绑定的VRRP实例。
    id <SYNC_ID>:指定同步服务所使用的SYNCID,只有相同的SYNCID才会同步。范围是0-255.
    maxlen:指定数据包的最大长度。范围是1-65507
    port:指定同步所使用的UDP端口。
    group:指定组播IP地址。

lvs_flush:                     在keepalived启动时,刷新所有已经存在的LVS配置。
vrrp_garp_master_delay 10:     当转换为MASTER状态时,延迟多少秒发送第二组的免费ARP。默认为5s,0表示不发送第二组免的免费ARP。
vrrp_garp_master_repeat 1:     当转换为MASTER状态时,在一组中一次发送的免费ARP数量。默认是5.
vrrp_garp_lower_prio_delay 10: 当MASTER收到更低优先级的通告时,延迟多少秒发送第二组的免费ARP。
vrrp_garp_lower_prio_repeat 1: 当MASTER收到更低优先级的通告时,在一组中一次发送的免费ARP数量。
vrrp_garp_master_refresh 60:   当keepalived成为MASTER以后,刷新免费ARP的最小时间间隔(会再次发送免费ARP)。默认是0,表示不会刷新。
vrrp_garp_master_refresh_repeat 2: 当keepalived成为MASTER以后,每次刷新会发送多少个免费ARP。默认是1.
vrrp_garp_interval 0.001:          在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0.
vrrp_lower_prio_no_advert true|false:默认是false。如果收到低优先级的通告,不发送任何通告。
vrrp_version 2|3:                  设置默认的VRRP版本。默认是2.
vrrp_check_unicast_src:            在单播模式中,开启对VRRP数据包的源地址做检查,源地址必须是单播邻居之一。
vrrp_skip_check_adv_addr:          默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
vrrp_strict:                       严格遵守VRRP协议。      下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。

vrrp_iptables:                     不添加任何iptables规则。默认是添加iptables规则的。

如果vrrp进程或check进程超时,可以用下面的4个选项。可以使处于BACKUP状态的VRRP实例变成MASTER状态,即使MASTER实例依然在运行。因为MASTER或BACKUP系统比较慢,不能及时处理VRRP数据包。
vrrp_priority <-20 -- 19>:         设置VRRP进程的优先级。
checker_priority <-20 -- 19>:      设置checker进程的优先级。
vrrp_no_swap:                      vrrp进程不能够被交换。
checker_no_swap:                   checker进程不能够被交换。

script_user <username> [groupname]:设置运行脚本默认用户和组。如果没有指定,则默认用户为keepalived_script(需要该用户存在),否则为root用户。默认groupname同username。
enable_script_security:            如果脚本路径的任一部分对于非root用户来说,都具有可写权限,则不会以root身份运行脚本。
nopreempt                           默认是抢占模式 要是用非抢占式的就加上nopreempt

注意:上述为global_defs中的指令

VRRPD配置

VRRPD的配置包括如下子块:
1. vrrp_script
2. vrrp_sync_group
3. garp_group
4. vrrp_instance

vrrp_script配置

作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
注意:至少有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-254.
vrrp_script <SCRIPT_NAME> {
        ...
    }

选项说明:
scrip "/path/to/somewhere":指定要执行的脚本的路径。
interval <INTEGER>:指定脚本执行的间隔。单位是秒。默认为1s。
timeout <INTEGER>:指定在多少秒后,脚本被认为执行失败。
weight <-254 --- 254>:调整优先级。默认为2.
rise <INTEGER>:执行成功多少次才认为是成功。
fall <INTEGER>:执行失败多少次才认为失败。
user <USERNAME> [GROUPNAME]:运行脚本的用户和组。
init_fail:假设脚本初始状态是失败状态。

解释:
weight: 
1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。
2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。
3. 其他情况下,priority不变。

vrrp_sync_group

作用:将所有相关的VRRP实例定义在一起,作为一个VRRP Group,如果组内的任意一个实例出现问题,都可以实现Failover。
vrrp_sync_group VG_1 {
    group {
    inside_network     # vrrp instance name
    outside_network    # vrrp instance name
    ...
    }
    ...
}

说明:
如果username和groupname没有指定,则以默认的script_user所指定的用户和组。
1. notify_master /path/to_master.sh [username [groupname]]
    作用:当成为MASTER时,以指定的用户和组执行脚本。
2. notify_backup /path/to_backup.sh [username [groupname]]
    作用:当成为BACKUP时,以指定的用户和组执行脚本。
3. notify_fault "/path/fault.sh VG_1" [username [groupname]]
    作用:当该同步组Fault时,以指定的用户和组执行脚本。
4. notify /path/notify.sh [username [groupname]]
    作用:在任何状态都会以指定的用户和组执行脚本。
    说明:该脚本会在notify_*脚本后执行。
    notify可以使用3个参数,如下:
    $1:可以是GROUP或INTANCE,表明后面是组还是实例。
    $2:组名或实例名。
    $3:转换后的目标状态。有:MASTER、BACKUP、FAULT。

5. smtp_alert:当状态发生改变时,发送邮件。
6. global_tracking:所有的VRRP实例共享相同的tracking配置。

注意:脚本文件要加上x权限,同时指令最好写绝对路径。

vrrp_instance

命令说明:
state MASTER|BACKUP:指定该keepalived节点的初始状态。
interface eth0:vrrp实例绑定的接口,用于发送VRRP包。
use_vmac [<VMAC_INTERFACE>]:在指定的接口产生一个子接口,如vrrp.51,该接口的MAC地址为组播地址,通过该接口向外发送和接收VRRP包。
vmac_xmit_base:通过基本接口向外发送和接收VRRP数据包,而不是通过VMAC接口。
native_ipv6:强制VRRP实例使用IPV6.(当同时配置了IPV4和IPV6的时候)
dont_track_primary:忽略VRRP接口的错误,默认是没有配置的。

track_interface {
eth0
eth1 weight <-254-254>
...
}:如果track的接口有任何一个出现故障,都会进入FAULT状态。

track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254-254>
}:添加一个track脚本(vrrp_script配置的脚本。)

mcast_src_ip <IPADDR>:指定发送组播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
unicast_src_ip <IPADDR>:指定发送单薄数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
version 2|3:指定该实例所使用的VRRP版本。

unicast_peer {
<IPADDR>
...
}:采用单播的方式发送VRRP通告,指定单播邻居的IP地址。

virtual_router_id 51:指定VRRP实例ID,范围是0-255.
priority 100:指定优先级,优先级高的将成为MASTER。
advert_int 1:指定发送VRRP通告的间隔。单位是秒。
authentication {
auth_type PASS|AH:指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)。
auth_pass 1234:指定认证所使用的密码。最多8位。
}

virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}:指定VIP地址。

nopreempt:设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级的机器已经上线。如果要使用这个功能,则初始化状态必须为BACKUP。
preempt_delay:设置抢占延迟。单位是秒,范围是0---1000,默认是0.发现低优先级的MASTER后多少秒开始抢占。


通知脚本:
notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
notify <STRING>|<QUOTED-STRING> [username [groupname]]

# 当停止VRRP时执行的脚本。
notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]
smtp_alert

LVS配置

virtual_server

virtual_server IP Port | virtual_server fwmark int | virtual_server group string {
delay_loop <INT>:健康检查的时间间隔。
lb_argo rr|wrr|lc|wlc|lblc|sh|dh:LVS调度算法。
lb_kind NAT|DR|TUN:LVS模式。
persistence_timeout 360:持久化超时时间,单位是秒。默认是6分钟。
persistence_granularity:持久化连接的颗粒度。
protocol TCP|UDP|SCTP:4层协议。
ha_suspend:如果virtual server的IP地址没有设置,则不进行后端服务器的健康检查。
virtualhost <STRING>:为HTTP_GET和SSL_GET执行要检查的虚拟主机。如virtualhost www.felix.com
sorry_server <IPADDR> <PORT>:添加一个备用服务器。当所有的RS都故障时。
sorry_server_inhibit:将inhibit_on_failure指令应用于sorry_server指令。

alpha:在keepalived启动时,假设所有的RS都是down,以及健康检查是失败的。有助于防止启动时的误报。默认是禁用的。
omega:在keepalived终止时,会执行quorum_down指令所定义的脚本。

quorum <INT>:默认值1. 所有的存活的服务器的总的最小权重。
quorum_up <STRING>:当quorum增长到满足quorum所定义的值时,执行该脚本。
quorum_down <STRING>:当quorum减少到不满足quorum所定义的值时,执行该脚本。
}

real_server

real_server IP Port {
weight <INT>:给服务器指定权重。默认是1.
inhibit_on_failure:当服务器健康检查失败时,将其weight设置为0,而不是从Virtual Server中移除。
notify_up <STRING>:当服务器健康检查成功时,执行的脚本。
notify_down <STRING>:当服务器健康检查失败时,执行的脚本。
uthreshold <INT>:到这台服务器的最大连接数。
lthreshold <INT>:到这台服务器的最小连接数。
}

real_server中的健康检查

HTTP_GET | SSL_GET {
url {
path <STRING>:指定要检查的URL的路径。如path / or path /mrtg2
digest <STRING>:摘要。计算方式:genhash -s 172.17.100.1 -p 80 -u /index.html
status_code <INT>:状态码。
}
nb_get_retry <INT>:get尝试次数。
delay_before_retry <INT>:在尝试之前延迟多长时间。

connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
} 

TCP_CHECK {
connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry <INIT>:重试次数。默认是1次。
delay_before_retry <INT>:默认是1秒。在重试之前延迟多少秒。
}


SMTP_CHECK {
connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。 默认是25端口
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。

retry <INT>:重试次数。
delay_before_retry <INT>:在重试之前延迟多少秒。
helo_name <STRING>:用于SMTP HELO请求的字符串。
}


DNS_CHECK {
connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。 默认是25端口
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。

retry <INT>:重试次数。默认是3次。
type <STRING>:DNS query type。A/NS/CNAME/SOA/MX/TXT/AAAA
name <STRING>:DNS查询的域名。默认是(.)
}



MISC_CHECK {
misc_path <STRING>:外部的脚本或程序路径。
misc_timeout <INT>:脚本执行超时时间。
user USERNAME [GROUPNAME]:指定运行该脚本的用户和组。如果没有指定GROUPNAME,则GROUPNAME同USERNAME。
misc_dynamic:根据退出状态码动态调整权重。
0,健康检查成功,权重不变。
1,健康检查失败。
2-255,健康检查成功。权重设置为退出状态码减去2.如退出状态码是250,则权重调整为248
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
}

实例

global_defs {
    router_id LVS_Server 指定标识该机器的route_id
}
vrrp_instance VI_1 {
    state MASTER 指定该keepalived节点的初始状态
    interface ens8 vrrp实例绑定的接口,用于发送VRRP包
    virtual_router_id 51  指定VRRP实例ID
    priority 150  指定优先级,优先级高的将成为MASTER
    nopreempt   设置为不抢占。默认是抢占的
    advert_int 1   advert_int 1
    authentication {
        auth_type PASS  指定认证方式
        auth_pass password 指定认证所使用的密码。
    }
    virtual_ipaddress {  
        192.168.1.217 dev ens8  指定VIP地址
    }
}
virtual_server 192.168.1.217 443 {
    delay_loop 3  delay_loop
    lvs_sched rr  LVS的调度算法
    lvs_method DR   LVS 模式
    protocol TCP  4层协议
    real_server 192.168.1.211 443 {
        weight 1
        TCP_CHECK {
            connect_port 443
            connect_timeout 3
            nb_get_retry 3  get尝试次数
            delay_before_retry 10  在尝试之前延迟多长时间
        }
    }
    real_server 192.168.1.212 443 {
        weight 1
        TCP_CHECK {
            connect_port 443
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 10
        }
    }
}
virtual_server 192.168.1.217 80 {
    delay_loop 3
    lvs_sched rr
    lvs_method DR
    protocol TCP
    real_server 192.168.1.211 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 10
        }
        }
    }
    real_server 192.168.1.212 80 {
        weight 1  调整优先级。默认为2
        TCP_CHECK {
            connect_port 80   连接的端口
            connect_timeout 3  连接超时时间。默认是5s。
            nb_get_retry 3  get尝试次数。
            delay_before_retry 10
        }
    }
}

redis 检测脚本

check_redis.sh脚本:

#!/bin/sh
CHECK_PROCESS=`ps -C redis-server --no-heading| wc -l`
if [ $CHECK_PROCESS -eq 0 ];then

    echo "Redis is stop"
    sleep 2
    CHECK_PROCESS=`ps -C redis-server --no-heading| wc -l`

    if [ $CHECK_PROCESS -eq 0 ];then
        /etc/init.d/keepalived stop
    fi
fi


check_port.sh脚本

#!/bin/bash

#keepalived 监控端口脚本
#使用方法:
#在keepalived的配置文件中
#vrrp_script check_port 

CHK_PORT=$1
echo $CHK_PORT
if [ "$CHK_PORT" != "" ];then

    PORT_PROCESS=`lsof -i:$CHK_PORT|wc -l`
    if [ $PORT_PROCESS -eq 0 ];then
    echo "Port $CHK_PORT Is Not Used,End."

    sleep 2
        PORT_PROCESS=`lsof -i:$CHK_PORT|wc -l`
        if [ $PORT_PROCESS -eq 0 ];then
        /etc/init.d/keepalived stop
        fi
    fi
else
    echo "Check Port Cant Be Empty!"
fi

进程检测脚本

# vi /etc/keepalived/chk_app.sh
#!/bin/sh

num=`ps -C nginx --no-header |wc -l`

if [ $num -eq 0 ];then
    systmectl restart nginx
sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        systmectl stop keepalived
    fi
fi

vrrp_vmac用法:

https://github.com/acassen/keepalived/blob/master/doc/NOTE_vrrp_vmac.txt