Keepalived高可用配置指南

Keepalived 实验环境与配置笔记

概览 / 拓扑

  • Keepalived 节点
    • KA1: 172.25.254.50 (MASTER)
    • KA2: 172.25.254.60 (BACKUP)
  • 后端 Web 服务
    • rs1: 172.25.254.10
    • rs2: 172.25.254.20
  • 虚拟 IP (VIP):172.25.254.100(通过 VRRP 发布)
  • 网络模式:单网卡 NAT(eth0)

环境准备

1. 部署后端 web(rs1、rs2)

在 rs1:

bash 复制代码
vmset.sh eth0 172.25.254.10 rs1
dnf install httpd -y
echo "RS1 - 172.25.254.10" > /var/www/html/index.html
systemctl enable --now httpd

在 rs2:

bash 复制代码
vmset.sh eth0 172.25.254.20 rs2
dnf install httpd -y
echo "RS2 - 172.25.254.20" > /var/www/html/index.html
systemctl enable --now httpd

测试:

bash 复制代码
curl 172.25.254.10   # 应显示 RS1 - 172.25.254.10
curl 172.25.254.20   # 应显示 RS2 - 172.25.254.20

2. 部署 Keepalived 节点(KA1、KA2)

在 KA1:

bash 复制代码
vmset.sh eth0 172.25.254.50 KA1

在 KA2(示例中有笔误 KA6,应为 KA2):

bash 复制代码
vmset.sh eth0 172.25.254.60 KA2

3. 同步 /etc/hosts

在 KA1 编辑 /etc/hosts:

text 复制代码
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.50     KA1
172.25.254.60     KA2
172.25.254.10     rs1
172.25.254.20     rs2

从 KA1 分发到其它主机:

bash 复制代码
for i in 60 10 20; do
  scp /etc/hosts 172.25.254.$i:/etc/hosts
done

时间同步(Chrony)

在 KA1 提供时间同步

编辑 /etc/chrony.conf,添加:

text 复制代码
allow 0.0.0.0/0
local stratum 10

然后:

bash 复制代码
systemctl restart chronyd
systemctl enable --now chronyd

在 KA2 使用 KA1 作为上游

/etc/chrony.conf 中添加:

text 复制代码
pool 172.25.254.50 iburst

然后:

bash 复制代码
systemctl restart chronyd
systemctl enable --now chronyd
chronyc sources -v

Keepalived 安装

在两台节点上:

bash 复制代码
dnf install keepalived.x86_64 -y
systemctl enable --now keepalived.service

主配置(/etc/keepalived/keepalived.conf 示例)

建议把全局设置放在主配置,具体 VRRP 实例放在子文件中,通过 include 加载,便于维护。

主配置示例:

text 复制代码
! Configuration File for keepalived

global_defs {
   notification_email {
     timinglee_zln@163.com
   }
   notification_email_from timinglee_zln@163.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id KA1
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44
}

include /etc/keepalived/conf.d/*.conf

说明:

  • include /etc/keepalived/conf.d/*.conf 用于拆分子配置。
  • vrrp_skip_check_adv_addr 用于某些网络环境避免地址检查失败(使用前理解其影响)。

子配置(/etc/keepalived/conf.d/webvip.conf 示例)

conf.d 下单独写 VRRP 实例:

text 复制代码
vrrp_instance WEB_VIP {
    state MASTER           # MASTER 节点写 MASTER,备节点写 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100           # MASTER 优先级高(例如 100),BACKUP 较低(例如 80)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
}

备节点 (KA2) 修改为:

  • state BACKUP
  • priority 80

测试配置并重启:

bash 复制代码
keepalived -t -f /etc/keepalived/keepalived.conf
systemctl restart keepalived.service

VIP 验证

  • 查看接口(应该看到 eth0:0 或 ip addr 中的 secondary address):
bash 复制代码
ifconfig
# 或
ip addr show eth0
  • 抓包查看 VRRP 广播包:
bash 复制代码
tcpdump -i eth0 -nn host 224.0.0.44
# 将看到 VRRP Advertisement 报文,如 vrid 51, prio 100 ...
  • 客户端测试 VIP:
bash 复制代码
curl 172.25.254.100

故障演练(Failover)

  1. 在 MASTER(KA1)上模拟故障:
bash 复制代码
systemctl stop keepalived.service
  1. 在 BACKUP(KA2)上检查 VIP 是否被迁移(ifconfig / ip addr)。
  2. 恢复 MASTER:
bash 复制代码
systemctl start keepalived.service

日志分离(把 keepalived 日志单独写文件)

  1. 设置 Keepalived 启动参数以指定 syslog facility(示例使用 local6):
    编辑 /etc/sysconfig/keepalived,添加或修改:
bash 复制代码
KEEPALIVED_OPTIONS="-D -S 6"

说明:参数语义可能随发行版/版本有所差异,-S 指定 syslog facility(6 对应 local6);请参考本机 keepalived 的 man 文档或发行版说明。

  1. 配置 rsyslog:
    /etc/rsyslog.conf 或新建 /etc/rsyslog.d/keepalived.conf 中加入:
text 复制代码
local6.*    /var/log/keepalived.log

重启 rsyslog:

bash 复制代码
systemctl restart rsyslog.service

查看日志:

bash 复制代码
ls -l /var/log/keepalived.log
tail -f /var/log/keepalived.log

常用命令速查

  • 配置测试: keepalived -t -f /etc/keepalived/keepalived.conf
  • 启停服务: systemctl enable --now keepalived.service / systemctl stop/start keepalived.service
  • 日志查看: tail -f /var/log/keepalived.logjournalctl -u keepalived -f
  • 抓包: tcpdump -i eth0 -nn host 224.0.0.44
  • 网络接口: ifconfigip addr
  • Chrony 状态: chronyc sources -v

注意事项与排障建议

  • auth_pass 必须在所有参与 VRRP 的节点上相同。
  • 同一 VIP 的 virtual_router_id 必须相同;不同 VIP 必须使用不同 ID。
  • priority 越大优先成为 MASTER。
  • interface 必须填写正确的物理接口名称(���拟化环境可能是 ens33、eth0 等)。
  • VIP 无法出现时,检查:
    • keepalived 配置语法(keepalived -t
    • keepalived 日志(/var/log/keepalived.logjournalctl
    • 系统或网络管理工具(NetworkManager、systemd-networkd)是否干预地址别名
    • 多播(multicast)是否被宿主或虚拟网络阻断
  • 与 ARP、gratuitous ARP 相关的问题可通过调整 vrrp_garp_intervalvrrp_gna_interval 等参数尝试改善。
  • 在某些网络环境下可使用 vrrp_skip_check_adv_addr 绕开地址检查问题(谨慎使用)。

简要复查清单(运行前)

  1. /etc/hosts 已同步到所有节点
  2. rs1/rs2 web 服务��运行并可访问
  3. chronyd/ntp 同步正常(尤其是时钟偏差)
  4. keepalived 已安装并启用,主/备配置正确(MASTER/BACKUP 与 priority)
  5. rsyslog 已配置(若需要单独日志)
  6. 执行一次配置语法校验: keepalived -t -f /etc/keepalived/keepalived.conf

相关推荐
YuMiao10 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
Rockbean4 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩4 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试