https://blog.51cto.com/13570193/2161637
# 安装命令
yum install keepalived -y
# 查看安装后包文件
rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf # 主配置文件
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service
/usr/libexec/keepalived
/usr/sbin/keepalived
工作原理
Keepalived工作在TCP/IP协议的IP层、TCP层、应用层,既Layer 3/4/5
;
Layer3:当Keepalived工作在这层时,它会定期向服务器群中的服务器发送ICMP包
,如果发现某台服务器IP没有激活就会报告这台服务器失效,并且将其从服务器群剔除。Layer3的是以服务器IP地址是否有效作为判断是否存活的标准
;
Layer4:当工作在这层时,主要是以TCP端口状态来判断服务器工作是否正常
;
Layer5:当工作在这层时,主要是以用户设定的服务运行是否正常来判断是否存活
;
Keepalived高可用主要是通过VRRP进行通信的
,VRRP是通过竞选机制来确定主备的,主的优先级高于备。所以正常工作时,主会优先提供服务,备处于等待阶段,只有当主出现异常,备才会接管主的任务向外提供服务。
在Keepalived服务器群之间,只有作为主的服务器不断发送VRRP广播包,告诉备它还活着,此时备不会抢占主,只有当主不可用,既备接受不到主的VRRP广播包,这时候备就会启动相关的服务接管主的任务向外提供服务,以保证服务的正常使用。
配置文件详解
global_defs {
notification_email {
acassen@firewall.loc
} #定义报警邮件地址
notification_email_from Alexandre.Cassen@firewall.loc #定义发送邮件的地址
smtp_server 192.168.200.1 #邮箱服务器
smtp_connect_timeout 30 #定义超时时间
router_id LVS_DEVEL #定义路由标识信息,相同局域网唯一
vrrp_skip_check_adv_addr # 检查vrrp报文中的所有地址比较耗时,设置此标志的意思是如果接收的到报文和上一个报文来至同一个路由器,则不执行检查。默认是跳过检查
vrrp_strict #严格遵守vrrp协议,下面这些功能将会禁止:1. 0 VIP 2. unicast(单播) peers 3. vrrp 版本2的ipv6功能
vrrp_garp_interval 0 #小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 arp报文
vrrp_gna_interval 0 #小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0
vrrp_garp_master_delay 10 #设置当keepalived转变为master后,延迟多少秒发送第二组gratuitous arp。时间单位为秒,默认5秒,0表示不发送第二组gratuitous arp发送。
vrrp_garp_master_repeat 1 #keepalived状态转变为master后,每次发送多少组grntuitous APR 信息的数量,默认为5个
vrrp_garp_lower_prio_delay 10 #当MASTER收到更低优先级的通告时,延迟多少秒发送第二组的免费ARP。
vrrp_garp_lower_prio_repeat 1 #当master keepalived接收到一个较低优先级的广播后,一次发送gratuitous apr的数量组
vrrp_garp_master_refresh 60 #master keepalived 每次发送gratuitous arp的最小时间间隔。默认是0,没有
vrrp_garp_master_refresh_repeat 2 #master keepalived 每次发送gratuitous arp消息的组数量。
}
通过发送含有备份硬件地址和故障服务器的IP地址的免费ARP请求,使得备份文件服务器可以顺利地接替故障服务器进行工作。这使得所有目的地为故障服务器的报文都被送到备份服务器那里,客户程序不用关心原来的服务 器是否出了故障。
两个时间:
vrrp_garp_master_delay 10
一个是keepalived
转变为master后多少秒发送gratuitous arp
(免费ARP)的时间
vrrp_garp_master_refresh 60
每次发送免费ARP的时间
Master配置
[root@lb01 conf]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
Slave配置
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
启动
systemctl start keepalived
总结
Keepalived的主备配置文件的主要区别有:
router_id不一致
state描述信息不一致
priority优先级不一致
Keepalived脑裂
脑裂介绍
在高可用系统中,如果两个节点的心跳线断开,本来两个节点为一个整体、动作协调的一个HA系统,现在由于两个之间的心跳线断开导致它们分裂成了两个单独的个体。由于双方互相失去了联系,都会以为对方出了故障。
这时候这两个单独的个体就像"脑裂人"一样互相争抢共享资源、争用应用服务,这样就会造成严重问题:
共享资源被瓜分,两边服务都起不来;
两边服务都起来了,同时提供服务,同时读写存储,导致数据不一致甚至损坏。
产生脑裂的原因
一般来说,脑裂的发生,有以下几种原因:
HA服务器之间心跳线故障,导致无法正常通信;
HA服务器上开启了防火墙,阻挡了心跳线的信息传输;
HA服务器上心跳网卡配置不正确,导致心跳信息发送失败;
其他服务器配置不当的原因。比如心跳方式不同,心跳广播冲突,软件BUG等;
Keepalived配置里同一 VRRP实例中如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
常见的解决办法
在实际环境中,我们可以从以下几个方面来防止脑裂的问题:
同时使用串行线路或者以太网电缆连接,同时使用两条心跳线路,如果一条坏了,另外一条还能正常提供服务;
当检测到脑裂时强行关闭一个节点(该功能需要特殊设备支持,如Stonith,feyce),相当于备节点接受不到心跳心跳消患,通过单独的线路发送关机命令关闭主节点的电源;
做好脑裂监控报警(用zabbix等来监控),在问题发生时能在第一时间介入仲裁,降低损失。
启动磁盘锁。正在服务一方锁住共享磁盘,裂脑发生时,让对方完全抢不走共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动解锁,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了智能锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁,平时就不上锁了;
加入仲裁机制。例如设置网关IP,当脑裂发生时,两个节点都各自ping以下这个网关IP,不通则表明断点就在本端,不仅心跳、还兼对外服务的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通网关IP的一端去起服务。更保险一些,ping不通网关IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
Keepalived监控nginx防止脑裂
执行脚本,用来检测
vim check_keepalived.sh
#!/bin/bash
NGINX_SBIN=`which nginx`
NGINX_PORT=80
function check_nginx(){
NGINX_STATUS=`nmap localhost -p ${NGINX_PORT} | grep "80/tcp open" | awk '{print $2}'`
NGINX_PROCESS=`ps -ef | grep nginx|grep -v grep|wc -l`
}
check_nginx
if [ "$NGINX_STATUS" != "open" -o $NGINX_PROCESS -lt 2 ]
then
${NGINX_SBIN} -s stop
${NGINX_SBIN}
sleep 3
check_nginx
if [ "$NGINX_STATUS" != "open" -o $NGINX_PROCESS -lt 2 ];then
systemctl stop keepalived
fi
fi
Master配置
! Configuration File for keepalived
global_defs {
router_id lb01
}
# 定义脚本
vrrp_script check_ng {
script "/etc/keepalived/check_keepalived.sh" # 脚本路径
interval 2 # 执行时间间隔
weight -5 # 计算权重值,脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 3 # 检测连续3次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 2 # 检测2次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.169.200
}
# 调用脚本
track_script {
check_ng
}
}
Slave配置
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_script check_ng {
script "/etc/keepalived/check_keepalived.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 149
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
virtual_ipaddress {
192.168.169.200
}
track_script {
check_ng
}
}
网友评论