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,谁就是主。
我曾经在海上风电场遇到过极端情况:两台风电机组之间的光纤断了,但各自还能连到岸上的中控室。这时候,中控室就是仲裁者。它发现两边都活着,但互相联系不上,就强制让其中一台降为备机。
仲裁规则(我常用的)
- 心跳丢失后,备机发起仲裁请求
- 仲裁者检查主机是否真的存活(通过独立通道)
- 如果主机确实挂了,仲裁者授权备机升主
- 如果主机还活着,备机保持备机状态,并报警
嗯,这里要注意:仲裁者本身不能是单点。我建议仲裁服务也做双机热备,或者用分布式一致性算法(如Raft)。
3.5 架构总览:一张图说清楚
下面这张图,是我画的双机热备核心逻辑。你看一眼就明白了。
这张图里,主机和备机通过心跳线互相监视。共享存储是数据的「家」,谁当主谁读写。仲裁者负责在争议时拍板。虚拟IP是给上层应用用的,切换时IP自动漂移。
避坑指南:我曾经因为虚拟IP的ARP缓存没及时刷新,导致切换后客户端还在连旧IP。解决办法是:切换时主动发送免费ARP(Gratuitous ARP)。
3.6 总结一下
双机热备不是买两台机器装上就完事了。心跳怎么配、存储怎么共享、仲裁谁来当,每个环节都有门道。
我个人建议,在风场部署前,一定要做故障注入测试:拔网线、断电、杀进程,看看备机到底能不能扛住。我在好几个项目里,都是靠这种「暴力测试」才把隐藏问题揪出来的。
记住一句话:双机热备的价值,不在于它平时多稳定,而在于故障时它能不能兜住底。