Keepalived的学习与使用

一、简介

Keepalived 软件起初是专为LVS负载均衡软件设计的,用来监控管理LVS集群系统中各个服务节点的状态,后来又加入了可以解决静态路由单点故障问题从而实现高可用的VRRP功能。因此,Keepalived 除了能够管理LVS软件外,还可以作为其他服务(例如NginxHaproxyMySQL等)的高可用解决方案软件。

1.1、安装部署

通过官网下载 或者 GitHub 下载源码进行编译安装,由于Keepalived 使用了libpopt库用来解析命令行参数,因此我们也需要安装libpopt库。

# 安装libpopt
yum install popt-devel

# 进入keepalived源码目录编译安装
./configure
make && make install

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 : 该参数配置为MASTERBACKUP
  • 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来避免脑裂情况的出现。

作者: bugwz
链接: https://bugwz.com/2020/06/16/keepalived/
声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咕咕