keepalived配置文件详解
keepalived配置文件分为三块:全局配置、VRRPD配置、LVS配置。
全局配置模块
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
failover@firewall.loc
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
VRRPD配置模块
VRRPD的配置包括 vrrp_script 、vrrp_sync_group 、vrrp_instance 三个子模块。
vrrp_script配置
作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
注意:至少有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-254.
vrrp_script <SCRIPT_NAME> {
...
}
选项说明:
script "/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 Sync Groups
不使用Sync Group的话,如果机器(或者说router)有两个网段,一个内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会发生Master和Backup的切换,从而导致了问题。Sync group就是为了解决这个问题,可以把两个实例都放进一个Sync Group,这样的话,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配置模块
LVS模块结构:
virtual_server{
… ...
real_server{
… ...
}
}
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监控检查
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秒。在重试之前延迟多少秒。
}
实例
实例一
! Configuration File for keepalived
global_defs {
notification_email {
ops@wangshibo.cn
tech@wangshibo.cn
}
notification_email_from ops@wangshibo.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/opt/shell/mysql/chk_mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight –5
#脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2
#检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state BACKUP #这里所有节点都定义为BACKUP
interface ens160 #指定虚拟ip的网卡接口
mcast_src_ip 192.124.154 #本地IP
virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。
advert_int 1
# nopreempt #不抢占模式,在优先级高的机器上设置即可,优先级低的机器可不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.124.200 #虚拟IP
}
track_script {
chk_mysql_port
}
}
实例二
! 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 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL-1 #主机标识符,唯一即可
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {
state BACKUP #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
interface ens192 #指定HA监听的网络接口,刚才ifconfig查看的接口名称
virtual_router_id 151 #虚拟路由标识,取值0-255,master-1和master-2保持一致
priority 100 #优先级,用来选举master,取值范围1-255
advert_int 1 #发VRRP包时间间隔,即多久进行一次master选举
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虚拟出来的地址
192.168.15.100
}
}
#虚拟服务器定义
virtual_server 192.168.15.100 3306 { #虚拟出来的地址加端口
delay_loop 2 #设置运行情况检查时间,单位为秒
lb_algo rr #设置后端调度器算法,rr为轮询算法
lb_kind DR #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
persistence_timeout 50 #会话保持时间,单位为秒
protocol TCP #指定转发协议,有 TCP和UDP可选
real_server 192.168.15.94 3306 { #实际本地ip+3306端口
weight=5 #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
#当该ip 端口连接异常时,执行该脚本
notify_down /etc/keepalived/shutdown.sh #检查mysql服务down掉后执行的脚本
TCP_CHECK {
#实际物理机ip地址
connect_ip 192.168.15.94
#实际物理机port端口
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
参考博客
keepalived配置文件详解【转】
https://www.cnblogs.com/paul8339/p/17203142.html