keepalived配置文件详解
keepalived配置文件分为三个部分:全局配置(Globals configurations)、vrrp配置(VRRP configuration)、 LVS配置(LVS configuration),针对这三部分对keepalived配置文件进行解析。
1、全局配置
全局配置分为2个子块:Global definitions与Static routes。
(1)、Global definitions
主要要是配置故障发生时的通知对象以及机器标识
global_defs{
notification_email {
<EMAIL ADDRESS>
<EMAIL ADDRESS>
...
}
notification_email_from <EMAILADDRESS>
smtp_server <IP ADDRESS>
smtp_connect_timeout <INTEGER>
router_id <STRING>
}
notification_email:接收告警通知的邮箱,可以设置多个。
notification_email_fromemail:告警邮件从那个邮箱发出。
smtp_server:发送告警邮件的SMTP服务器地址。
smtp_connect_timeout:连接SMTP服务器超时时间。
router_id: #运行keepalived的机器的路由标识,主备机一致。
(2)、Static addresses
static_ipaddress和static_routes用来给服务器配置静态的IP地址/路由。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。
一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。
语法如下:
static_ipaddress{
<IP ADDRESS>/<MASK> brd <IPADDRESS> dev <STRING> scope <SCOPE>
<IP ADDRESS>/<MASK> brd <IPADDRESS> dev <STRING> scope <SCOPE>
}
static_routes{
src <IP ADDRESS> [to] <IPADDRESS>/<MASK> via|gw <IP ADDRESS> dev <STRING> scope<SCOPE> table <TABLE-ID> # to is optional
src <IP ADDRESS> [to] <IPADDRESS>/<MASK> via|gw <IP ADDRESS> dev <STRING> scope<SCOPE> table <TABLE-ID> # to is optional
src <IP ADDRESS> [to] <IPADDRESS>/<MASK> via|gw <IP ADDRESS> or <IP ADDRESS> dev<STRING> scope <SCOPE> table <TABLE-ID> # will use multipathroute
blackhole <IP ADDRESS>[/<MASK>]
}
备注:以上两部份中的SCOPE可以指定的值为:site、link、host、nowhere、global。
如下为静态地址与静态路由配置示例:
示例1:
static_ipaddress{
192.168.200.16 dev eth0 scope link
192.168.200.17 dev eth1 scope link
192.168.200.18 dev eth2
}
示例2:
static_routes{
src 192.168.100.1 192.168.209.0/24 via192.168.200.254 dev eth0
192.168.210.0/24 via 192.168.200.254 deveth0
192.168.211.0/24 via 192.168.200.254 deveth0
192.168.212.0/24 dev eth3 scope site
192.168.213.0/24 dev eth1 scope link
}
2、VRRP配置
VRRP configuration配置是keepalive实现HA部分重要内容,同样也分为VRRP scripts、VRRP synchronization group、VRRP instance三个子块实现。
(1)、VRRP scripts
vrrp_script <STRING> { # vrrp_script与track_script结合使用,<STRING>与track_script中<STRING>值设置为相同。
script <QUOTED_STRING> #监控脚本或者监控命令。
interval<INTEGER> #脚本运行时间间隔。
weight <INTEGER:-254..254> #设置weight值,取值范围-254-254。keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
fall <INTEGER> #运行失败指定次数后发生切换。
rise <INTEGER> #运行成功指定次数后不发生切换。
}
(2)、VRRP synchronization group
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明其功能:两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。
vrrp_sync_group <STRING>{ #vrrp_sync_group组名。
group {
<STRING> #指定加入vrrp_sync_group组的VRRP_Instance。
<STRING>
}
notify_master <STRING>|<QUOTED-STRING> #表示切换为master时所执行的脚本。
notify_backup <STRING>|<QUOTED-STRING> #表示切换为backup时所执行的脚本。
notify_fault <STRING>|<QUOTED-STRING> #表示切换为fault时所执行的脚本。
notify <STRING>|<QUOTED-STRING> #表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递4个参数。
$1 = A stringindicating whether it's a "GROUP" or an "INSTANCE"
$2 = The name of said groupor instance
$3 = The state it'stransitioning to ("MASTER", "BACKUP" or "FAULT")
$4 = The priorityvalue
$1 and $3 are ALWAYSsent in uppercase, and the possible strings sent are the
same ones listed above("GROUP"/"INSTANCE", "MASTER"/"BACKUP"/"FAULT").
smtp_alert #使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知。
}
(3)、VRRP instance
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
常用参数说明:
use_vmac:使用VRRP的虚拟MAC地址。
state MASTER|BACKUP:设置节点状态。keepalived启动时会将priority比较大的节点选举为MASTER。
interface <STRING>:用于HA检测与对外提供服务的网络的接口。
track_interface :监控指定的网卡,如果任何一个不通就会切换到FALT状态。
track_script:与vrrp_script参数一同使用,设定监控服务的脚本,<STRING>与vrrp_script参数中的名称相同。
mcast_src_ip :发送多播包的地址,如果不设置,默认使用绑定的网卡的primary IP。
dont_track_primary:忽略vrrp的interface错误,默认不设置。
lvs_sync_daemon_interface <STRING>:负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。.
garp_master_delay <INTEGER>:当切为主状态后多久更新ARP缓存,默认为5秒。
virtual_router_id <INTEGER-0..255>:虚拟路由标识,主机与备机保持一致。
priority <INTEGER-0..255>:优先级,主机与备机必须不同。
advert_int <INTEGER>:同步通知间隔,MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
authentication {
auth_type PASS|AH:认证类型为PASS或AH,推荐使用PASS,主备必须使用相同认证方式及密码才可以通信。
auth_pass<STRING>:设置认证密码。密码最多8位。
}
virtual_ipaddress:漂移地址设置,可以设置多个。
virtual_routes : 虚拟路由,当IP漂过来之后需要添加的路由信息。
nopreempt:功能类似于heartbeat的auto_failback,设置不自动切回,该参数只能设置在state为backup的服务器上,且优先权必须高于其他节点的服务器上。
preempt_delay: 抢占延时,默认为0。
notify_master <STRING>|<QUOTED-STRING>:与vrrp_sync_group中相同。
notify_backup <STRING>|<QUOTED-STRING>:与vrrp_sync_group中相同。
notify_fault <STRING>|<QUOTED-STRING>: 与vrrp_sync_group中相同。
notify_stop <STRING>|<QUOTED-STRING>: 停止vrrp时,执行指定的脚本。
notify <STRING>|<QUOTED-STRING>: 与vrrp_sync_group中相同。
smtp_alert:与vrrp_sync_group中相同。
3、LVS配置
LVS的配置包括2部分:虚拟主机组(virtual server group)和虚拟主机(virtual server)。虚拟主机组一般用不到,这里不介绍。以下为虚拟主机常用参数介绍。
virtual_server<IP ADDRESS> <PORT> { # 虚拟服务器设置标识,指定虚拟ip与端口,ip地址与端口号之间用空格隔开。
delay_loop <INTEGER> # 延迟轮询时间
lvs_sched rr|wrr|lc|wlc|lblc|sh|dh # LVS调度算法
ops #Apply One-Packet-Scheduling (only for UDP),不常用。
lvs_method NAT|DR|TUN # LVS调度类型
persistence_timeout <INTEGER> # 会话保持时间,单位为秒。
persistence_granularity <NETMASK> # 此选项是配合persistence_timeout,后面跟的值是子网掩码,表示持久连接的粒度。
protocol TCP # 指定协议
ha_suspend #节点状态从MASTER到BACKUP状态切换时,暂不启用real_server健康检查。
virtualhost <STRING> # HTTP_GET做健康检查时,检查的Web服务器的虚拟主机。
sorry_server <IP ADDRESS><PORT> # 备用机,所有的real server失效后启用。
real_server健康检查方法有HTTP_GET|SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK多种,以下分别做以介绍如何使用。
real_server <IP ADDRESS> <PORT> { # 定义realserver
weight <INTEGER> # 用来配置real server节点的权值,数字越大权值越高。默认为1,0为失效。
inhibit_on_failure # 服务器健康检查失败时,将其weight设置为0,而不是直接从IPVS里面删除。
notify_up <STRING>|<QUOTED-STRING> # 在检测到real server节点服务up状态后执行脚本。
notify_down<STRING>|<QUOTED-STRING> # 在检测到real server节点服务down状态后执行脚本。
HTTP_GET|SSL_GET {
url { # HTTP/SSL检查的URL,这里可以指定多个URL。
path <STRING> # 详细的URL路径。
digest <STRING> # SSL检查后的摘要信息。
status_code <INTEGER> # HTTP检查的返回状态码,一般为200.
}
url {
path <STRING>
digest <STRING>
status_code <INTEGER>
}
connect_ip <IP ADDRESS> # 健康检查连接的ip地址,如果不指定默认为realserver指定的IP。
connect_port <PORT> # 健康检查的端口,如果不指定默认为real server指定的端口。
bindto <IP ADDRESS> # 如果本机有多个网卡配置多个地址,那么通过此地址来发送请求对服务进行健康检查。
bind_port <PORT> # 通过本机此端口来发送请求对服务进行健康检查。
connect_timeout <INTEGER> # 连接超时时间
fwmark <INTEGER> # fwmark to set on socket (SO_MARK)
nb_get_retry <INTEGER> # 重试次数。
delay_before_retry <INTEGER> # 重试间隔时间(秒)。
warmup <INTEGER> # 如果后端有众多realserver时,如果按精确时间发送检测报文,可能会造成本机的网络堵塞,因此可以使用warmup 指定一个时间,表示将发送检测报文的精确时间差开一点的时间,以免造成本机堵塞。
}
}
real_server <IP ADDRESS> <PORT>{ # 同上
weight <INTEGER> # 同上
inhibit_on_failure # 同上
notify_up<STRING>|<QUOTED-STRING> # 同上
notify_down<STRING>|<QUOTED-STRING> # 同上
TCP_CHECK {
connect_ip <IP ADDRESS> # IPaddress to connect
connect_port <PORT> # TCP port to connect
bindto <IP ADDRESS> # IP address to bind to
bind_port <PORT> # TCP port to bind to
connect_timeout<INTEGER> # Timeout connection
fwmark <INTEGER> # fwmark to set on socket (SO_MARK)
warmup <INTEGER> # random delay for maximum N seconds
}
}
real_server <IP ADDRESS> <PORT>{ # 同上
weight <INTEGER> # 同上
inhibit_on_failure # 同上
notify_up<STRING>|<QUOTED-STRING> # 同上
notify_down<STRING>|<QUOTED-STRING> # 同上
SMTP_CHECK {
connect_ip <IP ADDRESS> #Optional IP address to connect to
connect_port <PORT> # Optional port to connect to
bindto <IP ADDRESS> # Optional interface to use tooriginate the connection
bind_port <PORT> # Optional source port to originatethe connection from
connect_timeout<INTEGER> # Optional per-hostconnection timeout.
fwmark <INTEGER> # Optional fwmark to mark alloutgoing checker pakets with
host { # Optional additional host/port to check
connect_ip <IP ADDRESS> #IP address to connect
connect_port <PORT> # TCP port to connect
bindto <IP ADDRESS> # IP address to bind to
bind_port <PORT> # TCP port to bind to
connect_timeout<INTEGER> # Timeout connection
fwmark <INTEGER> # fwmark to set on socket (SO_MARK)
}
host {
connect_ip <IP ADDRESS> #IP address to connect
connect_port <PORT> # TCP port to connect
bindto <IP ADDRESS> # IP address to bind to
bind_port <PORT> # TCP port to bind to
connect_timeout<INTEGER> # Timeout connection
fwmark <INTEGER> # fwmark to set on socket (SO_MARK)
}
connect_timeout<INTEGER> # Connection andread/write timeout
warmup <INTEGER> # random delay for maximum N seconds
retry <INTEGER> # Number of times to retry afailed check
delay_before_retry <INTEGER># Delay in seconds before retrying
helo_name<STRING>|<QUOTED-STRING> # Host to use for the HELO request
}
}
real_server <IP ADDRESS> <PORT>{ # 同上
weight <INTEGER> # 同上
inhibit_on_failure # 同上
notify_up<STRING>|<QUOTED-STRING> # 同上
notify_down <STRING>|<QUOTED-STRING># 同上
MISC_CHECK {
misc_path<STRING>|<QUOTED-STRING> # 外部执行脚本。
misc_timeout <INTEGER> # 脚本执行超时时间。
warmup <INTEGER> # random delay for maximum N seconds
# If set, exit code from healthcheckeris used
# to dynamically adjust the weightas follows:
# exit status 0: svc check success, weight
# unchanged.
# exit status 1: svc check failed.
# exit status 2-255: svc check success, weight
# changed to 2 less than exit status.
# (for example: exit status of 255 would set
# weight to 253)
misc_dynamic
}
}
}