Keepalived 高可用集群适用场景Nginx/HAProxy/LVS 高可用、负载均衡、故障自动切换核心协议VRRP (Virtual Router Redundancy Protocol) 第一部分核心概念与原理通俗版1.1 为什么要用 Keepalived痛点单台服务器挂了网站就打不开了单点故障 SPOF。解决搞两台服务器一台主用一台备用。如果主挂了备用立马顶上去用户无感知。核心指标RTO(Recovery Time Objective)业务中断到恢复的时间。Keepalived 能做到秒级切换。可用性追求 5 个 9 (99.999%)一年只停机约 5 分钟。1.2 Keepalived 是怎么工作的它主要干两件事管 VIP (虚拟 IP)利用VRRP 协议让多台机器共用一个“假 IP”(VIP)。Master活着的时候VIP 绑定在它身上处理所有流量。Backup监听 Master 的心跳。如果听不到心跳默认 3 秒就认为 Master 挂了自己把 VIP 绑到自己身上接管流量。管健康不仅监控自己活没活还能监控后面的真实服务如 Nginx、MySQL。如果服务挂了但进程还在Keepalived 能检测到并主动降低优先级让出 VIP。1.3 VRRP 协议关键点选举机制优先级 (priority) 高的当老大 (Master)。范围 1-254默认 100。心跳检测Master 每秒 (advert_int) 发一次组播/单播说“我还活着”。脑裂 (Split-Brain)最危险的情况。两台机器都以为自己是 Master都持有 VIP导致 IP 冲突用户访问随机失败。常见原因防火墙挡住了心跳包、配置不一致VRID/密码不同、网络隔离。️ 第二部分环境部署与基础命令2.1 安装与初始化# Ubuntu/Debianaptupdateaptinstall-ykeepalived# CentOS/Rocky/OpenEuleryuminstall-ykeepalived# ⚠️ 重要Ubuntu 安装后必须复制配置文件否则启动失败cp/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf# 清理无用配置只保留 VRRP 部分防止 LVS 报错# 删除 virtual_server 段落之后的所有内容sed-i/virtual_server/,$d/etc/keepalived/keepalived.conf# 修改网卡名将 eth0 改为你实际的网卡名如 ens33, eth0, enp0s3# 先用 ip addr 查看你的网卡名sed-is/eth0/ens33/g/etc/keepalived/keepalived.conf2.2 常用管理命令# 服务管理systemctl start keepalived# 启动systemctl stop keepalived# 停止systemctl restart keepalived# 重启systemctl status keepalived# 查看状态systemctlenablekeepalived# 开机自启# 验证 VIP 是否绑定成功 (推荐使用 ip addr)ipaddr show网卡名# 例如: ip addr show ens33# 若成功会在网卡下看到 secondary IP (即 VIP)# 查看进程 (正常应有 2-3 个进程)psaux|grepkeepalived# 输出示例:# parent (监控)# child (VRRP 心跳)# child (健康检查若配置了)# 查看系统日志 (排错核心)tail-f/var/log/syslog# Ubuntu/Debiantail-f/var/log/messages# CentOS/RHEL# 搜索关键字: VRRP, Transition, Fault, MASTER, BACKUP# 抓包分析 VRRP 心跳 (协议号 112, 组播地址 224.0.0.18)tcpdump-i网卡名-nnhost224.0.0.18# 单播模式抓包tcpdump-i网卡名-nnhost对端IP# 查看 LVS 规则 (若配置了负载均衡)ipvsadm-Ln# 显示详细规则ipvsadm-Lcn# 显示连接跟踪表2.3 防火墙设置防脑裂关键Keepalived 使用IP 协议号 112不是 TCP/UDP 端口。# iptables 放行iptables-AINPUT-p112-jACCEPT iptables-AOUTPUT-p112-jACCEPT# 若使用组播iptables-AINPUT-d224.0.0.18-jACCEPT iptables-AOUTPUT-s224.0.0.18-jACCEPT# Ubuntu (nftables/ufw) 注意事项# 新版 Ubuntu 可能默认拦截 VIP 流量测试时可临时清空规则nft flush ruleset# 生产环境需添加允许 VIP 入站的规则⚙️ 第三部分配置文件详解全注释版配置文件路径/etc/keepalived/keepalived.conf结构分为三块global_defs全局配置 (通知、ID)。vrrp_instance高可用核心配置 (VIP、心跳、优先级)。virtual_serverLVS 负载均衡配置 (可选)。3.1 最小化主备配置模板 Master 节点配置 (带详细注释)!Configuration Fileforkeepalived# --- 全局配置块 ---global_defs{# 【必填】路由标识集群内每台机器必须唯一用于区分日志来源router_id LVS_MASTER# (可选) 邮件通知配置发生切换时发邮件# notification_email { adminexample.com }# smtp_server 192.168.1.1# smtp_connect_timeout 30}# --- VRRP 实例配置块 (核心) ---vrrp_instance VI_1{# 【必填】初始状态MASTER 或 BACKUPstate MASTER# 【必填】绑定 VIP 的网卡名称 (务必用 ip addr 确认如 ens33, eth0)interface ens33# 【必填】虚拟路由器 ID (0-255)集群内所有节点必须一致virtual_router_id51# 【必填】优先级 (1-254)Master 必须比 Backup 大 (默认 100)priority100# 心跳发送间隔 (秒)集群内必须一致默认 1 秒advert_int1# 认证配置 (防止非法节点加入)authentication{auth_type PASS# 认证类型PASS (简单密码) 或 AH (IPSEC 加密)auth_pass1111# 密码集群内必须一致最多 8 位字符}# 【必填】虚拟 IP 列表 (可以写多个)virtual_ipaddress{192.168.1.100# 对外服务的 VIP# 192.168.1.101 dev ens33 label ens33:vip2 # 指定网卡和标签}# (可选) 状态切换通知脚本# notify_master /etc/keepalived/master_notify.sh# notify_backup /etc/keepalived/backup_notify.sh# notify_fault /etc/keepalived/fault_notify.sh# notify_stop /etc/keepalived/stop_notify.sh# (可选) 延迟加载 VIP (防止启动时网络未就绪)# preempt_delay 60} Backup 节点配置 (带详细注释)global_defs{router_id LVS_BACKUP# 标识不同}vrrp_instance VI_1{# 【关键】备节点初始状态设为 BACKUPstate BACKUP interface ens33# 网卡名需与实际一致virtual_router_id51# 必须与 Master 一致priority90# 必须比 Master 小 (如 90)advert_int1authentication{auth_type PASS auth_pass1111# 必须与 Master 一致}virtual_ipaddress{192.168.1.100# 必须与 Master 一致}}3.2 高级配置项注释A. 非抢占模式 (Non-Preempt)场景Master 修好后不想让它立刻抢回 VIP避免业务抖动。配置要点双机state都配BACKUP原 Master 加nopreempt。vrrp_instance VI_1{state BACKUP# 【关键】双机都配 BACKUPinterface ens33 virtual_router_id51priority100# 原 Master 优先级依然要高nopreempt# 【关键】开启非抢占模式 (只在高优先级节点配)advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.1.100}}B. 单播模式 (Unicast)场景云环境不支持组播或跨网段。配置要点指定源 IP 和对端 IP。注意开启单播通常不能开vrrp_strict。vrrp_instance VI_1{# ... 基础配置 (state, priority 等) ...unicast_src_ip192.168.1.10# 本机心跳网卡 IPunicast_peer{192.168.1.11# 对端心跳网卡 IP (可写多个)# 192.168.1.12}}C. 自定义脚本检测 (VRRP Script)场景检测 Nginx 进程若挂了则降低优先级让出 VIP。# 1. 定义脚本 (放在 vrrp_instance 之前)vrrp_script check_nginx{script/etc/keepalived/check_nginx.sh# 脚本绝对路径interval2# 每 2 秒执行一次weight-20# 【关键】脚本失败时优先级减 20# 若原 100失败后变 80低于 Backup(90)触发切换fall3# 连续失败 3 次才判定失败 (防抖动)rise1# 连续成功 1 次判定恢复timeout3# 脚本执行超时时间}# 2. 在实例中调用vrrp_instance VI_1{# ... 基础配置 ...track_script{check_nginx# 引用上面定义的脚本名}}脚本示例 (/etc/keepalived/check_nginx.sh):#!/bin/bash# 逻辑如果 nginx 进程不存在尝试重启若重启失败或进程仍不存在返回 1if!pgrep-xnginx/dev/null;thensystemctl try-restart nginxsleep2if!pgrep-xnginx/dev/null;thenexit1# 返回 1 表示失败Keepalived 执行 weight 减法fifiexit0# 返回 0 表示成功记得给脚本执行权限chmod x /etc/keepalived/check_nginx.shD. 结合 LVS 做负载均衡 (Virtual Server)场景Keepalived 作为入口分发流量给后端 Real Server (RS)。virtual_server192.168.1.10080{# VIP 和 端口delay_loop6# 健康检查间隔 (秒)lb_algo rr# 调度算法rr(轮询), wrr(加权), lc(最少连接), sh(源哈希)lb_kind DR# 转发模式DR (生产常用), NAT, TUNprotocol TCP# 协议real_server192.168.1.1480{# 后端真实服务器 IP 和端口weight1# 权重越大分配越多TCP_CHECK{# 健康检查方式connect_timeout3retry3delay_before_retry3}}real_server192.168.1.1580{weight2HTTP_GET{# HTTP 深度检查url{path /index.html status_code200}connect_timeout3retry3delay_before_retry3}}sorry_server192.168.1.1680# 当所有 RS 都挂了转向这个备用服务器 (兜底)} 第四部分文档实战案例整理根据文档内容整理了以下三个核心实战场景可直接落地。案例一Nginx 高可用集群 (主备 进程检测)目标两台机器跑 Nginx通过 VIP 访问。若主节点 Nginx 挂掉且无法重启VIP 自动漂移到备节点。1. 准备检测脚本 (/etc/keepalived/check_nginx.sh)#!/bin/bash# 检查 nginx 进程若不存在尝试重启仍失败则退出 1counter$(ps-Cnginx --no-heading|wc-l)if[${counter}0];thensystemctl try-restart nginxsleep2counter$(ps-Cnginx --no-heading|wc-l)if[${counter}0];thenexit1# 彻底失败触发 keepalived 降权fifiexit0赋予权限chmod x /etc/keepalived/check_nginx.sh2. Master 节点配置global_defs{router_id NGINX_MASTER}vrrp_script check_nginx{script/etc/keepalived/check_nginx.shinterval2weight-20# 失败后优先级 100-2080低于 Backup 的 90fall3rise1}vrrp_instance VI_NGINX{state MASTER interface ens33# 替换为实际网卡virtual_router_id51priority100advert_int1authentication{auth_type PASS auth_pass1111}track_script{check_nginx}virtual_ipaddress{192.168.1.200# Nginx VIP}# 可选切换时重载 nginx 配置或记录日志# notify_master /etc/keepalived/master_notify.sh}Backup 节点只需将state改为BACKUPpriority改为90router_id改为NGINX_BACKUP。案例二HAProxy 高可用 (特殊内核参数)目标HAProxy 需要绑定 VIP 监听但 VIP 可能尚未在本机。特殊步骤必须开启内核参数允许绑定非本地 IP。1. 开启内核参数 (两台机器都要做)echonet.ipv4.ip_nonlocal_bind 1/etc/sysctl.confsysctl-p解释允许应用程序绑定非本地 IP (即 VIP)即使该 IP 当前不在网卡上。2. Keepalived 配置与 Nginx 案例类似只需将检测脚本改为检测haproxy进程VIP 设为 HAProxy 监听 IP。案例三LVS-DR 模式负载均衡集群目标Keepalived 做调度器 (Director)后端两台 Real Server (RS) 跑 Web。1. Director (Keepalived) 配置global_defs{router_id LVS_DR_MASTER}vrrp_instance VI_LVS{state MASTER interface ens33 virtual_router_id52priority100advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.1.200# LVS VIP}}virtual_server192.168.1.20080{delay_loop6lb_algo rr lb_kind DR# 关键DR 模式protocol TCP real_server192.168.1.1480{weight1TCP_CHECK{connect_timeout3retry3}}real_server192.168.1.1580{weight1TCP_CHECK{connect_timeout3retry3}}}2. Real Server (后端节点) 配置脚本在后端 RS (192.168.1.14/15) 上执行配置 ARP 抑制防止 RS 响应 VIP 的 ARP 请求。#!/bin/bashVIP192.168.1.200# 绑定 VIP 到 Lo 接口ifconfiglo:0$VIPnetmask255.255.255.255 up# 调整内核参数 (ARP 抑制)echo1/proc/sys/net/ipv4/conf/lo/arp_ignoreecho2/proc/sys/net/ipv4/conf/lo/arp_announceecho1/proc/sys/net/ipv4/conf/all/arp_ignoreecho2/proc/sys/net/ipv4/conf/all/arp_announce# 永久生效需写入 /etc/sysctl.conf 第五部分故障排查与总结5.1 脑裂 (Split-Brain) 预防清单如果发现两台机器都有 VIP立即检查防火墙是否放行了 IP 协议 112(iptables -L)配置一致性virtual_router_id、password、advert_int是否完全一致网卡名称interface填写的网卡名是否存在且 UP组播/单播云环境是否误用了组播建议改用unicast_peer。时间同步所有节点必须配置 Chrony/NTP时间偏差过大会影响心跳判断。5.2 日志独立配置 (最佳实践)不要让 Keepalived 日志混在系统日志里。配置 rsyslog(/etc/rsyslog.d/keepalived.conf):local6.* /var/log/keepalived.log stop# 新版 rsyslog 用 stop旧版用 ~修改 Keepalived 启动参数Debian/Ubuntu: 编辑/etc/default/keepalived添加KEEPALIVED_OPTIONS-S 6。CentOS/Systemd: 编辑/usr/lib/systemd/system/keepalived.service在ExecStart后加-S 6。重启systemctl restart rsyslog systemctl restart keepalived5.3 核心总结 (主次分明)优先级知识点说明 最重要 (Must Know)配置文件三大块global_defs,vrrp_instance,virtual_server主备区别state(MASTER/BACKUP) 和priority(主大备小)防脑裂防火墙放行协议 112配置参数必须一致健康检查vrrp_scripttrack_script是实现服务高可用的灵魂⚡ 次要 (Should Know)非抢占模式nopreempt配置细节双机 state 均为 BACKUP单播模式unicast_peer在云环境的应用LVS DR 模式后端需配置 ARP 抑制 (arp_ignore1,arp_announce2) 扩展 (Nice to Know)邮件通知notification_email配置多主模式配置两个 VRID 实现双活日志独立rsyslog 配置-S 6
Keepalived 高可用集群
Keepalived 高可用集群适用场景Nginx/HAProxy/LVS 高可用、负载均衡、故障自动切换核心协议VRRP (Virtual Router Redundancy Protocol) 第一部分核心概念与原理通俗版1.1 为什么要用 Keepalived痛点单台服务器挂了网站就打不开了单点故障 SPOF。解决搞两台服务器一台主用一台备用。如果主挂了备用立马顶上去用户无感知。核心指标RTO(Recovery Time Objective)业务中断到恢复的时间。Keepalived 能做到秒级切换。可用性追求 5 个 9 (99.999%)一年只停机约 5 分钟。1.2 Keepalived 是怎么工作的它主要干两件事管 VIP (虚拟 IP)利用VRRP 协议让多台机器共用一个“假 IP”(VIP)。Master活着的时候VIP 绑定在它身上处理所有流量。Backup监听 Master 的心跳。如果听不到心跳默认 3 秒就认为 Master 挂了自己把 VIP 绑到自己身上接管流量。管健康不仅监控自己活没活还能监控后面的真实服务如 Nginx、MySQL。如果服务挂了但进程还在Keepalived 能检测到并主动降低优先级让出 VIP。1.3 VRRP 协议关键点选举机制优先级 (priority) 高的当老大 (Master)。范围 1-254默认 100。心跳检测Master 每秒 (advert_int) 发一次组播/单播说“我还活着”。脑裂 (Split-Brain)最危险的情况。两台机器都以为自己是 Master都持有 VIP导致 IP 冲突用户访问随机失败。常见原因防火墙挡住了心跳包、配置不一致VRID/密码不同、网络隔离。️ 第二部分环境部署与基础命令2.1 安装与初始化# Ubuntu/Debianaptupdateaptinstall-ykeepalived# CentOS/Rocky/OpenEuleryuminstall-ykeepalived# ⚠️ 重要Ubuntu 安装后必须复制配置文件否则启动失败cp/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf# 清理无用配置只保留 VRRP 部分防止 LVS 报错# 删除 virtual_server 段落之后的所有内容sed-i/virtual_server/,$d/etc/keepalived/keepalived.conf# 修改网卡名将 eth0 改为你实际的网卡名如 ens33, eth0, enp0s3# 先用 ip addr 查看你的网卡名sed-is/eth0/ens33/g/etc/keepalived/keepalived.conf2.2 常用管理命令# 服务管理systemctl start keepalived# 启动systemctl stop keepalived# 停止systemctl restart keepalived# 重启systemctl status keepalived# 查看状态systemctlenablekeepalived# 开机自启# 验证 VIP 是否绑定成功 (推荐使用 ip addr)ipaddr show网卡名# 例如: ip addr show ens33# 若成功会在网卡下看到 secondary IP (即 VIP)# 查看进程 (正常应有 2-3 个进程)psaux|grepkeepalived# 输出示例:# parent (监控)# child (VRRP 心跳)# child (健康检查若配置了)# 查看系统日志 (排错核心)tail-f/var/log/syslog# Ubuntu/Debiantail-f/var/log/messages# CentOS/RHEL# 搜索关键字: VRRP, Transition, Fault, MASTER, BACKUP# 抓包分析 VRRP 心跳 (协议号 112, 组播地址 224.0.0.18)tcpdump-i网卡名-nnhost224.0.0.18# 单播模式抓包tcpdump-i网卡名-nnhost对端IP# 查看 LVS 规则 (若配置了负载均衡)ipvsadm-Ln# 显示详细规则ipvsadm-Lcn# 显示连接跟踪表2.3 防火墙设置防脑裂关键Keepalived 使用IP 协议号 112不是 TCP/UDP 端口。# iptables 放行iptables-AINPUT-p112-jACCEPT iptables-AOUTPUT-p112-jACCEPT# 若使用组播iptables-AINPUT-d224.0.0.18-jACCEPT iptables-AOUTPUT-s224.0.0.18-jACCEPT# Ubuntu (nftables/ufw) 注意事项# 新版 Ubuntu 可能默认拦截 VIP 流量测试时可临时清空规则nft flush ruleset# 生产环境需添加允许 VIP 入站的规则⚙️ 第三部分配置文件详解全注释版配置文件路径/etc/keepalived/keepalived.conf结构分为三块global_defs全局配置 (通知、ID)。vrrp_instance高可用核心配置 (VIP、心跳、优先级)。virtual_serverLVS 负载均衡配置 (可选)。3.1 最小化主备配置模板 Master 节点配置 (带详细注释)!Configuration Fileforkeepalived# --- 全局配置块 ---global_defs{# 【必填】路由标识集群内每台机器必须唯一用于区分日志来源router_id LVS_MASTER# (可选) 邮件通知配置发生切换时发邮件# notification_email { adminexample.com }# smtp_server 192.168.1.1# smtp_connect_timeout 30}# --- VRRP 实例配置块 (核心) ---vrrp_instance VI_1{# 【必填】初始状态MASTER 或 BACKUPstate MASTER# 【必填】绑定 VIP 的网卡名称 (务必用 ip addr 确认如 ens33, eth0)interface ens33# 【必填】虚拟路由器 ID (0-255)集群内所有节点必须一致virtual_router_id51# 【必填】优先级 (1-254)Master 必须比 Backup 大 (默认 100)priority100# 心跳发送间隔 (秒)集群内必须一致默认 1 秒advert_int1# 认证配置 (防止非法节点加入)authentication{auth_type PASS# 认证类型PASS (简单密码) 或 AH (IPSEC 加密)auth_pass1111# 密码集群内必须一致最多 8 位字符}# 【必填】虚拟 IP 列表 (可以写多个)virtual_ipaddress{192.168.1.100# 对外服务的 VIP# 192.168.1.101 dev ens33 label ens33:vip2 # 指定网卡和标签}# (可选) 状态切换通知脚本# notify_master /etc/keepalived/master_notify.sh# notify_backup /etc/keepalived/backup_notify.sh# notify_fault /etc/keepalived/fault_notify.sh# notify_stop /etc/keepalived/stop_notify.sh# (可选) 延迟加载 VIP (防止启动时网络未就绪)# preempt_delay 60} Backup 节点配置 (带详细注释)global_defs{router_id LVS_BACKUP# 标识不同}vrrp_instance VI_1{# 【关键】备节点初始状态设为 BACKUPstate BACKUP interface ens33# 网卡名需与实际一致virtual_router_id51# 必须与 Master 一致priority90# 必须比 Master 小 (如 90)advert_int1authentication{auth_type PASS auth_pass1111# 必须与 Master 一致}virtual_ipaddress{192.168.1.100# 必须与 Master 一致}}3.2 高级配置项注释A. 非抢占模式 (Non-Preempt)场景Master 修好后不想让它立刻抢回 VIP避免业务抖动。配置要点双机state都配BACKUP原 Master 加nopreempt。vrrp_instance VI_1{state BACKUP# 【关键】双机都配 BACKUPinterface ens33 virtual_router_id51priority100# 原 Master 优先级依然要高nopreempt# 【关键】开启非抢占模式 (只在高优先级节点配)advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.1.100}}B. 单播模式 (Unicast)场景云环境不支持组播或跨网段。配置要点指定源 IP 和对端 IP。注意开启单播通常不能开vrrp_strict。vrrp_instance VI_1{# ... 基础配置 (state, priority 等) ...unicast_src_ip192.168.1.10# 本机心跳网卡 IPunicast_peer{192.168.1.11# 对端心跳网卡 IP (可写多个)# 192.168.1.12}}C. 自定义脚本检测 (VRRP Script)场景检测 Nginx 进程若挂了则降低优先级让出 VIP。# 1. 定义脚本 (放在 vrrp_instance 之前)vrrp_script check_nginx{script/etc/keepalived/check_nginx.sh# 脚本绝对路径interval2# 每 2 秒执行一次weight-20# 【关键】脚本失败时优先级减 20# 若原 100失败后变 80低于 Backup(90)触发切换fall3# 连续失败 3 次才判定失败 (防抖动)rise1# 连续成功 1 次判定恢复timeout3# 脚本执行超时时间}# 2. 在实例中调用vrrp_instance VI_1{# ... 基础配置 ...track_script{check_nginx# 引用上面定义的脚本名}}脚本示例 (/etc/keepalived/check_nginx.sh):#!/bin/bash# 逻辑如果 nginx 进程不存在尝试重启若重启失败或进程仍不存在返回 1if!pgrep-xnginx/dev/null;thensystemctl try-restart nginxsleep2if!pgrep-xnginx/dev/null;thenexit1# 返回 1 表示失败Keepalived 执行 weight 减法fifiexit0# 返回 0 表示成功记得给脚本执行权限chmod x /etc/keepalived/check_nginx.shD. 结合 LVS 做负载均衡 (Virtual Server)场景Keepalived 作为入口分发流量给后端 Real Server (RS)。virtual_server192.168.1.10080{# VIP 和 端口delay_loop6# 健康检查间隔 (秒)lb_algo rr# 调度算法rr(轮询), wrr(加权), lc(最少连接), sh(源哈希)lb_kind DR# 转发模式DR (生产常用), NAT, TUNprotocol TCP# 协议real_server192.168.1.1480{# 后端真实服务器 IP 和端口weight1# 权重越大分配越多TCP_CHECK{# 健康检查方式connect_timeout3retry3delay_before_retry3}}real_server192.168.1.1580{weight2HTTP_GET{# HTTP 深度检查url{path /index.html status_code200}connect_timeout3retry3delay_before_retry3}}sorry_server192.168.1.1680# 当所有 RS 都挂了转向这个备用服务器 (兜底)} 第四部分文档实战案例整理根据文档内容整理了以下三个核心实战场景可直接落地。案例一Nginx 高可用集群 (主备 进程检测)目标两台机器跑 Nginx通过 VIP 访问。若主节点 Nginx 挂掉且无法重启VIP 自动漂移到备节点。1. 准备检测脚本 (/etc/keepalived/check_nginx.sh)#!/bin/bash# 检查 nginx 进程若不存在尝试重启仍失败则退出 1counter$(ps-Cnginx --no-heading|wc-l)if[${counter}0];thensystemctl try-restart nginxsleep2counter$(ps-Cnginx --no-heading|wc-l)if[${counter}0];thenexit1# 彻底失败触发 keepalived 降权fifiexit0赋予权限chmod x /etc/keepalived/check_nginx.sh2. Master 节点配置global_defs{router_id NGINX_MASTER}vrrp_script check_nginx{script/etc/keepalived/check_nginx.shinterval2weight-20# 失败后优先级 100-2080低于 Backup 的 90fall3rise1}vrrp_instance VI_NGINX{state MASTER interface ens33# 替换为实际网卡virtual_router_id51priority100advert_int1authentication{auth_type PASS auth_pass1111}track_script{check_nginx}virtual_ipaddress{192.168.1.200# Nginx VIP}# 可选切换时重载 nginx 配置或记录日志# notify_master /etc/keepalived/master_notify.sh}Backup 节点只需将state改为BACKUPpriority改为90router_id改为NGINX_BACKUP。案例二HAProxy 高可用 (特殊内核参数)目标HAProxy 需要绑定 VIP 监听但 VIP 可能尚未在本机。特殊步骤必须开启内核参数允许绑定非本地 IP。1. 开启内核参数 (两台机器都要做)echonet.ipv4.ip_nonlocal_bind 1/etc/sysctl.confsysctl-p解释允许应用程序绑定非本地 IP (即 VIP)即使该 IP 当前不在网卡上。2. Keepalived 配置与 Nginx 案例类似只需将检测脚本改为检测haproxy进程VIP 设为 HAProxy 监听 IP。案例三LVS-DR 模式负载均衡集群目标Keepalived 做调度器 (Director)后端两台 Real Server (RS) 跑 Web。1. Director (Keepalived) 配置global_defs{router_id LVS_DR_MASTER}vrrp_instance VI_LVS{state MASTER interface ens33 virtual_router_id52priority100advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{192.168.1.200# LVS VIP}}virtual_server192.168.1.20080{delay_loop6lb_algo rr lb_kind DR# 关键DR 模式protocol TCP real_server192.168.1.1480{weight1TCP_CHECK{connect_timeout3retry3}}real_server192.168.1.1580{weight1TCP_CHECK{connect_timeout3retry3}}}2. Real Server (后端节点) 配置脚本在后端 RS (192.168.1.14/15) 上执行配置 ARP 抑制防止 RS 响应 VIP 的 ARP 请求。#!/bin/bashVIP192.168.1.200# 绑定 VIP 到 Lo 接口ifconfiglo:0$VIPnetmask255.255.255.255 up# 调整内核参数 (ARP 抑制)echo1/proc/sys/net/ipv4/conf/lo/arp_ignoreecho2/proc/sys/net/ipv4/conf/lo/arp_announceecho1/proc/sys/net/ipv4/conf/all/arp_ignoreecho2/proc/sys/net/ipv4/conf/all/arp_announce# 永久生效需写入 /etc/sysctl.conf 第五部分故障排查与总结5.1 脑裂 (Split-Brain) 预防清单如果发现两台机器都有 VIP立即检查防火墙是否放行了 IP 协议 112(iptables -L)配置一致性virtual_router_id、password、advert_int是否完全一致网卡名称interface填写的网卡名是否存在且 UP组播/单播云环境是否误用了组播建议改用unicast_peer。时间同步所有节点必须配置 Chrony/NTP时间偏差过大会影响心跳判断。5.2 日志独立配置 (最佳实践)不要让 Keepalived 日志混在系统日志里。配置 rsyslog(/etc/rsyslog.d/keepalived.conf):local6.* /var/log/keepalived.log stop# 新版 rsyslog 用 stop旧版用 ~修改 Keepalived 启动参数Debian/Ubuntu: 编辑/etc/default/keepalived添加KEEPALIVED_OPTIONS-S 6。CentOS/Systemd: 编辑/usr/lib/systemd/system/keepalived.service在ExecStart后加-S 6。重启systemctl restart rsyslog systemctl restart keepalived5.3 核心总结 (主次分明)优先级知识点说明 最重要 (Must Know)配置文件三大块global_defs,vrrp_instance,virtual_server主备区别state(MASTER/BACKUP) 和priority(主大备小)防脑裂防火墙放行协议 112配置参数必须一致健康检查vrrp_scripttrack_script是实现服务高可用的灵魂⚡ 次要 (Should Know)非抢占模式nopreempt配置细节双机 state 均为 BACKUP单播模式unicast_peer在云环境的应用LVS DR 模式后端需配置 ARP 抑制 (arp_ignore1,arp_announce2) 扩展 (Nice to Know)邮件通知notification_email配置多主模式配置两个 VRID 实现双活日志独立rsyslog 配置-S 6