当前位置: 首页 > news >正文

Keepalived 入门详解:高可用集群部署最佳实践!

1. 什么是 Keepalived?

在分布式集群中,单点故障(SPOF) 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件,可以有效防止集群单点故障,保障系统的高可用性。

Keepalived 最初是为 LVS(Linux Virtual Server)设计,用于管理和监控 LVS 集群节点。后来加入 VRRP(Virtual Router Redundancy Protocol)功能,不仅具备负载均衡能力,还可用于高可用解决方案。在 VRRP 虚拟路由器中,多个物理路由器通过竞选确定 MASTER 角色,负责路由工作,其他为 BACKUP。MASTER 角色可动态切换,确保高可用性。

1.1 Keepalived 的作用

  • 高可用(HA) :通过 VRRP(虚拟路由冗余协议) ,实现主备切换,保障 IP 高可用性。
  • 负载均衡(LB) :最初为 LVS(Linux Virtual Server) 设计,可用于管理 LVS 集群。

1.2 Keepalived 与 VRRP 机制

在 VRRP 模式下,一个 VIP(虚拟 IP) 被多个物理服务器共享,但只有一台 Master 负责转发流量,其他的 Backup 处于待命状态:

  • Master 负责转发流量
  • Backup 监听 Master 状态
  • Master 故障时,Backup 自动接管 VIP,提供不中断的服务

VRRP 的通信采用 IP 多播(多播地址 224.0.0.18) ,客户端完全透明,不需要修改路由配置。

💡 你可能会问 VRRP 怎么实现的?
VRRP 通过竞选协议来实现虚拟路由的功能,所有的协议报文都是通过 IP 多播(Multicast)包(多播地址 224.0.0.18)形式发送的。虚拟路由是由 VRID(范围 0-255) 和一组 IP 地址组成,对外表现为一个周知的 MAC 地址:00-00-5E-00-01-【VRID】 (这就是为什么后面的配置 virtual_router_id 为什么只能是 0 - 255)。在一个虚拟路由中,不管谁是 MASTER,对外都是相同的 MAC 和 IP(虚拟VIP)。客户端主机并不需要因为 MASTER 的改变而修改自己的路由配置,即对客户端来说这种主备切换是无感知的。


2. Keepalived 如何工作?

2.1 Keepalived 高可用架构

Keepalived 是主备高可用功能正常运行的基础,它负责主机和备机的心跳检测和浮动 IP 切换等底层核心工作,如果检测到异常,会自动发生主备切换,浮动会漂移到备机,备机提升为主机继续提供服务(可支持一主多备架构)。其中数据库和 Redis 是通过主从复制机制进行数据同步保持主备数据的一致性,详情可见前面两篇文章。
在这里插入图片描述
在这里插入图片描述

  • 主机(MASTER)与备机(BACKUP)

    • 主机 负责数据库和 Redis 的读写,并接管 Keepalived 管理的 VRRP 虚拟 IP(即可通过 VIP 访问主机)。
    • 备机 处于待命状态,仅可通过真实 IP 进行只读访问(例如数据同步、健康检查)。
  • VIP(虚拟 IP)

    • 业务访问 Redis 和数据库时,优先通过 VIP 连接,确保主机可用性。
    • Keepalived 监控主机健康状态,若主机故障,则 VIP 自动切换到备机,保证服务不中断。
  • 故障切换(Failover)

    • 当 Keepalived 发现主机故障时,VRRP 机制将 VIP 切换到备机,备机接管数据库和 Redis 的读写。
    • 原主机恢复后,可能需要重新竞选 MASTER,也可以设定优先级策略,避免频繁切换。

2.2 Master 与 Backup 的竞选机制

  • 初始化阶段

    • 多台 VRRP 路由器启动,并加入同一个 VRRP 组。
    • 每台路由器都有一个 优先级(Priority)
  • 竞选 MASTER

    • 所有路由器发送 VRRP 多播报文(224.0.0.18) 宣告自己的优先级。
    • 优先级最高的设备当选 MASTER,其余设备成为 BACKUP
    • 如果优先级相同,则 IP 地址最高的设备 成为 MASTER。
  • 正常运行

    • MASTER 定期发送 VRRP 广播,告诉 BACKUP:“我还在正常工作”。
    • BACKUP 设备一直监听 MASTER 的 VRRP 报文,如果收到,则继续保持 BACKUP 状态。
  • MASTER 故障(主备切换)

    • 如果 BACKUP 在一定时间内收不到 MASTER 的 VRRP 报文(注意防火墙原因导致配置失败),就认为 MASTER 故障。
    • BACKUP 设备重新发起竞选,选出新的 MASTER,继续提供服务。
  • 原 MASTER 恢复(可选)

    • 如果原 MASTER 恢复上线,它可配置是否重新加入竞选或者按照备节点部署:

      • 如果它的优先级比当前 MASTER 高,它会重新当选 MASTER,并接管流量。
      • 如果优先级低,则继续作为 BACKUP 设备。

3. Keepalived 安装与部署

3.1 安装 Keepalived

Keepalived 可在大部分 Linux 发行版中直接安装:

yum install -y keepalived 

3.2 部署环境准备

测试两台主机(一主一备)环境:

主机:192.168.121.23
备机:192.168.121.24
浮动IP:192.168.121.155

提前将防火墙 VRRP 协议对端放开:

# 防火墙设置(主备机都需要执行)
sed -i "/-A INPUT -j REJECT --reject-with icmp-host-prohibited/i -A INPUT -d 224.0.0.0/8 -i ens33 -p vrrp -j ACCEPT" /etc/sysconfig/iptables
sed -i "/-A INPUT -j REJECT --reject-with icmp-host-prohibited/i -A OUTPUT -d 224.0.0.0/8 -o ens33 -p vrrp -j ACCEPT" /etc/sysconfig/iptables
# 防火墙重启
service iptables restart

3.3 配置 Keepalived

Keepalived 采用模块化设计,不同模块实现不同功能,主要由 core、check 和 vrrp 三个模块组成:

  1. core(核心模块):

    • 负责 Keepalived 主进程的启动和维护。
    • 解析并加载全局配置文件,管理整体运行逻辑。
  2. check(健康检查模块):

    • 负责对后端服务(如 LVS、IPVS)进行健康检查。
    • 提供多种健康检查方式,并解析对应的健康检查配置。
  3. vrrp(VRRP 模块):

    • 运行 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)子进程。
    • 负责管理虚拟 IP(VIP)的选举和切换,实现高可用故障转移。
主机配置

主机 keepalived 配置文件 keepalived.conf 配置示例:

! Configuration File for keepalivedglobal_defs {notification_email {root@localhost.localdomain}notification_email_from ha@localhost.localdomainsmtp_server 127.0.0.1smtp_connect_timeout 30router_id r_id
}vrrp_script check_run {script /opt/keepalived/ha/ha_service_check.shinterval 3  # 检测时间间隔 单位sfall 3      # 连续失败次数达到 3 次后执行下面的操作#weight -60 #
}vrrp_instance VI_1 {state BACKUP#nopreempt    # 配置是否抢占、和priority配合使用interface ens33    # 网卡track_interface {ens33}virtual_router_id 155    # 匹配号priority 150    # 优先级advert_int 2    # VRRP 通告频率 单位秒authentication {auth_type PASSauth_pass P@sSw0rd}track_script {check_run}notify_fault  /opt/keepalived/ha/ha_notify_fault.shnotify_master /opt/keepalived/ha/ha_notify_master.shnotify_backup /opt/keepalived/ha/ha_notify_backup.shvirtual_ipaddress {192.168.121.155/19 dev ens33 scope global}
}

📌 重点参数解析:

  • state MASTER:表示当前节点是主服务器(另一台应为 BACKUP
  • priority 100:优先级(值越大,越容易成为 Master)
  • virtual_router_id:虚拟路由 ID,所有 VRRP 设备需一致
  • virtual_ipaddress:虚拟 IP(VIP),提供高可用
  • track_script:执行的检测脚本
  • nopreempt:如果存在,则表示不抢占,和优先级参数(priority)一起配合使用
  • advert_int:检查间隔,单位秒。

💡 关键点:

  • priority 可用于控制主备切换的优先级
  • virtual_router_id 必须一致,否则主备不会识别

备机配置

和主机基本保持一致,角色都是设置为 BACKUP,只是主机优先级设置为 150,备机优先级设置为 100。在这种情况下,当发生主备切换后,即使之前的主节点恢复运行,它也不会抢占备用节点成为新的主节点。原来的备用节点将继续作为主节点提供服务,直到发生故障或手动切换。这种行为确保了在主节点失效后,备用节点能够稳定地接管服务,并且在主节点恢复运行时不会引起不必要的主从切换,保持系统的稳定性。

! Configuration File for keepalivedglobal_defs {notification_email {root@localhost.localdomain}notification_email_from ha@localhost.localdomainsmtp_server 127.0.0.1smtp_connect_timeout 30router_id r_id
}vrrp_script check_run {script /opt/keepalived/ha/ha_service_check.shinterval 3 # 检测时间间隔 单位sfall 3      # 连续失败次数达到 3 次后执行下面的操作#weight -60
}vrrp_instance VI_1 {state BACKUP#nopreempt    # 配置是否抢占interface ens33    # 网卡track_interface {ens33}virtual_router_id 155    # 匹配号priority 100    # 优先级advert_int 2    # VRRP 通告频率 单位秒authentication {auth_type PASSauth_pass P@sSw0rd}track_script {check_run}notify_fault  /opt/keepalived/ha/ha_notify_fault.shnotify_master /opt/keepalived/ha/ha_notify_master.shnotify_backup /opt/keepalived/ha/ha_notify_backup.shvirtual_ipaddress {192.168.121.155/19 dev ens33 scope global}
}

3.4 主备切换通知及检测机制

在主备配置完成后,或发生主备切换时,Keepalived 可触发通知,并执行相应的脚本,确保高可用性。

通知脚本触发机制

在以下两种情况下,Keepalived 会执行通知脚本:

  1. 主备状态发生切换(包括 Keepalived 启动时的角色确定)。
  2. 异常情况触发(如检测到 Redis/数据库服务故障、关键进程异常等)。

通知脚本可用于告警通知、日志记录、服务切换等操作。


3.5 主备状态检测脚本配置

Keepalived 通过 vrrp_script 定义健康检查规则,检测异常并触发相应的主备切换流程。

vrrp_script check_run {script /opt/keepalived/ha/ha_service_check.sh  # 健康检测脚本interval 3  # 检测间隔时间,单位:秒fall 3      # 连续失败 3 次后,触发主备切换
}

检测机制说明

  • 检测间隔:每 3 秒执行一次检测。
  • 失败阈值:当检测到连续 3 次失败,触发 notify_fault 事件,执行 /opt/keepalived/ha/ha_notify_fault.sh,停止 keepalived,进入故障状态。

3.6 自定义触发主备切换

除因宕机、Keepalived 进程异常退出导致的主备切换外,还支持自定义触发条件。例如,可在检测到以下异常情况时触发切换:

  1. 关键 Java 进程异常,导致服务不可用。
  2. Redis 或 数据库宕机,影响数据读写。
  3. 磁盘剩余空间低于 10% ,可能导致系统无法正常运行。

健康检查脚本 /opt/keepalived/ha/ha_service_check.sh 示例

#!/bin/bash
# 主备检测脚本
# 省略检测逻辑...
#if(数据库异常) exit 1
exit 0  # 0 代表检测通过,其他值代表失败

异常检测流程

  1. 每 3 秒检测一次interval 3)。
  2. 连续 3 次失败fall 3),触发 notify_fault,执行 /opt/keepalived/ha/ha_notify_fault.sh

3.7 故障处理(notify_fault)

当检测到故障(如 Redis/数据库 异常)并连续 3 次失败,Keepalived 触发 notify_fault 事件,执行 /opt/keepalived/ha/ha_notify_fault.sh 进行故障处理。

#!/bin/bash
# 故障通知脚本
echo "检测到异常...做切换" >> $HA_LOG_FILE
service stop keepalived
# 其他逻辑...

主机的 keepalived 停止则备机的 keepalived 会自动切换为新的主机,接管虚拟VIP。


3.8 主备切换流程

初始状态及切换逻辑

在该方案中,主机(Master)和备机(Backup)在初始化时,state 参数均设置为 BACKUP,这样:

  • 第一次启动时,主机会自动晋升为 Master,执行 /opt/keepalived/ha/ha_notify_master.sh
  • 主机宕机后,备机检测到主机失联,自动晋升为 Master,执行 /opt/keepalived/ha/ha_notify_master.sh

注意:角色切换不会修改 keepalived.conf 配置文件的 state 参数值,避免配置被错误覆盖。


3.9 主备切换相关脚本

主机晋升(notify_master)

当节点晋升为 Master 时,Keepalived 触发 notify_master,执行 /opt/keepalived/ha/ha_notify_master.sh,示例如下:

#!/bin/bash
# 主机晋升脚本
echo "当前节点晋升为主机(Master)"
# 省略具体逻辑...
exit 0

切换为备机(notify_backup)

当节点降级为 Backup 时,Keepalived 触发 notify_backup,执行 /opt/keepalived/ha/ha_notify_backup.sh,示例如下:

#!/bin/bash
# 备机降级脚本
echo "当前节点降级为备机(Backup)"
# 省略具体逻辑...
exit 0

4. 测试 Keepalived 主备切换

4.1 启动 Keepalived

service start keepalived

4.2 验证 VIP 绑定情况

ip addr

如果发现 vip 存在则表示配置成功。

4.3 模拟主机故障,观察 VIP 漂移

# 停止 Master(在主机上执行)
service stop keepalived# 在 Backup 上检查 VIP 是否接管(在备机上执行)
ip addr

若 vip 已转移到 Backup 服务器,则主备切换成功!


5. Keepalived 进阶功能

5.1 结合 LVS 负载均衡

Keepalived 可用于管理 LVS(Linux Virtual Server) ,实现高可用负载均衡。

5.2 结合 Nginx 实现高可用

可结合 Keepalived + Nginx 方案,构建高可用的 Web 负载均衡架构。


6. 总结

Keepalived 适用于哪些场景?

  • 服务器高可用(防止单点故障)
  • LVS 负载均衡管理
  • Nginx / HAProxy 高可用方案

使用 Keepalived 的核心步骤

  1. 安装 Keepalived
  2. 配置 VRRP(设置 VIP、优先级)
  3. 测试主备切换(模拟 Master 故障,观察 VIP 迁移)

📢 结语

如果你正在构建一个高可用架构,Keepalived 绝对是一个简单易用、高效可靠的解决方案

📌 你用过 Keepalived 吗?在评论区分享你的使用经验吧!

🌟 你的支持是我持续创作的动力,欢迎点赞、收藏、分享!



http://www.mrgr.cn/news/93097.html

相关文章:

  • ASP.NET Core JWT认证与授权
  • servlet tomcat
  • 使用ast获取py文件中所有函数与类名
  • 【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题
  • VTP故障诊断与排除
  • 月结保障:回滚慢、行锁频发
  • 【零基础到精通Java合集】第二十一集:JVM常用垃圾收集器
  • 历年杭州电子科技大学计算机考研复试上机真题
  • PMP项目管理—资源管理篇—3.获取资源
  • PMP项目管理—资源管理篇—5.管理团队
  • 05类加载机制篇(D6_方法调用和方法执行)
  • 5、使用 pgAdmin4 图形化创建和管理 PostgreSQL 数据库
  • 【基础3】快速排序
  • 动态规划_路径问题(典型算法思想)—— OJ例题算法解析思路
  • LC109. 有序链表转换平衡二叉搜索树
  • LLM 大模型基础认知篇
  • 【大模型】DeepSeek-R1各版本模型推理显存需求测算【理论+实践】
  • 线程相关八股
  • 机器学习11-经典网络解析
  • 【算法学习之路】5.贪心算法