一、简介
Keepalived 软件起初是专为LVS负载均衡软件设计的,用来监控管理LVS集群系统中各个服务节点的状态,后来又加入了可以解决静态路由单点故障问题从而实现高可用的VRRP功能。因此,Keepalived 除了能够管理LVS软件外,还可以作为其他服务(例如Nginx、Haproxy、MySQL等)的高可用解决方案软件。
1.1、安装部署
通过官网下载 或者 GitHub 下载源码进行编译安装,由于Keepalived 使用了libpopt库用来解析命令行参数,因此我们也需要安装libpopt
库。
# 安装libpopt |
1.2、配置
针对版本 2.1.2,配置大致分为如下几大类:
global_defs
: 主要是配置故障发生时的通知对象以及机器标识;vrrp_instance
: 用来定义对外提供服务的VIP区域及其相关属性;virtual_server
: 虚拟服务器,来源vrrp_instance
中配置的虚拟IP地址,后面加空格加端口号;
详细配置可参考源码中的 ./doc/samples/*.conf
等配置文件,关于配置文件的各参数的详细解析可以参考 官方文档
1.3、组件介绍
core
:keepalived的核心组件,负责主进程的启动和维护,全局配置文件的加载解析等;check
:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;vrrp
:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的;libipfwc
:iptables(ipchains)库,配置LVS会用到;libipvs*
:配置LVS会用到(keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已);
二、工作模式
2.1、双主模式(抢占模式)
配置以及实际的主备说明:
state
: 该参数都为MASTER
;priority
: 竞选优先级数值,该参数的大小决定实际的主备;- 参数值不同:参数值较大的为主,从而进行抢占;
- 参数值相同:后启动的为主,从而进行抢占;
2.2、主备模式(抢占模式)
配置以及实际的主备说明:
state
: 该参数配置为MASTER
和BACKUP
;priority
: 竞选优先级数值,该参数与state
值共同决定实际的主备;- 该参数值不同:参数值较大的为主,从而进行抢占;
- 该参数值相同:
state
参数为MASTER
的为实际的主,从而进行抢占;
2.3、双备模式(抢占/非抢占模式)
配置以及实际的主备说明:
state
: 该参数配置为BACKUP
;priority
: 竞选优先级数值,该参数与state
值共同决定实际的主备;- 该参数值不同: 参数值较大的为主,从而进行抢占;
- 该参数值相同: 先启动的为主,后启动的为备;
nopreempt
: 是否启用非抢占模式,该参数只在双备模式下适用;- 开启: 新启动的永远是备,不进行抢占;
- 关闭: 主备关系依据其他逻辑判断,从而决定是否执行抢占;
三、消息链路
以下所说的主节点和备节点为实际的主备;
心跳通知
: 主节点会不断地向备节点发送(多播的方式,默认的多播地址为224.0.0.18
)心跳消息,用以告诉备节点自己还活着;故障检测并接管资源
: 当主节点发生故障时,就无法发送心跳消息, 备节点无法继续检测到来自主节点的心跳,于是调用自身的接管程序,接管 原主节点的IP资源及服务;故障恢复
:当原主节点的故障恢复后,依据配置决定是否抢占当前活跃节点的IP资源和服务;
四、脑裂Split-brain
4.1、背景
在双机热备
高可用(HA)系统中,当两个节点断开联系时,本来为一个整体、动作协调的HA系统就会分裂成为两个独立的节点。由于节点之间失去通信,它们都以为是对方出了故障,因此两个节点上的HA就会像脑裂了一样,本能地争取”应用服务”,可能导致如下两种情况:
- 共享资源被不断的争夺,导致服务不可用;
- 共享资源备同时获取,导致最终的数据出错;
由于Keepalived中的主备两台机器所处的状态与对方的状态有关,如果两台机器之间的网络出现了问题,就会出现脑裂的情况,这时网络中就会由于资源竞争导致双主
或者无主
的情况,从而进行服务。
4.2、解决方案
针对于脑裂的问题,通常大概有四种可行的思路:
Quorums(法定人数)
:通过设置法定人数, 进而确定集群的容忍度, 当集群中存活的节点少于法定人数, 集群将不可用。通常存活的节点数必须过半,以便能够选取出集群的Leader,ZooKeeper默认就是利用该策略进行防止脑裂以及进行Leader选举;第三方仲裁
:当多个节点出现冲突的情况,可以由第三方仲裁来决定谁是Leader,Keepalived可以使用这个方案来解决;Redundant Communications(冗余通信)
:集群中采用多种通信方式,防止一种通信方式失效导致集群中的节点无法通信;Fencing(共享资源)
:能看到共享资源就表示在集群中,能够获得共享资源的锁的就是Leader,这种方式在某些情况下可能导致死锁;
可在Keepalived的机器上配置相关的检测任务,通过检测本机与网关的通畅性来起停
本地的Keepalived服务,进而保证在出现节点网络异常的情况下能够杀掉本机的Keepalived来避免脑裂情况的出现。