3、双机热备架构设计:主备切换机制、心跳检测原理、共享存储方案、仲裁机制详解

双机热备,说白了就是给风机监控系统买了一份「保险」。

我在风场调试时见过太多单机故障导致全场停摆的案例。有一次,凌晨三点,主控服务器电源模块烧了,备机愣是没切过去——因为心跳检测配置错了。从那以后,我对双机热备的每个细节都格外较真。

3.1 主备切换机制:谁说了算?

主备切换,核心就三个字:快、准、稳

我个人习惯把切换分为两类:

  • 自动切换:心跳丢了,备机自动升主。
  • 手动切换:运维人员主动触发,比如计划性检修。

你想想看,如果风机正在满发,主控突然挂了,备机必须在几秒内接管。否则,变桨系统收不回桨叶,轻则停机,重则倒塔。

切换触发条件(我总结的)

  • 心跳超时(连续3次未收到心跳包)
  • 关键进程崩溃(如数据采集进程)
  • 硬件故障(磁盘、网卡、电源)
  • 人工指令(运维平台下发)

这里有个坑:脑裂。两台机器都认为自己是主,同时写数据,数据就乱了。怎么防?往下看仲裁机制。

3.2 心跳检测原理:别让假死骗了你

心跳检测,本质就是「你还在吗?」的问答游戏。

但问题来了:如果网络闪断,备机以为主机挂了,其实主机活得好好的。这就是误判

我在项目中遇到过这种情况:风场网络交换机老化,偶尔丢包。结果备机频繁切主,搞得现场运维天天半夜被电话吵醒。

怎么解决?我建议用冗余心跳链路

  • 主链路:千兆以太网
  • 备用链路:串口线或独立的第二网口

心跳包的内容也很讲究。别只发一个「ping」,要带上:

  • 本机角色(主/备)
  • CPU负载
  • 内存使用率
  • 关键进程状态

我的经验:心跳间隔设为1秒,超时阈值设为3秒。太短容易误判,太长切换太慢。

3.3 共享存储方案:数据怎么不丢?

双机热备最头疼的就是数据一致性。主备切换后,新主机必须读到和旧主机一模一样的数据。

常用的方案有三种:

方案 原理 我踩过的坑
共享磁盘阵列(SAN) 两台服务器连同一块磁盘 光纤线被老鼠咬断,直接脑裂
分布式存储(如Ceph) 数据多副本,自动同步 网络延迟高时,写入性能下降明显
数据库主从复制 MySQL/PostgreSQL异步同步 主库挂了,从库可能丢最后几条记录

我个人最推荐共享磁盘阵列 + 集群文件系统(如OCFS2)。原因很简单:性能稳定,切换时不需要数据同步。

注意:共享存储必须支持SCSI-3持久预留(PR)。否则两台机器同时写同一块盘,数据就毁了。

3.4 仲裁机制详解:谁来当裁判?

仲裁,就是解决「谁说了算」的问题。

两台机器都认为自己是主,怎么办?需要第三方来投票。

常见的仲裁方式:

  • 磁盘仲裁:在共享磁盘上划一个小分区,谁先抢到锁,谁就是主。
  • 网络仲裁:通过第三方仲裁服务器(Quorum Server)投票。
  • IP漂移仲裁:谁抢到了虚拟IP,谁就是主。

我曾经在海上风电场遇到过极端情况:两台风电机组之间的光纤断了,但各自还能连到岸上的中控室。这时候,中控室就是仲裁者。它发现两边都活着,但互相联系不上,就强制让其中一台降为备机。

仲裁规则(我常用的)

  1. 心跳丢失后,备机发起仲裁请求
  2. 仲裁者检查主机是否真的存活(通过独立通道)
  3. 如果主机确实挂了,仲裁者授权备机升主
  4. 如果主机还活着,备机保持备机状态,并报警

嗯,这里要注意:仲裁者本身不能是单点。我建议仲裁服务也做双机热备,或者用分布式一致性算法(如Raft)。

3.5 架构总览:一张图说清楚

下面这张图,是我画的双机热备核心逻辑。你看一眼就明白了。

主机(Active) 运行中 备机(Standby) 待命 心跳检测(1s间隔) 共享存储(SAN/分布式) 仲裁者(Quorum) 虚拟IP:192.168.1.100 主机 备机 共享存储 仲裁者 虚拟IP

这张图里,主机和备机通过心跳线互相监视。共享存储是数据的「家」,谁当主谁读写。仲裁者负责在争议时拍板。虚拟IP是给上层应用用的,切换时IP自动漂移。

避坑指南:我曾经因为虚拟IP的ARP缓存没及时刷新,导致切换后客户端还在连旧IP。解决办法是:切换时主动发送免费ARP(Gratuitous ARP)。

3.6 总结一下

双机热备不是买两台机器装上就完事了。心跳怎么配、存储怎么共享、仲裁谁来当,每个环节都有门道。

我个人建议,在风场部署前,一定要做故障注入测试:拔网线、断电、杀进程,看看备机到底能不能扛住。我在好几个项目里,都是靠这种「暴力测试」才把隐藏问题揪出来的。

记住一句话:双机热备的价值,不在于它平时多稳定,而在于故障时它能不能兜住底。


专注资料整理