尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

解决服务单点故障!Nginx+Keepalived 双机热备,故障秒切换生产方案

解决服务单点故障!Nginx+Keepalived 双机热备,故障秒切换生产方案 前言很多 Linux 小白学习 Keepalived 时全程混乱普遍存在这些痛点看不懂 VRRP 底层协议搞不清 VIP、Master、Backup、VRID、优先级核心概念实验逻辑断裂不知道先配 IP 还是先装软件敲完上一行完全不知道下一条命令配置文件几十行参数分不清含义state/priority/nopreempt/auth 完全不懂作用搭建完集群出现脑裂双主抢 VIP网站同时访问两台服务器数据错乱找不到原因主节点宕机 VIP 不会自动漂移切换失败只会盲目重启服务分不清抢占模式、不抢占模式适用场景线上业务频繁抖动所有命令只会复制-y、–now、cp {,.ori} 等参数不懂含义输出结果不会解读。统一实验环境 CentOS7主机名IP 地址集群角色核心任务web1.jhl.cloud10.1.8.11Keepalived 主节点抢占模式优先持有 VIPNginx 业务主服务web2.jhl.cloud10.1.8.12Keepalived 备节点主故障自动接管 VIPclient1.jhl.cloud10.1.8.21测试客户端访问虚拟 IP 验证业务切换虚拟 VIP10.1.8.100统一业务访问入口主节点持有故障自动漂移备机第一部分 KeepalivedVRRP 底层原理1.1 Keepalived 是什么线上运维核心作用⚠️Keepalived 是 C 语言编写的 Linux 高可用软件底层依托VRRP 虚拟路由冗余协议核心解决服务单点故障问题。企业生产真实价值消除单点故障Nginx、MySQL、Redis等单服务器服务宕机VIP自动漂移至备机业务无感知切换统一访问入口客户端只需要访问一个固定VIP无需区分后端多台服务器多层故障检测支持3/4/7层健康检测网卡、端口、程序故障均可触发自动切换轻量化部署配置简单无需额外复杂集群软件中小企业HA首选配套nopreempt不抢占模式避免主节点恢复后频繁切流量保障业务稳定。1.2 VRRP 协议核心解决的痛点传统单网关 / 单 Web 服务器一旦宕机所有客户端完全断网 / 网站打不开VRRP 将把多台物理服务器虚拟成一台逻辑上的网关 / 服务器共用同一个虚拟 IPVIP主设备故障时备份设备自动接管 IP业务不中断。名词全称通俗解释实验示例VRRP 组虚拟路由组同一套高可用集群VRID 必须完全一致VRID 51VRID虚拟路由 ID区分不同集群1-255同组所有机器相同51VIP虚拟 IP对外统一访问地址仅 Master 持有10.1.8.100/24Master主节点优先级更高正常持有 VIP每秒发心跳包web1 priority110Backup备节点监听心跳主失联自动升级为主web2 priority100Priority优先级数值 0-255越大越优先抢占 VIP110100Advert_int心跳间隔Master 发送 VRRP 心跳包周期默认 1 秒advert_int 1组播地址VRRP 通信地址224.0.0.18节点间心跳通信固定地址UDP 112 端口1.3 VRRP 完整工作流程集群初始化两台机器全部进入 Backup 状态各自等待 MASTER_DOWN 定时器优先级高的 web1 更快完成等待率先竞选 Masterweb1 成为 Master绑定 VIP 10.1.8.100每秒向 224.0.0.18 发送心跳通告web2 持续监听心跳包收到则维持 Backupweb1 宕机 / 关闭 Keepalivedweb2 收不到心跳定时器超时自动升级 Master绑定 VIPweb1 恢复服务抢占模式下立刻夺回 VIP不抢占模式则保持 web2 为主。1.4 脑裂Split-Brain致命故障解析脑裂定义主备节点心跳通信中断但两台服务器本身正常两台机器同时竞选Master、同时绑定VIP客户端流量分裂读写业务出现数据错乱、页面交替跳转。 产生核心原因服务器之间UDP 112端口防火墙拦截心跳包无法互通网卡故障、交换机链路断开组播报文无法传输集群VRID、认证密码配置不一致节点无法识别同组设备服务器CPU/内存耗尽无法发送心跳包。脑裂线上危害数据库双写冲突、网站随机跳转业务完全不可用5套生产脑裂预防方案表格方案实操配置核心作用VRRP 密码认证所有节点 auth_pass 配置完全一致拒绝非法节点加入集群防止异常节点抢占 VIP放行 VRRP 协议firewall-cmd --add-protocolvrrp --permanent firewall-cmd --reload打通 112 端口 VRRP 心跳通信确保节点间心跳报文正常传输多网卡心跳检测track_interface 配置多块物理网卡单网线 / 网卡故障时自动通过备用网卡传输心跳避免心跳中断nopreempt 不抢占模式高优先级节点配置中添加 nopreempt 参数主节点故障恢复后不强行抢占 VIP避免业务流量频繁切换抖动故障隔离脚本配置 notify_master 监控脚本检测到脑裂 / 双主异常时自动执行关机 / 停服务脚本实现故障隔离1.5 Keepalived 三层检测机制三层网络层ICMPping 检测对端 IP不通判定故障四层传输层TCP 端口检测 80/22 等端口Nginx 宕机自动切换七层应用层自定义脚本执行业务脚本程序异常触发 VIP 漂移。第二部分 完整高可用集群实验业务诉求希望有一个永不变化的统一访问入口一台 web 坏了另一台自动顶上全程不需要人工操作用户感知不到故障。实现这个诉求的技术方案就是 Keepalived VRRP 虚拟 IPVIP高可用架构也就是本次实验要验证的能力。实验最终想要验证的目标对外提供一个固定不变的虚拟 IP VIP10.1.8.100用户永远只访问这个地址正常情况下 VIP 在主节点 web1客户端访问 VIP流量落到 web1 处理网页请求当 web1 故障关机、断网、web 服务停止VIP自动漂移到备机 web2客户端继续访问 10.1.8.100流量自动切换到 web2用户不用修改任何地址无感知切换web1 故障修复上线后可以配置两种策略抢占模式web1 恢复后VIP 重新抢回来非抢占模式VIP 继续留在 web2避免二次波动。实验价值这个实验就是模拟线上服务器故障场景验证 VRRP 协议实现虚拟 IP 自动故障转移搭建一套具备自动容灾能力的 Web 服务集群解决单点服务器故障导致业务中断的问题理解生产环境高可用服务最基础、最经典的主备架构原理。结合拓扑完整复盘整条访问链路正常状态client1 (10.1.8.21) →交换机 →访问 VIP (10.1.8.100) →web1 (持有 VIP) →返回网页故障状态web1 宕机 →VIP 自动漂移 web2client1 (10.1.8.21) →交换机 →访问 VIP (10.1.8.100) →web2 (持有 VIP) →返回网页用户全程只访问 10.1.8.100后端服务器切换完全透明。实验思路三台机器分别修改主机名、配置静态固定 IPweb1、web2 两台服务器安装 Nginx写入区分页面web1、web2 安装 Keepalived备份原始配置文件编写主节点 web1 抢占模式配置priority110、state MASTER编写备节点 web2 配置priority100、state BACKUP两台服务器防火墙放行 VRRP 协议启动 Keepalived验证 VIP 默认在 web1客户端 curl VIP 访问页面返回 web1 内容停止 web1 Keepalived验证 VIP 自动漂移 web2web1 重启服务抢占模式下自动夺回 VIP进阶不抢占模式实验修改 web1 配置增加 nopreempt主恢复不切流量配置 Keepalived 独立日志方便故障排查脑裂模拟与修复实操。实验1 三台机器初始化主机名 静态 IP实验目的固定静态 IP 防止 DH 地址变动导致心跳通信失败区分三台机器角色方便后续实验操作。线上运维作用高可用集群必须静态 IP动态 IP 会导致 VRRP 心跳永久中断直接触发脑裂故障。一、web1.jhl.cloud 全套命令每行逐项参数解释保留完整提示符# hostnamectl set-hostname永久修改系统主机名重启永久生效# set-hostname 后跟自定义完整主机域名[rootlocalhost ~]# hostnamectl set-hostname web1.jhl.cloud# nmcli connection modify修改网卡参数ens33为网卡设备名# ipv4.method manual关闭DH启用静态IP手动模式# ipv4.addresses 10.1.8.11/24本机IP/24代表24位子网掩码# ipv4.gateway 10.1.8.2内网网关地址# ipv4.dns 10.1.8.2内网DNS解析服务器# autoconnect yes开机自动激活网卡[rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes# nmcli connection up重载网卡配置无需重启立即生效# up 参数启用网卡连接应用刚修改的静态IP配置[rootlocalhost ~]# nmcli connection up ens33二、web2.jhl.cloud 全套初始化命令[rootlocalhost ~]# hostnamectl set-hostname web2.jhl.cloud[rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes[rootlocalhost ~]# nmcli connection up ens33三、client1.jhl.cloud 全套初始化命令[rootlocalhost ~]# hostnamectl set-hostname client1.jhl.cloud[rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes[rootlocalhost ~]# nmcli connection up ens33实验 2 两台 Web 服务器部署 Nginx 业务实验目的搭建后端 Web 服务用于验证 VIP 切换后页面自动变更直观观察故障漂移效果。运维作用模拟企业网站业务完整复现线上 Web 高可用架构。web1、web2 两台服务器统一执行全套命令# wget下载阿里EPEL软件源# -O 参数指定下载文件输出路径[rootweb1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# yum install -yyum在线安装软件# -y 参数自动确认所有交互提问无需手动输入y# nginxWeb网站服务程序[rootweb1 ~]# yum install -y nginx# echo 输出文本重定向写入网站首页# $(hostname) 自动获取本机主机名区分两台服务器页面[rootweb1 ~]# echo Welcome to $(hostname) /usr/share/nginx/html/index.html# systemctl enable --now设置开机自启并立刻启动服务# enable开机自动运行--now当前会话立即启动nginx服务名[rootweb1 ~]# systemctl enable nginx.service --now客户端测试业务连通性# curlHTTP访问工具直接输出页面内容[rootclient1 ~]# curl 10.1.8.11Welcome to web1.jhl.cloud[rootclient1 ~]# curl 10.1.8.12Welcome to web2.jhl.cloud实验 3 安装 Keepalived 备份原始配置实验目的安装高可用核心程序备份默认配置防止改错无法恢复。web1、web2 两台机器全部执行# yum安装keepalived高可用软件包[rootweb1 ~]# yum install -y keepalived# cp {,.ori} 文件备份语法# cp复制文件/etc/keepalived/keepalived.conf 原配置# {,.ori} 等价于复制为 keepalived.conf.ori 备份文件[rootweb1 ~]# cp /etc/keepalived/keepalived.conf{,.ori}实验 4 抢占模式 Keepalived 完整配置web1 主节点实验思路global_defs 全局段设置 router_id集群内唯一标识vrrp_instance 定义 VRRP 集群state 初始 MASTERpriority 110 高于备机故障恢复自动抢占 VIP开启密码认证防止脑裂定义虚拟 VIP 10.1.8.100/24。# vim文本编辑器打开Keepalived主配置文件[rootweb1 ~]# vim /etc/keepalived/keepalived.conf完整配置逐行逐字段详细注释!Configuration Fileforkeepalived# 全局配置段 global_defsglobal_defs{router_id web1.jiang.cloud# router_id本机集群标识集群所有机器不能重复}# VRRP集群实例自定义名称nginxvrrp_instance nginx{state MASTER# 机器启动初始状态仅初始化生效最终由priority竞选interface ens33# VRRP心跳、VIP绑定的物理网卡virtual_router_id51# VRID集群编号同组所有机器必须完全一致(1-255)priority110# 优先级数值越大优先成为Master高于备机100advert_int1# Master心跳发送间隔单位秒默认1秒# VRRP身份认证配置防止脑裂、非法节点接入authentication{auth_type PASS# 认证类型PASS明文密码AH加密认证auth_pass jhl123# 集群统一密码所有节点必须完全相同最多8位有效字符}# 定义集群虚拟VIP地址virtual_ipaddress{10.1.8.100/24}}[rootweb1 ~]# ip -br alo UNKNOWN127.0.0.1/8 ::1/128 ens33 UP10.1.8.11/2410.1.8.100/24重点结论VIP 出现在 web1机器上代表当前 web2 已经成为 VRRP 主节点MASTER接管了虚拟 IP。web2 备节点抢占模式配置[rootweb2 ~]# vim /etc/keepalived/keepalived.conf!Configuration Fileforkeepalived global_defs{router_id web2.jiang.cloud}vrrp_instance nginx{state BACKUP# 备机初始状态interface ens33 virtual_router_id51priority100# 优先级低于web1正常不会抢占advert_int1authentication{auth_type PASS auth_pass jhl123}virtual_ipaddress{10.1.8.100/24}}[rootweb2 ~]# ip -br alo UNKNOWN127.0.0.1/8 ::1/128 ens33 UP10.1.8.12/24实验 5 放行 VRRP 防火墙规则防脑裂核心步骤⚠️实验目的放开 UDP112 端口 VRRP 组播心跳两台机器可正常收发心跳报文避免脑裂故障。web1、web2 两台服务器执行# firewall-cmd --add-protocolvrrp临时放行VRRP协议# --permanent 参数永久写入防火墙规则重启不失效[rootweb1 ~]# firewall-cmd --add-protocolvrrp --permanent# --reload重载防火墙配置永久规则立即生效[rootweb1 ~]# firewall-cmd --reload实验 6 启动服务验证 VIP 抢占模式切换步骤 1 两台机器开机自启并启动 Keepalived# systemctl enable --now开机自启立即启动服务[rootweb1 ~]# systemctl enable keepalived.service --now[rootweb2 ~]# systemctl enable keepalived.service --now步骤 2 查看网卡 VIP 绑定状态# ip -br a show简洁查看网卡IP地址# -br 参数brief简洁输出模式过滤冗余信息[rootweb1 ~]# ip -br a show ens33ens33 UP10.1.8.11/2410.1.8.100/24 fe80::xxxx/64# 现象解读web1持有虚拟VIP为主节点[rootweb2 ~]# ip -br a show ens33ens33 UP10.1.8.12/24 fe80::xxxx/64# 现象解读web2无VIP为备份节点步骤 3 客户端访问虚拟 IP 验证业务[rootclient1 ~]# curl 10.1.8.100Welcome to web1.jhl.cloud# 输出web1页面当前主节点正常提供服务步骤 4 模拟主节点故障停止 Keepalived# stop立即停止Keepalived服务断开心跳发送[rootweb1 ~]# systemctl stop keepalived.service# 再次查看web1网卡VIP消失[rootweb1 ~]# ip -br a show ens33ens33 UP10.1.8.11/24 fe80::xxxx/64# web2自动升级Master绑定VIP[rootweb2 ~]# ip -br a show ens33ens33 UP10.1.8.12/2410.1.8.100/24# 客户端再次访问VIP自动切换web2页面[rootclient1 ~]# curl 10.1.8.100Welcome to web2.jhl.cloud步骤 5 恢复 web1 服务抢占模式自动夺回 VIP# start 启动Keepalived服务[rootweb1 ~]# systemctl start keepalived.service# 查看web1重新持有VIP[rootweb1 ~]# ip -br a show ens33ens33 UP10.1.8.11/2410.1.8.100/24# 客户端页面切回web1[rootclient1 ~]# curl 10.1.8.100Welcome to web1.jhl.cloud⚠️抢占模式缺点业务高峰期主节点维护重启流量瞬间全部切回主会造成业务抖动生产核心业务推荐不抢占模式实验 7 进阶不抢占 nopreempt 模式生产推荐实验目的高优先级主节点恢复后不强行抢占 VIP流量停留在当前备机避免业务频繁切换抖动。完整修改配置仅 web1 操作[rootweb1 ~]# vim /etc/keepalived/keepalived.conf修改后核心片段新增 nopreempt)vrrp_instance nginx{state BACKUP# 所有节点统一写BACKUP不再写MASTERnopreempt# 不抢占开关高优先级机器恢复不抢VIPinterface ens33 virtual_router_id51priority110advert_int1authentication{auth_type PASS auth_pass jhl123}virtual_ipaddress{10.1.8.100/24}}重载配置生效[rootweb1 ~]# systemctl restart keepalived.service验证不抢占效果关闭 web1web2 接管 VIP启动 web1web1 优先级 110 更高但不会抢夺 VIP客户端持续访问页面始终是 web2只有 web2 停止服务后web1 才会自动接管 VIP。# 关闭web1[rootweb1 ~]# systemctl stop keepalived.service# web2持有VIPcurl输出web2页面[rootclient1 ~]# curl 10.1.8.100Welcome to web2.jhl.cloud# 启动web1不抢占[rootweb1 ~]# systemctl start keepalived.service# 客户端页面不变[rootclient1 ~]# curl 10.1.8.100Welcome to web2.jhl.cloud# 关闭web2web1自动接管[rootweb2 ~]# systemctl stop keepalived.service[rootclient1 ~]# curl 10.1.8.100Welcome to web1.jhl.cloud实验 8 Keepalived 独立日志分离排错必备实验目的默认日志混杂在 /var/log/messages单独拆分日志方便快速定位 VIP 漂移、脑裂、心跳报错。1.让 keepalived 把日志发送到 local0 日志设施2.配置 rsyslog 抓取 local0 的所有日志单独保存到 /var/log/keepalived.log实现日志分离3.同时可选开启 debug 模式打印 VRRP 详细交互过程方便排错。步骤 1 修改 keepalived 启动参数# vim编辑服务启动配置文件[rootweb1 ~]# vim /etc/sysconfig/keepalived修改内容# 这个文件是 systemd 启动 keepalived 服务时读取的启动命令行参数。KEEPALIVED_OPTIONS-D -S 0# 参数逐项解释# -D后台守护进程运行默认必选# -S 0指定syslog日志输出通道为local0。keepalived 输出日志时统一打上 local0.* 标签发给系统 rsyslog 服务。# 补充-d 开启debug调试日志排错临时使用生产不要长期开启简单类比keepalived 生产日志并盖上一个邮戳 local0rsyslog 根据邮戳决定这份日志投递到哪个文件。步骤 2 配置 rsyslog 分流日志rsyslog 格式标准格式设施.优先级 存储目标local0设施对应上面-S 0Linux 预留出来给自定义程序使用local0~local7 共 8 组*代表所有优先级info、notice、warning、error、debug 全部收下/var/log/keepalived.log日志写入的独立文件rsyslog 是 CentOS/RHEL 系统里默认的系统日志服务。服务器上所有程序systemd、ssh、nginx、keepalived 等产生的日志理论上都交给 rsyslog 统一接收、筛选、保存。默认主配置文件/etc/rsyslog.conf# /etc/rsyslog.d/keepalived.conf,专门给 keepalived 自定义的一条日志过滤规则文件。[rootweb1 ~]# vim /etc/rsyslog.d/keepalived.conf# local0通道日志全部输出到独立文件local0.* /var/log/keepalived.log步骤 3 重启日志服务 Keepalived# restart 重启rsyslog日志服务加载新分流规则,keepalived 日志策略[rootweb1 ~]# systemctl restart rsyslog# 让 keepalived 读取 /etc/sysconfig/keepalived 里面新的启动参数 -D -d -S 0。不重启 keepalived新参数不会生效依然使用旧的日志输出方式[rootweb1 ~]# systemctl restart keepalived.service# 实时监控高可用切换日志# tail -f实时追踪日志输出[rootweb1 ~]# tail -f /var/log/keepalived.log第三部分 Keepalived 高频故障排查指南1. 脑裂双主同时持有 VIP故障根因完整解决方案防火墙未放行 VRRP 协议执行 firewall-cmd --add-protocolvrrp --permanent reload两台机器 VRID / 认证密码不一致统一 virtual_router_id、auth_pass jhl123跨网段组播 224.0.0.18 不通同网段部署或配置单播 VRRP2 主节点宕机 VIP 不漂移备机防火墙拦截 VRRP 心跳advert_int 心跳间隔过大MASTER_DOWN 超时久网卡名称 interface 配置错误。3 主恢复频繁抢占业务抖动解决方案主节点配置 nopreempt 不抢占模式。核心排错命令全注释# 实时查看Keepalived切换日志tail-f/var/log/keepalived.log# 查看网卡VIP绑定状态ip-bra# 重启服务重载配置systemctl restart keepalived# 查看服务运行状态systemctl status keepalived文末总结Keepalived 基于 VRRP 协议实现 Linux 服务高可用虚拟 VIP 是统一业务访问入口Master 由 priority 优先级竞选抢占模式主恢复自动切流量生产优先 nopreempt 不抢占集群所有节点 VRID、VRRP 密码必须完全一致防火墙放行 VRRP 协议防止脑裂故障切换逻辑Master 停止发送心跳→Backup 超时升级为主自动绑定 VIP线上 Web / 数据库高可用双机热备是最低成本消除单点故障方案。互动提问 你们线上 Keepalived 用抢占还是不抢占模式搭建集群踩过脑裂故障吗评论区交流排坑经验
返回列表