第一章 keepalived介绍
keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点状态,后来又加入了可以实现高可用的VRRP功能.此,keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Haproxy,MySQL等)的高可用解决方案软件.
keepalived软件主要是通过VRRP协议实现高可用功能的.VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,他能够保证当个别节点宕机时,整个网络可以不间断地运行.Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能,
第二章 keepalived服务的重要功能
2.1 作为系统网络服务的高可用功能(failover)
keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以使普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器.
keepalived高可用功能实现的基本原理为:
两台主机同时安装好keepalived软件并启动服务,开始正常工作时
角色为Master的主机获得所有资源并对用户提供服务
角色为Backup的主机作为Master主机的热备;
当角色为Master的主机失效或出现故障时
角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务
而当角色为Master的主机故障修复后,又会自动接管回他原来处理的工作
角色为Backup的主机则同时释放Master主机失效时他接管的工作
此时,两台主机将恢复到启动时各自的原始角色及工作状态
2.2 什么是VRRP
VRRP,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议
VRRP的出现就是为了解决静态路由的单点故障问题
VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的.
VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的
虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址,:00-00-5E-00-01-{VRID}.
所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP).
客户端主机并不需要因Master的改变修改自己的路由配置.对它们来说,这种切换是透明的.
在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master
当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master.
这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性,处于安全性考虑,VRRP数据包使用了加密协议进行了加密.
**
3.4 keepalived配置文件说明
**
! 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 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL #本服务器的名称,若环境中有多个keepalived时,此名称不能一致
}
vrrp_script chk_web{
script "/usr/local/sbin/check_ng.sh" --定义需要监控的脚本(脚本是执行权限)
interval 3 --执行脚本的间隔时间
weigth 2
}
vrrp_instance VI_1 { #vrrp协议家族,主备要一致
state MASTER #标识所在家族的身份
interface ens33 #承载VIP地址的物理接口
virtual_router_id 51 #标识家族身份信息, 虚拟路由器的ID号,(主备要一致)每一个keep组都不同
priority 100 #优先级,数值越大优先级越高
advert_int 1
authentication { #通讯需要认证
auth_type PASS ##认证类型
auth_pass 1111 ##密码字串
}
virtual_ipaddress {
192.168.8.100
}
track_script { ---调用执行脚本信息
chk_web
}
}
设置主恢复不强占vip
描述:主服务器有问题,虚拟ip会切换到从服务器上,如果主恢复了,会把vip强占过来,这边设置不强占
主库 配置
[root@mysqltest ~]# more /etc/keepalived/keepalived.conf
global_defs {
router_id mysqlmha
}
vrrp_script check_run {
script "/etc/keepalived/check_mysql.sh"
interval 1
}
vrrp_instance VI_1 {
state BACKUP --这里状态指定为backup
interface eth0
virtual_router_id 151
priority 100
advert_int 1
nopreempt --设置 nopreempt 防止抢占资源
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_run
}
virtual_ipaddress {
192.168.66.53
}
}
keepalived高可用服务器的裂脑问题
5.1 什么是裂脑
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台服务器占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被成为裂脑.
5.2 导致裂脑发生的原因
一般来说,裂脑的发生,有以下几种原因
高可用服务器对之间心跳线链路发生故障,导致无法正常通信
心跳线坏了(包括断了,老化)
网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
心跳线之间连接的设备故障(网卡及交换机)
仲裁的机器出问题了(采用总裁的方案)
高可用服务器上开启了iptables防火墙阻挠了心跳信息传输
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件bug等.
5.3 解决裂脑的常见方法
在实际成产环境中,我们可以从以下几个方面来防止裂脑问题发生:
同时使用串行电缆和以太网电缆连接,同时用两条心跳线,这样一条线路坏了,另一个还是好的,依然能传送心跳信息.
当检测到裂脑时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith,fence)相当于备节点接收不到心跳信息,通过单独的线路发送命令关闭主节点的电源.
做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失.
5.4 解决keepalived裂脑的常见方案
作为互联网应用服务器的高可用,特别是前端web负载均衡器的高可用,裂脑的问题对普遍业务的影响是可容忍的,如果是数据库或者存储的业务,一般出现裂脑问题就非常严重了.因此,通过增加冗余心跳线来避免裂脑问题发生,同时加强了对系统的监控.
如果开启防火墙,一定要让心跳消息通过.一般通过允许IP段的形式解决
可以拉一条以太网网线或者串口线作为主备节点心跳线路的冗余
开发检测程序通过监控软件检测裂脑,如zabbix检测如果主备都有VIP就报警.
比较严谨的判断,备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了.
具体监控系统裂脑的脚本见文章结尾"开发检测keepalived裂脑的脚本"