Keepalived 高可用集群部署与配置实践

Keepalived 高可用集群部署与配置实践 Keepalived 高可用集群部署与配置实践1. 概述1.1 高可用集群在服务器集群架构中按功能可分为三类集群类型全称用途代表软件LBLoad Balance流量分摊提升吞吐LVS、HAProxy、NginxHAHigh Availability消除单点故障SPoFKeepalived、PacemakerHPCHigh Performance Computing并行计算聚合算力MPI 集群单点故障Single Point of Failure是可用性的最大威胁任一关键组件失效即导致整个业务中断。高可用集群通过建立冗余机制解决这一问题常见冗余模式有两种主备模式active/passive一台承载业务一台待命通过心跳感知故障并接管。利用率约 50%。双主模式active/active两台同时承载不同业务互为备份。利用率可达 100%但要求每台节点具备承载全部业务的能力。1.2 可用性度量系统可用性通常以 SLAService-Level Agreement指标衡量计算公式A MTBF / (MTBF MTTR)其中 MTBF 为平均无故障时间MTTR 为平均修复时间。提高可用性的核心手段是降低 MTTR即缩短故障恢复时间Keepalived 的自动故障切换正是这一思路的典型实现。SLA 指标年停机时间月停机时间99.9%8.76 小时43.2 分钟99.99%52.56 分钟4.32 分钟99.999%5.26 分钟25.9 秒1.3 Keepalived 功能定位Keepalived 是 VRRP 协议在 Linux 用户空间的软件实现最初设计目标是实现 LVSIPVS服务的高可用通过脚本接口可扩展至 Nginx、HAProxy 等任意服务。其核心能力包括基于 VRRP 协议完成虚拟 IPVIP地址的自动漂移为 VIP 所在节点生成并维护 IPVS 规则对 IPVS 集群中的后端服务器RS进行健康状态检测通过脚本调用接口影响集群事务支撑非 LVS 场景的高可用2. VRRP 协议2.1 协议背景VRRPVirtual Router Redundancy Protocol虚拟路由冗余协议用于解决静态网关的单点风险。网络中所有主机将默认网关指向同一台路由器时该路由器故障将导致全网断连。VRRP 将多台物理设备抽象为一台虚拟路由器对外仅暴露虚拟 IP由持有该 IP 的设备承担转发职责故障时自动转移。2.2 关键概念术语说明虚拟路由器由多台物理设备组成的逻辑路由器VRID虚拟路由器标识取值 0-255同一组节点必须一致且全网唯一VIP虚拟 IP对外提供服务由当前 master 持有VMAC虚拟 MAC格式 00-00-5e-00-01-{VRID}master主设备持有 VIP 并转发流量backup备用设备监听 master 通告等待接管priority优先级取值 1-254数值越大越优先advert_intVRRP 通告报文发送间隔默认 1 秒2.3 工作原理master 周期性向组播地址默认 224.0.0.18可自定义发送通告报文报文携带优先级等信息。backup 监听通告持续收到优先级更高的通告则维持 backup 状态超过 3 个通告周期3 × advert_int未收到 master 通告判定 master 故障backup 升级为 master新 master 绑定 VIP 并发送免费 ARP 报文通知网络中其他设备 VIP 对应的 MAC 已变更原 master 恢复后在默认抢占模式下通过更高优先级的通告重新夺回 VIP。3. 实验环境实验在 VMware 虚拟化环境中进行采用 NAT 网络模式角色IP 地址安装服务KA1Keepalived 主节点172.25.254.50keepalived、haproxyKA2Keepalived 备节点172.25.254.60keepalived、haproxyRS1后端 Web172.25.254.10httpd / nginxRS2后端 Web172.25.254.20httpd / nginxVIP虚拟 IP172.25.254.100对外服务地址部署前置要求各节点时间同步chrony 或 ntp关闭防火墙及 SELinux各节点间主机名可互通通过 /etc/hosts非必需但建议配置。4. 安装与配置结构4.1 软件安装[rootKA1 ~]# dnf install keepalived -y[rootKA1 ~]# systemctl enable --now keepalived.service[rootKA1 ~]# ps axf | grep keepalived2326? Ss0:00 /usr/sbin/keepalived-D2327? S0:00\_ /usr/sbin/keepalived-D主配置文件为 /etc/keepalived/keepalived.conf配置示例存放于 /usr/share/doc/keepalived/系统服务单元的环境配置文件为 /etc/sysconfig/keepalived。4.2 配置文件结构keepalived.conf 由三大部分组成GLOBAL CONFIGURATION global_defs { } # 全局参数邮件通知、router_id、组播地址 VRRP CONFIGURATION vrrp_script { } # 业务健康检查脚本定义 vrrp_instance { } # 虚拟路由器实例一个实例对应一组主备节点 LVS CONFIGURATION virtual_server_group { } # 虚拟服务器组 virtual_server { } # IPVS 集群定义用于 LVS 高可用4.3 全局配置段global_defs{notification_email{# 故障切换时的邮件收件人可多行timinglee_zln163.com}notification_email_from keepalivedKA1.timinglee.org smtp_server127.0.0.1 smtp_connect_timeout30router_id KA1# 节点唯一标识vrrp_skip_check_adv_addr# 跳过通告源地址检查降低性能开销#vrrp_strict # 严格模式生产不建议启用vrrp_garp_interval1# 免费 ARP 发送间隔vrrp_gna_interval1# 免费 NA 发送间隔IPv6vrrp_mcast_group4224.0.0.44# 自定义组播地址}vrrp_strict 启用后以下任一情况将导致服务无法启动未配置 VIP、配置了单播邻居、在 VRRP v2 中配置 IPv6 地址。生产环境一般不建议启用。5. 主备模式部署5.1 MASTER 节点配置KA1[rootKA1 ~]# vim /etc/keepalived/keepalived.confvrrp_instance WEB_VIP{state MASTER interface eth0 virtual_router_id51priority100advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{172.25.254.100/24 dev eth0 label eth0:0}}5.2 BACKUP 节点配置KA2[rootKA2 ~]# vim /etc/keepalived/keepalived.confvrrp_instance WEB_VIP{state BACKUP interface eth0 virtual_router_id51# 与 KA1 保持一致priority80advert_int1authentication{auth_type PASS auth_pass1111# 同组节点密钥必须一致}virtual_ipaddress{172.25.254.100/24 dev eth0 label eth0:0}}配置要点virtual_router_id 在同一虚拟路由器内必须一致在同一网络中必须唯一priority 取值 1-254主节点应高于备节点auth_pass 为预共享密钥仅前 8 位有效同组节点必须相同否则无法互认通告可能导致双主冲突VIP 可配置多个支持指定网卡、掩码和标签生产环境可配置上百个地址。5.3 语法检查与生效[rootKA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf[rootKA1 ~]# systemctl enable --now keepalived.service5.4 故障切换验证在 KA1 上抓取组播通告报文确认 master 状态正常[rootKA1 ~]# tcpdump -i eth0 -nn host 224.0.0.4411:38:46.183386 IP172.25.254.50224.0.0.44: VRRPv2, Advertisement, vrid51, prio100, authtype simple, intvl 1s, length2011:38:47.184051 IP172.25.254.50224.0.0.44: VRRPv2, Advertisement, vrid51, prio100, authtype simple, intvl 1s, length20模拟主节点故障并验证 VIP 迁移[rootKA1 ~]# systemctl stop keepalived.service[rootKA2 ~]# ifconfigeth0:0:flags4163UP,BROADCAST,RUNNING,MULTICASTinet172.25.254.100 netmask255.255.255.0# VIP 已漂移至 KA2VIP 的漂移机制VIP 并非静态绑定于网卡而是 keepalived 在成为 master 时动态添加、降级时删除的地址。切换完成后立即发送免费 ARP通知交换机与客户端更新 ARP 缓存否则数据包仍会发往旧 master 的 MAC 地址切换实际不生效。vrrp_garp_interval 参数即用于控制该报文的时间间隔。6. 抢占策略6.1 抢占模式默认优先级高的节点始终持有 VIP。master 恢复后自动发起抢占夺回 VIP。适用于无状态服务切换代价低。6.2 非抢占模式VIP 持有者只要通告正常不做 VIP 迁移避免主备频繁切换。适用于数据库主从等有状态服务。vrrp_instance WEB_VIP{state BACKUP# 非抢占模式下所有节点均配置为 BACKUPinterface eth0 virtual_router_id51nopreempt# 启用非抢占priority100advert_int1...}需注意非抢占模式下所有节点必须配置为 BACKUP若存在 MASTER 配置该节点会按初始状态直接抢占 VIP。6.3 延迟抢占master 恢复后延迟指定秒数再抢占为服务启动预留缓冲时间vrrp_instance WEB_VIP{state BACKUP interface eth0 virtual_router_id51preempt_delay10# 延迟 10 秒抢占priority100...}6.4 三种模式对比模式配置方式VIP 归属适用场景抢占一主一备始终归高优先级节点无状态 Web 服务非抢占nopreempt双 BACKUP先启动者持有不来回切换有状态服务数据库延迟抢占preempt_delay N恢复后延迟 N 秒抢占服务启动慢、需就绪缓冲的场景7. 业务服务健康检查VRRP 仅检测 keepalived 进程与网卡状态无法感知业务服务故障。当 Nginx 或 HAProxy 进程异常而 keepalived 正常时VIP 不会迁移请求仍被转发至故障节点造成大面积服务不可用。vrrp_script 机制用于解决该问题。7.1 检查脚本定义[rootKA1 ~]# vim /etc/keepalived/scripts/check_nginx.sh#!/bin/bashkillall-0nginx# 检测 nginx 进程存活[rootKA1 ~]# chmod x /etc/keepalived/scripts/check_nginx.shvrrp_script check_nginx{script/etc/keepalived/scripts/check_nginx.shinterval1# 检查周期 1 秒weight-30# 失败时优先级减 30fall2# 连续 2 次失败判定故障rise2# 连续 2 次成功判定恢复timeout2# 脚本执行超时user root}vrrp_instance WEB_VIP{state MASTER interface eth0 virtual_router_id51priority100advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{172.25.254.100/24 dev eth0 label eth0:0}track_script{check_nginx# 关联检查脚本}}7.2 权重机制检查结果优先级变化结果脚本执行成功不变化维持当前状态脚本执行失败减去 weight100 → 70低于 BACKUP 优先级自动让出 VIPweight 为 0不调整优先级仅触发通知不降级权重机制使 keepalived 的选举结果与业务服务状态绑定业务故障时本机优先级降低VIP 自动迁移至健康节点备节点侧权重逻辑相反成功加分。两侧配合形成健康者持有 VIP的闭环。7.3 与 HAProxy 组合部署HAProxy 监听 VIP 地址提供服务需先启用内核的 ip_nonlocal_bind 参数允许绑定本机当前不存在的 IP[rootKA1KA2 ~]# echo net.ipv4.ip_nonlocal_bind1 /etc/sysctl.conf[rootKA1KA2 ~]# sysctl -p[rootKA1KA2 ~]# vim /etc/haproxy/haproxy.cfglisten webserverbind172.25.254.100:80 mode http server web1172.25.254.10:80 check server web2172.25.254.20:80 check完整链路为VIPKeepalived 保证可用性→ HAProxy负载均衡→ 双 Web 节点健康检查各层独立容错。8. LVS 集群高可用Keepalived 的原生场景将 LVS 调度器Director部署为主备模式master 故障时 VIP 与 IPVS 规则一并迁移至 backup消除 Director 单点。8.1 RS 端配置LVS-DR 模式下RS 需在 lo 接口配置 VIP回包直接从 RS 返回客户端同时必须抑制 ARP 响应避免与 Director 争抢 VIP 的 ARP 请求[rootrs12 ~]# cd /etc/NetworkManager/system-connections/[rootrs12 ~]# cp eth0.nmconnection lo.nmconnection -p[rootrs12 ~]# vim lo.nmconnection[connection]idlotypeloopback interface-namelo[ipv4]methodmanualaddress1127.0.0.1/8address2172.25.254.100/32[rootrs12 ~]# nmcli connection reload nmcli connection up lo[rootrs12 ~]# vim /etc/sysctl.confnet.ipv4.conf.all.arp_ignore1net.ipv4.conf.all.arp_announce2net.ipv4.conf.lo.arp_ignore1net.ipv4.conf.lo.arp_announce2[rootrs12 ~]# sysctl -parp_ignore1 表示仅应答目标 IP 为本机接口地址的 ARP 请求arp_announce2 表示通告时仅使用接口自身 IP 作为源地址。8.2 Director 端配置在主备节点上均配置 virtual_server 段keepalived 通过 IPVS wrapper 自动生成 ipvs 规则[rootKA1 ~]# vim /etc/keepalived/keepalived.confvirtual_server172.25.254.10080{delay_loop6lb_algo rr# 轮询算法lb_kind DR# DR 模式protocol TCP real_server172.25.254.1080{weight1HTTP_GET{url{path / status_code200}connect_timeout1retry3delay_before_retry1}}real_server172.25.254.2080{weight1TCP_CHECK{connect_timeout5retry3delay_before_retry3connect_port80}}}8.3 健康检查类型检查方式检查内容适用场景TCP_CHECKTCP 端口连通性一般后端服务HTTP_GETHTTP 状态码可指定 URLWeb 服务可感知业务层故障SSL_GETHTTPS 状态码需 TLS 验证的服务MISC_CHECK自定义脚本复杂业务逻辑Web 服务建议使用 HTTP_GET可检测进程存活但返回 500 类故障。测试轮询效果时应使用第三台客户端访问 VIP避免在 Director 本机测试本机访问走回环无法反映真实调度。9. 双主模式主备模式资源利用率约 50%。双主模式通过两个 vrrp_instance、两个不同 VRID使两台节点分别成为不同 VIP 的 master业务拆分互为主备。KA1 配置WEB_VIP 为 MASTER、DB_VIP 为 BACKUPvrrp_instance WEB_VIP{state MASTER interface eth0 virtual_router_id51priority100advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{172.25.254.100/24 dev eth0 label eth0:0}}vrrp_instance DB_VIP{state BACKUP interface eth0 virtual_router_id52priority80advert_int1authentication{auth_type PASS auth_pass1111}virtual_ipaddress{172.25.254.200/24 dev eth0 label eth0:1}}KA2 配置WEB_VIP 为 BACKUP、DB_VIP 为 MASTERpriority 互换VRID 52 对应的实例优先级为 100并配置 preempt_delay 10 避免服务未就绪即抢回 VIP。实现要点两个实例的 VRID 必须不同否则相互冲突两个 VIP 对应不同业务业务不重叠即不会相互抢占每台节点须具备承载全部业务的能力以应对单节点故障配合 preempt_delay 为服务启动预留缓冲。