Keepalived介绍
keepalived是集群管理中保证集群高可用的一个服务软件,主要是防止单点故障问题。它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦。
Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。
Keepalived工作原理
Keepalived 以 VRRP 协议为实现基础,用VRRP 协议来实现高可用性(HA)。VRRP(VirtualRouter Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个)。
VRRP(虚拟路由冗余协议工作原理)
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务。
Keepalived除了构建一个虚拟路由之外,还能检测集群中各节点的健康状况。Keepalived工作在网络层、传输层、应用层。
网络层:在网络层Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包,如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层:提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层:用户可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除
Keepalived配置文件
global_defs{
notification_email {
[email protected] #设置报警邮件地址,每行一个
#需开启本机sendmail服务
}
notification_email_from [emailprotected] #设置邮件发送地址
smtp_server 192.168.200.1 #设置smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp server超时时间
router_id LVS_DEVEL #表运行Keepalived服务器的一个标志,邮件主题中显示
}
# vrrp实例定义部分
vrrp_instanceVI_1 {
state MASTER #指定keepalived的角色,MASTER表示此主机是主服器,BACKUP表示是备用服务器
interface eth0 #指定HA监测网络的接口
virtual_router_id 51 #虚拟路由标志,同一个vrrp实例使用一个唯一标志
#即同一个vrrp_instance下,MASTER和BACKUP一致
priority 100 #优先级,数字越大优先级越高,MASTER必须大于BACKUP
advert_int 1 #MASTER和BACKUP同步检查间隔,秒
authentication { #设定验证类型和密码
auth_type PASS #验证类型,PASS和HA
auth_pass 1111 #验证密码,MASTER和BACKUP密码相同才能进行通信
}
virtual_ipaddress { #虚拟ip地址
192.168.200.16
192.168.200.17
192.168.200.18
}
}
# 虚拟服务器定义部分
virtual_server192.168.200.100 443 { #设定虚拟服务器,指定IP和端口
delay_loop 6 #设置运行情况检查时间,秒
lb_algo rr #设置负载调度算法,rr--轮询算法
lb_kind NAT #设置LVS实现负载均衡机制 NAT/TUN/DR
nat_mask 255.255.255.0 #
persistence_timeout 50 #会话保持时间,秒,在50秒内用户无操作,接下来的请求
#将被分发到另外节点
protocol TCP #指定转发协议类型,TCP/UDP
real_server 192.168.201.100 443 { #配置服务节点1,指定真实ip和端口
weight 1 #服务节点的权值,数字越大权值越高
TCP_CHECK { #realserve的状态检测设置,秒
connect_timeout 3 #3秒无反应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
}
出现的故障及其解决措施
脑裂故障:
当联系2节点的心跳线断裂,本来为一个整体、动作协调的HA 系统,分裂为两个个体,由于失去了联系,都认为对方出现了故障,从而开始争夺资源,就像脑裂一样,最终两个节点的服务都起不来(常见的数据库轮询着的联机日志出错)。
解决方案:
1、双线条线,减少‘脑裂’发生几率;
2.启用磁盘锁,当正在服务的一方发现心跳线全部断开时开启磁盘锁,(锁住共享磁盘),平时不上锁;
3.设置仲裁机制;
4.裂脑的监控报警。




