概念

keepalived是linux下的一个轻量级的高可用解决方案,高可用说的是通过专门的设计,从而减少停工时间,保证了系统的高度可用性。keepalived通过VRRP协议(虚拟路由冗余协议)实现系统的高可用,他的配置非常简单。

VRRP协议工作原理

在网络环境中,主机间的通信都是通过静态路由或者网关来完成的,而主机之间的路由器一旦发生故障,通信就会断开,为了解决这个问题,就引入了CRRP协议。
VRRP可以将两台或者多台物理路由器虚拟成一个虚拟路由,这个虚拟路由器通过虚拟ip对外提供服务。在虚拟路由内部多个路由器协同工作,同一时间只有一个路由器对外提供服务。对外提供服务的路由器被称为MASTER,其他路由器是BACKUP,当MASTER发生故障时,通过选举算法选出一个BACKUP成为新的MASTER,继续对外提供服务,整个故障切换对用户来说完全是透明的。
每个虚拟路由器都有一个唯一的标识号VRID,在VRRP协议中,MASTER会通过广播方式发送VRRP数据包,BACKUP都会接受数据包信息,用来监控MASTER的监控状态,当MASTER发生故障时,BACKUP就无法接受到MASTER发过来的信息,于是就认定MASTER出现故障,然后多台BACKUP就会进行选举,优先级高的BACKUP就会成为新的MASTER,继续对外提供服务,保证系统的高可用。

keepalived工作原理

在网络层,keepalived通过ICMP协议(互联网可控制报文协议)向服务器集群中的每个节点发送ICMP数据包(类似ping功能),如果某个节点没有返回响应数据包,那么就认为该节点发生了故障,keepalived就会报告这个节点失效,并且从集群中剔除故障节点。
在传输层,keepalived利用TCP协议端口连接和扫描来判断集群节点是否正常,一旦在传输层发现这些端口没有数据响应,就认为这些端口发生异常,强制将这些端口对应的服务从集群中剔除。
在应用层,用户可以自定义脚本来检测服务是否正常运行,如果keepalived的检测结果和用户设定的不一致时,keepalived将对应的服务从集群中剔除。

keepalived常用配置

全局配置

global_defs {
notification_email { #设置报警邮件地址,可配置多个
acassen@firewall.loc #接收通知的邮件
failover@firewall.loc
}
notification_email_from test@163.com #设置发送通知的邮件地址
smtp_server smtp.163.com #设置smtp server地址
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配置

(1)vrrp_script常用配置

vrrp_script chk_nginx  {  #脚本名称是chk_nginx
script "/usr/local/sbin/check_ng.sh" #自定义脚本,指定脚本路径
interval 3 #指定脚本执行间隔,单位秒,默认1s
}

(2)vrrp_instance常用配置

vrrp_instance VI_1 {
state MASTER #指定实例初始化状态,MASTER和BACKUP
interface ens33 #指定实例绑定的网卡
virtual_router_id 51 #设置VRID标记,多个集群不可重复,同一集群相同
priority 100 #设定优先级,优先级越高会被竞选MASTER
advert_int 1 #检查的时间间隔,默认1s
authentication { #设置认证
auth_type PASS #认证方式,支持PASS和AH,官方建议PASS
auth_pass 1111 #认证的密码
}
virtual_address { #设置VIP
192.168.186.100/24
}
}

lvs配置

virtual_server 192.168.186.100 80 {
delay_loop 6 #健康检查时间间隔
lb_algo rr #设置lvs采用轮询算法
lb_kind DR #设置lvs采用直接路由模式
protocol TCP #使用的协议
real_server 192.168.186.137 80 { #真实服务器地址,可配置多个
weight 1 #权重,默认为1,0为失效
inhibit_on_failure #在服务健康检查失效时,将其设为0,而不是直接剔除
TCP_CHECK {
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
connect_port 80 #健康检查的端口
}
}
}