keepalived是一个基于VRRP协议来实现的服务高可用方案,利用其来避免IP单点故障。常常与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)
通过上图可以看出VRRP协议的功能为:解决网络中出现单点故障的路由协议。
主要方法是IP漂移,正常情况主设备获得IP,主设备故障,IP漂移到备用设备上,使设备达到高可用。
yum -y install keepalived
/etc/keepalived/keepalived.conf 配置文件
主要是配置故障发生时的通知对象以及机器标识
global_defs {
notification_email { #故障发生时给谁发邮件通知。
[email protected] #收件人可多个
[email protected]
}
notification_email_from [email protected] #通知邮件从哪个地址发出
smtp_server 192.168.200.1 #通知邮件的smtp地址
smtp_connect_timeout 30 #连接smtp服务器的超时时间
router_id LVS_DEVEL #节点的标识符
}
static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。
一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。
通过编写脚本对本机业务进程进行检测监控,防止keepliaved正常运行,但是关键性服务已经出错停止
vrrp_script chk_nginx {
script "/etc/keepalived/ck_ng.sh" #脚本
interval 2 #执行脚本频率
timeout 30 #指定在多少秒后,脚本被认为执行失败。
weight -5 #优先级改变值
weight 10 #调整优先级。默认为2.
rise 3 #执行成功多少次才认为是成功。
fall 2 #执行失败多少次才认为失败。
}
注意点:
vrrp_script chk_nginx
{ **//这个{要另起一行**
XXX
}
并且它要放在下面段落之前:
vrrp_instance VI_1 {
......
}
vrrp_script脚本中weight这个值必须指定,否则有时候重启服务后该节点被显示为fault 状态。weight值分为正值和负值,假定weight值为W,初始的优先级为P。
例如:
两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个实例没有发生故障)。
vrrp_sync_group VG_1 {
group {
VI_1
}
notify_master /path/to_master.sh
notify_backup /path/to_backup.sh
notify_fault "/path/fault.sh VG_1"
#notify_master / backup / fault分别表示切换为主/备/出错时所执行的脚本。
notify /path/notify.sh
#notify /path/notify.sh [username [groupname]]
#作用:在任何状态都会以指定的用户和组执行脚本。
#该脚本会在notify_*脚本后执行。
#notify可以使用3个参数,如下:
#$1:可以是GROUP或INTANCE,表明后面是组还是实例。
#$2:组名或实例名。
#$3:转换后的目标状态。有:MASTER、BACKUP、FAULT。
smtp_alert #表示状态改变时是否开启邮件通知(用全局区域的邮件设置来发通知)。
}
vrrp_instance VI_1 { #当前节点所属的虚拟路由的名称
state MASTER #当前节点的状态,有Master和Backup两种状态
interface ens33 #定义vrrp地址绑定在哪个接口
virtual_router_id 51 #虚拟路由器的标识,同一虚拟路由器组中的ID要相同
priority 100 #优先级设置
advert_int 1 #每隔多久以组播形式向外通告一次,默认是1秒
authentication { #认证方式,在组播信息中添加的信息,防止滥竽充数
auth_type PASS #认证开启
auth_pass 1111 #认证密码
}
virtual_ipaddress { #配置虚拟路由ip,即漂移地址
#/ brd dev scope label
192.168.11.99/24 dev ens33 label ens33:0 #漂移地址为192.168.11.99,配置在ens33网卡上并指定接口0
}
}
不常见,先不提
virtual_server IP Port {
delay_loop <INT> #健康检查的时间间隔
lb_algo 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
alpha #在keepalived启动时,假设所有的RS都是down,以及健康检查是失败的。有助于防止启动时的误报。默认是禁用的。
omega #在keepalived终止时,会执行quorum_down指令所定义的脚本。
quorum <INT> #默认值1. 所有的存活的服务器的总的最小权重。
quorum_up <STRING> #当quorum增长到满足quorum所定义的值时,执行该脚本。
quorum_down <STRING> #当quorum减少到不满足quorum所定义的值时,执行该脚本。
sorry_server <IPADDR> <PORT> #添加一个备用服务器。当所有的RS都故障时。
real_server IP Port {
weight <INT> #给服务器指定权重。默认是1.
inhibit_on_failure #当服务器健康检查失败时,将其weight设置为0,而不是从Virtual Server中移除。
notify_up <STRING> #当服务器健康检查成功时,执行的脚本。
notify_down <STRING> #当服务器健康检查失败时,执行的脚本。
uthreshold <INT> #到这台服务器的最大连接数。
lthreshold <INT> #到这台服务器的最小连接数。
健康检查
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
HTTP_GET|SSL_GET {
url {
path <STRING>
# Digest computed with genhash
digest <STRING>
status_code <INT>
}
connect_port <PORT>
connect_timeout <INT>
nb_get_retry <INT>
delay_before_retry <INT>
}
HTTP_GET | SSL_GET {
url {
path :指定要检查的URL的路径。如path / or path /mrtg2
digest :摘要。计算方式:genhash -s 172.17.100.1 -p 80 -u /index.html
status_code :状态码。
}
nb_get_retry :get尝试次数。
delay_before_retry :在尝试之前延迟多长时间。
connect_ip :连接的IP地址。默认是real server的ip地址。
connect_port :连接的端口。默认是real server的端口。
bindto :发起连接的接口的地址。
bind_port :发起连接的源端口。
connect_timeout :连接超时时间。默认是5s。
fwmark :使用fwmark对所有出去的检查数据包进行标记。
warmup :指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
}
TCP_CHECK {
connect_ip :连接的IP地址。默认是real server的ip地址。
connect_port :连接的端口。默认是real server的端口。
bindto :发起连接的接口的地址。
bind_port :发起连接的源端口。
connect_timeout :连接超时时间。默认是5s。
fwmark :使用fwmark对所有出去的检查数据包进行标记。
warmup :指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry :重试次数。默认是1次。
delay_before_retry :默认是1秒。在重试之前延迟多少秒。
}
SMTP_CHECK {
connect_ip :连接的IP地址。默认是real server的ip地址。
connect_port :连接的端口。默认是real server的端口。 默认是25端口
bindto :发起连接的接口的地址。
bind_port :发起连接的源端口。
connect_timeout :连接超时时间。默认是5s。
fwmark :使用fwmark对所有出去的检查数据包进行标记。
warmup :指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry :重试次数。
delay_before_retry :在重试之前延迟多少秒。
helo_name :用于SMTP HELO请求的字符串。
}
DNS_CHECK {
connect_ip :连接的IP地址。默认是real server的ip地址。
connect_port :连接的端口。默认是real server的端口。 默认是25端口
bindto :发起连接的接口的地址。
bind_port :发起连接的源端口。
connect_timeout :连接超时时间。默认是5s。
fwmark :使用fwmark对所有出去的检查数据包进行标记。
warmup :指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry :重试次数。默认是3次。
type :DNS query type。A/NS/CNAME/SOA/MX/TXT/AAAA
name :DNS查询的域名。默认是(.)
}
MISC_CHECK {
misc_path :外部的脚本或程序路径。
misc_timeout :脚本执行超时时间。
user USERNAME [GROUPNAME]:指定运行该脚本的用户和组。如果没有指定GROUPNAME,则GROUPNAME同USERNAME。
misc_dynamic:根据退出状态码动态调整权重。
0,健康检查成功,权重不变。
1,健康检查失败。
2-255,健康检查成功。权重设置为退出状态码减去2.如退出状态码是250,则权重调整为248
warmup :指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
}