前置机单机跑了两年,今年监管端检查时被点名:核心报送链路没有冗余,单点故障风险。整改任务落到头上:双机热备改造。从方案到实施到演练,全程走完把实操过程记录下来,含配置清单和演练脚本。
一、方案选型:热备还是冷备
先过方案选型这关。冷备(备机开机待命,故障时人工切换):省钱但切换慢(分钟到小时级),数据可能丢失窗口。热备(备机实时同步,自动或一键切换):投入高但切换快(秒到分钟级)。
监管链路的容忍度分析:报送窗口期(月度头十天)链路中断超过2小时就算事件。冷备的切换速度勉强够,但夜间故障没人响应的场景直接超时——结论:热备,RTO(恢复时间目标)定在5分钟内,RPO(数据丢失容忍)接近零。
热备的两种实现:共享存储(两机器挂同一存储,切换时备机接管存储)和双机数据同步(备机实时复制主机数据)。我们的条件(没有共享存储的硬件经费)选了后者:rsync加数据库主从复制。
二、网络和主机规划
两台前置机:主机P1(当前生产)、备机P2(新购虚机,配置对等)。
**IP规划。**P1和P2各一个物理IP,另加一个虚拟IP(VIP)对外服务——客户端和监管端只认VIP,切换时VIP漂移到备机,对外无感。VIP的实现用keepalived:两机跑keepalived,主机优先级高持有VIP,主机故障时备机接管。
**心跳线。**P1和P2之间配心跳检测(keepalived的vrrp实例),专线直连(不依赖业务网络的独立网口)——心跳和业务走同一线路时,网络抖动会误判主机死亡引发误切换(脑裂的前兆)。
**防火墙。**P2到监管端的8100出站提前放行(别等切换时才发现备机端口不通);P1到P2的同步端口和心跳端口互相放行。
三、数据同步配置
前置机上要同步的东西四类,各有各的同步方案。
**配置文件和应用。**配置文件(报送程序配置、证书路径)用rsync定时同步加变更触发同步(inotify监控配置目录,一有变更立即推送到P2)。应用版本升级时P1装完,P2自动同步——版本一致性有了保障。
**证书和密钥。**SM2证书文件同步过去(rsync的 include规则覆盖证书目录)。密钥库密码文件人工同步(密码不上同步通道,安全考虑)——这是唯一需要手工保持一致的东西,切换检查清单里有专门一项。
**数据库。**报送日志和批次记录在本地数据库,配主从复制:P1为主库,P2为从库实时复制。切换后P2升主继续写入,P1修复后反向复制回来——双向都配好复制通道,切换回来不用重建。
**报文归档。**已发送报文的归档目录,rsync实时同步——切换后要在备机上查历史报文,归档不全排查就断线。
同步的验证:每周比对一次P1和P2的同步状态(rsync校验和、数据库复制延迟),复制延迟超过10秒告警。同步不是配完就完事的,持续校验才能保证备机随时可用。
四、切换机制:自动加手动双通道
**自动切换(keepalived)。**主机心跳失败(vrrp优先级协商),VIP漂移到备机,备机上的报送服务启动监听——全程秒级,无需人工。自动切换的触发条件收敛:心跳线断、主机系统宕机、报送服务进程死亡(自定义检测脚本),三类才触发——网络抖动不轻易触发(心跳超时阈值调到5秒,避免误判)。
**手动切换(运维触发)。**计划内维护(主机打补丁重启)用手动切换:运维在管理界面点切换,VIP受控漂移,业务无感。手动切换的意义:计划内维护不再需要停机窗口。
切换动作的完整序列写在切换脚本里:确认备机同步就绪→VIP漂移→备机服务启动→切换后验证(端口探活、测试报文回环)→通知值班群。脚本化保证每次切换的动作序列一致——人操作的步骤越多,出错概率越大。
五、演练:把切换从"理论上可行"变成"确认可用"
不演练的热备是纸面冗余。演练季度一次,脚本固定三幕。
**第一幕:模拟主机故障(自动切换验证)。**演练机上直接kill主机的心跳进程,观察:VIP是否漂移(预期10秒内)、备机服务是否接管(预期30秒内)、报送是否恢复(发测试报文验证,预期1分钟内)。三次指标全达,自动切换有效。
**第二幕:计划内切换(手动流程验证)。**走手动切换全流程,验证切换序列的每一步和回退能力——演练时故意在"备机服务启动"步骤注入故障,验证运维能否按预案处理并回退到主机。这幕练的是人的熟练度。
**第三幕:切换回来。**主机修复后切回,验证反向数据同步生效(切换期间备机写入的数据回到主机)。这幕最容易敷衍——很多人演练切过去就完了,真故障修复后切不回来,备机变成新的单点。
演练结果记录归档:每次演练的报告(切换时长、异常项、整改动作)留档,监管检查时这是冗余能力有效性的证明。
六、实施后的运行数据
改造完成三个月:自动切换触发过两次(一次主机内存故障、一次服务进程崩溃),两次均在1分钟内恢复,报送窗口零受影响;手动切换支撑了两次计划内维护(以前要等周末停机窗口的补丁更新,现在工作时间切过去就干)。演练两轮,第二论的切换时长比第一轮快一倍——熟练度是练出来的。
运维成本的增加:同步校验的每周巡检(10分钟)加季度演练(半天)。用停机风险换来的这点投入,账很好算。切换脚本和巡检清单管在搭贝AI低代码平台搭的运维管理应用里,演练记录自动归档,下次监管检查直接调。
七、双机状态的巡检脚本
热备建好了不能当摆设,巡检脚本每天跑:
#!/bin/bash
# 双机热备每日巡检
VIP="10.0.0.100"; P1="10.0.0.101"; P2="10.0.0.102"
echo "== VIP归属 ="
ping -c1 -W1 $VIP &>/dev/null && ssh $P1 "ip addr | grep -q $VIP" && echo "OK VIP在P1(主)" || ssh $P2 "ip addr | grep -q $VIP" && echo "!! VIP漂到P2" || echo "!! VIP无响应"
echo "== 复制延迟 ="
lag=$(ssh $P1 "mysql -e 'SHOW SLAVE STATUS\G'" | grep Seconds_Behind_Master | awk '{print $2}')
[ "$lag" -lt 10 ] && echo "OK 复制延迟${lag}s" || echo "!! 延迟${lag}s超阈值"
echo "== 心跳 ="
ssh $P1 "systemctl is-active keepalived" &>/dev/null && echo "OK P1心跳" || echo "!! P1心跳异常"
巡检输出异常时自动切告警通道(邮件加即时消息)。双机热备最大的风险是"备机坏了没人知道"——真故障来临时切换失败才发现备机早停了。每日巡检加每月演练,冗余才是活的冗余。
八、演练记录的规范格式
每月切换演练要有记录才有效:演练日期、触发方式(自动触发还是手动发起)、切换耗时(从触发到备机接管完成)、数据校验结果(切换前后数据一致性比对)、应用侧感知(业务是否中断、中断时长)、问题记录(当次发现的异常和处置)。六项格式固定,月度对比看趋势——切换耗时从第一次的4分半稳定到1分钟内,就是演练的价值量化。记录累积起来还有个用途:监管检查或内审问"冗余有效性证据"时,十二个月的演练记录就是最硬的答案。
常见问题
Q:脑裂怎么防?
脑裂(两机都认为自己是主机、都持有VIP)的防线三条:心跳专线独立(网络抖动不误判)、仲裁机制(keepalived的优先级加抢占模式配置,恢复后低优先级机主动让位)、切换后告警(无论自动手动,切换必告警——值班收到告警就要确认状态,不能让"静默脑裂"过夜)。
Q:切换时正在发送的报文会怎样?
设计上允许少量重发:报文发送状态在数据库里(主从同步到备机),备机接管后从"发送中"状态的报文开始重试。监管端的防重机制(批次号唯一)保证重发的报文不会重复入库——最多是发送延迟几秒。切换瞬间丢报文是误解,丢的只是几秒钟的发送窗口,报文本体在队列里没丢。
Q:两台机器配置必须完全一样吗?
CPU内存对等最好(性能一致性),但不是硬约束——备机配置略低也能顶(切换后的处理能力够报送量就行)。硬性一致的是软件环境:操作系统版本、中间件、SDK、应用版本,这些不一致切换后行为不可预测。我们用配置同步机制保证软件一致,硬件允许代差。
Q:没有条件做双机,单机怎么提高可用性?
退而求其次的三招:故障自愈(服务配成系统服务,崩溃自动重启拉起)、监控前置(端口探活加进程监控,故障5分钟内发现)、应急手册(单机故障的恢复步骤文档化,含重启、恢复、补报的完整流程,值班按手册操作)。可用性的本质是故障恢复速度,双机只是恢复最快的方案不是唯一方案。