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

相关推荐
两个人的幸福3 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
zzzzzz3103 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
BingoGo5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982076 天前
PHP 扩展——从入门到理解
php
鹏仔先生7 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
小宇宙Zz7 天前
Maven依赖冲突
java·服务器·maven
网络研究院7 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智7 天前
ARP代理--工作原理
运维·网络·arp·arp代理