Keepalived 深度解析:原理、编译安装与高可用集群配置

Keepalived 深度解析:原理、编译安装与高可用集群配置

在高可用(High Availability, HA)架构中,消除单点故障是保障业务连续性的核心任务。Keepalived 正是为此而生的一款轻量级、高性能的解决方案。它通过VRRP协议实现地址漂移和故障自动转移,确保服务不间断。

1. Keepalived 简介与工作原理

Keepalived 是一个基于虚拟路由冗余协议 (VRRP) 的高可用解决方案。它的主要职责是监控服务器集群的状态,并在主服务器发生故障时,自动、无缝地将服务切换到备用服务器上。

1.1 核心思想:VRRP 协议

VRRP 协议是理解 Keepalived 的关键。我们可以通过一个简单的场景来理解它:

  1. 虚拟IP (VIP):在一个集群中(例如,两台服务器),我们设定一个不属于任何物理服务器的虚拟IP地址 (Virtual IP, VIP)。所有客户端的请求都只访问这个VIP。
  2. 角色分配:集群中的服务器分为两种角色:一台主节点 (MASTER) 和一台或多台备节点 (BACKUP)
  3. 正常运作:在正常情况下,主节点会持有VIP,并处理所有流向VIP的请求。同时,它会周期性地通过组播(地址 224.0.0.18)发送VRRP通告包,向集群中的其他节点宣告自己“在线”。
  4. 故障切换:如果备节点在预设的时间内没有收到主节点的通告,它会判定主节点发生故障。此时,备节点会根据预设的优先级 (priority) 来选举出一个新的主节点。优先级最高的备节点将接管VIP,将其绑定到自己的网络接口上,从而继续对外提供服务。

这个切换过程对客户端是完全透明的,从而实现了服务的高可用性。

1.2 Keepalived 的三大核心模块

Keepalived 的功能由三个主要模块构成:

模块 职责
Core 模块 作为核心,负责主进程的启动、维护,以及全局配置文件的加载和解析。
Check 模块 负责健康检查。它可以监控后端真实服务器(如Nginx、Tomcat等)的状态,支持TCP、HTTP等多种检查方式。
VRRP 模块 负责实现VRRP协议的功能,包括处理主备节点间的状态同步和故障切换。

2. 安装 Keepalived

安装 Keepalived 主要有两种方式:使用系统的包管理器(如YUM)或从源码编译安装。对于生产环境,强烈推荐使用源码编译安装,因为这样可以获得最新版本并进行灵活定制。

2.1 YUM 安装(适用于快速上手)

在 CentOS/RHEL 系统上,可以非常方便地使用 YUM 进行安装。

# 安装 Keepalived
yum install keepalived -y

# 管理服务
systemctl start keepalived.service    # 启动服务
systemctl enable keepalived.service   # 设置开机自启
systemctl status keepalived.service   # 查看服务状态
2.2 源码编译安装(推荐用于生产环境)
  1. 安装编译依赖

    yum install -y gcc openssl-devel libnl3-devel libnfnetlink-devel net-snmp-devel curl make
    
  2. 下载、编译与安装

    # 进入源码存放目录
    cd /usr/local/src/
    
    # 下载源码包 (版本号可替换为最新的稳定版)
    curl -O http://keepalived.org/software/keepalived-2.2.4.tar.gz
    
    # 解压并进入目录
    tar xvf keepalived-2.2.4.tar.gz
    cd keepalived-2.2.4
    
    # 配置、编译并安装 (使用 --prefix 指定安装目录,便于管理)
    ./configure --prefix=/usr/local/keepalived
    make && make install
    
  3. 配置为系统服务

    为了方便管理,我们需要将其配置为 systemd 服务。

    # 复制 systemd 服务文件
    cp /usr/local/src/keepalived-2.2.4/keepalived/keepalived.service /usr/lib/systemd/system/
    
    # 重新加载 systemd 配置
    systemctl daemon-reload
    

3. 配置 Keepalived 实现主备高可用

下面我们通过一个实例来配置一个主备高可用集群。

环境假设:

  • 主节点 (MASTER): 物理IP 192.168.10.11
  • 备节点 (BACKUP): 物理IP 192.168.10.12
  • 虚拟IP (VIP): 192.168.10.100
  • 通信网卡: eth0
3.1 主节点 (MASTER) 配置

编辑配置文件 /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   # 节点标识,建议唯一,可使用主机名
   router_id LVS_MASTER_01
}

vrrp_instance VI_1 {
    state MASTER                # 初始状态设为 MASTER
    interface eth0              # 绑定VIP和发送VRRP通告的网卡
    virtual_router_id 51        # 虚拟路由ID,主备节点必须一致
    priority 100                # 优先级,主节点应高于备节点(1-254)
    advert_int 1                # VRRP通告间隔(秒)

    # 单播配置,避免组播可能带来的问题
    unicast_src_ip 192.168.10.11 # 本机物理IP
    unicast_peer {
        192.168.10.12            # 对端备节点的物理IP
    }

    authentication {            # 认证配置,主备必须一致
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.10.100/24       # 定义虚拟IP(VIP),可定义多个
    }
}
3.2 备节点 (BACKUP) 配置

备节点的配置与主节点大部分相同,主要区别在于 statepriority

! Configuration File for keepalived

global_defs {
   router_id LVS_BACKUP_01
}

vrrp_instance VI_1 {
    state BACKUP                # 初始状态设为 BACKUP
    interface eth0
    virtual_router_id 51        # 必须与主节点相同
    priority 90                 # 优先级低于主节点
    advert_int 1

    unicast_src_ip 192.168.10.12 # 本机物理IP
    unicast_peer {
        192.168.10.11            # 对端主节点的物理IP
    }

    authentication {
        auth_type PASS
        auth_pass 1111          # 认证密码与主节点相同
    }

    virtual_ipaddress {
        192.168.10.100/24
    }
}
3.3 启动与验证
  1. 启动服务:在主备两个节点上分别启动 Keepalived。

    systemctl start keepalived
    
  2. 检查VIP:在主节点上执行 ip addr show eth0,您应该能看到 VIP 192.168.10.100 已经成功绑定。

  3. 模拟故障:停止主节点的 Keepalived 服务 (systemctl stop keepalived)。稍等片刻,在备节点上再次执行 ip addr show eth0,您会发现VIP已经成功“漂移”到了备用节点上。


4. 核心配置参数解析

下表是对 vrrp_instance 块中核心参数的详细说明:

参数项 含义与说明
state 节点的初始状态,MASTERBACKUP。最终谁是MASTER由优先级决定。
interface 用于绑定VIP和发送VRRP通告的物理网络接口。
virtual_router_id 虚拟路由ID(0-255),同一VRRP实例下的所有节点必须保持一致。
priority 优先级(1-254),数值越大,优先级越高。在选举中,高优先级的节点会成为MASTER。
advert_int VRRP通告包的发送时间间隔,单位为秒。
authentication 节点间的通信认证配置,防止非法节点加入集群。
auth_type 认证类型,通常使用 PASS (密码认证)。
auth_pass 认证密码,主备节点必须一致。
virtual_ipaddress 定义的虚拟IP (VIP) 列表,可以有多个。
nopreempt (可选) 启用非抢占模式。

5. 非抢占模式(nopreempt

默认情况下,Keepalived 工作在抢占模式。这意味着当原来的主节点从故障中恢复后,它会凭借更高的优先级重新抢占VIP,导致服务再次切换。

在某些对服务稳定性要求极高的场景下,我们希望避免这种不必要的切换。这时可以启用非抢占模式

配置方法:在备节点的 vrrp_instance 配置块中添加 nopreempt

vrrp_instance VI_1 {
    state BACKUP
    priority 90
    nopreempt  # 启用非抢占模式
    ...
}

注意:在非抢占模式下,建议将所有节点的初始 state 都设置为 BACKUP,并确保它们的 priority 值不同。这样,启动时优先级最高的节点会成为MASTER,而当它故障后,即便恢复了也不会主动抢占VIP。


总结

通过本文档,相信您已经对Keepalived的原理、安装和配置有了深入的了解。Keepalived 以其简单、高效的特性,成为构建高可用架构的得力工具。在生产环境中,它通常与 Nginx、LVS、HAProxy 等负载均衡器结合,并配合自定义的健康检查脚本,以构建更加健壮和复杂的应用高可用体系。

posted @ 2026-01-22 11:28  ceiloruz  阅读(167)  评论(0)    收藏  举报