一、什么是脑裂问题?

想象一下,你和朋友用对讲机登山,突然信号中断,你们都以为对方掉队了,于是同时带队前进——这就是脑裂(Split-Brain)。在Linux高可用集群中,当节点之间通信中断但各自都认为对方已宕机,就会导致资源争抢、数据损坏等严重问题。

典型场景

  • 网络闪断导致心跳丢失
  • 防火墙规则误拦截通信
  • 硬件故障导致通信延迟

二、预防脑裂的三大防线

1. 冗余通信链路

不要只依赖单一网络。Corosync支持多播/广播和UDP双通道:

# Corosync配置示例 (技术栈:Corosync 3.x)
totem {
  version: 2
  cluster_name: my_cluster
  transport: udpu  # 使用UDP单播
  interface {
    ringnumber: 0
    bindnetaddr: 192.168.1.0  # 主网络
    mcastport: 5405
  }
  interface {
    ringnumber: 1  
    bindnetaddr: 10.0.0.0     # 备份网络
    mcastport: 5406
  }
}
# 关键参数:两个独立网络接口互为备份

2. 仲裁机制

引入第三方裁判避免平票:

  • 法定节点数:要求超过半数节点存活
  • 外部仲裁设备:如共享存储或电源管理设备
# Pacemaker配置仲裁设备 (技术栈:Pacemaker 2.0)
pcs stonith create fence_me ipmi \
  hostlist="node1=192.168.1.101,node2=192.168.1.102" \
  op monitor interval=60s
# 注释:当节点失联时,通过IPMI强制重启异常节点

3. 超时策略调优

根据网络环境调整关键参数:

# Corosync关键参数 (单位:毫秒)
token: 30000          # 心跳令牌超时
token_retransmits: 5  # 重传次数
hold: 180             # 故障判定等待期

三、检测脑裂的实战方法

1. 集群状态自检

# 查看集群分区情况 (技术栈:Pacemaker)
pcs status | grep -A5 "Partitioned"
# 输出示例:
# WARNING: node1: lost contact
# Partitioned: [node2] | [node1]

2. 资源争抢监控

# 检查资源锁冲突
crm_mon -f | grep "failed to lock"
# 典型错误:
# ResourceVIP failed to lock on node1

3. 日志关键线索

# 查看Corosync日志
grep -E "ERROR|Split-Brain" /var/log/cluster/corosync.log
# 关键日志示例:
# [TOTEM] Token has not been received in 30000ms

四、从脑裂中恢复

1. 手动恢复步骤

# 1. 停止所有节点服务
pcs cluster stop --all

# 2. 清理资源锁
for node in node1 node2; do
  ssh $node "rm -f /var/lib/pacemaker/cores/*.lock"
done

# 3. 指定主节点启动
pcs cluster start node1 --wait
pcs cluster start node2 --wait

# 4. 验证资源状态
pcs resource cleanup

2. 自动恢复方案

配置Pacemaker的STONITH(Shoot The Other Node In The Head):

<!-- STONITH配置示例 (技术栈:Pacemaker) -->
<primitive id="power_fence" class="stonith" type="fence_ipmilan">
  <instance_attributes>
    <nvpair name="ipaddr" value="192.168.1.100"/>
    <nvpair name="action" value="reboot"/>
  </instance_attributes>
  <operations>
    <op name="monitor" interval="60s"/>
  </operations>
</primitive>
<!-- 注释:当节点无响应时自动强制重启 -->

五、应用场景与选型建议

适合场景

  • 金融交易系统(要求99.99%可用性)
  • 医疗核心数据库(数据一致性优先)
  • 电信计费系统(需分钟级故障转移)

技术对比

方案 优点 缺点
Corosync 配置简单,社区支持好 依赖多播网络
Keepalived 轻量级,适合简单场景 无内置资源管理
DRBD 数据同步粒度精细 性能开销较大

六、避坑指南

  1. 网络隔离测试
    定期拔网线模拟断网,观察集群行为

    # 模拟网络中断(慎用!)
    iptables -A INPUT -p udp --dport 5405 -j DROP
    
  2. 参数调优禁忌

    • 心跳超时不要小于默认值的80%
    • 避免同时使用多播和单播模式
  3. 监控必备指标

    # 关键指标采集示例
    watch -n 1 'pcs status | grep "Online: ["
    

七、总结

脑裂问题就像团队失去沟通后的混乱局面,通过冗余通信、智能仲裁和严格超时策略的三重保障,配合STONITH这样的"终极手段",能有效预防和化解危机。记住:任何高可用方案都要经过断网、断电、断服务的"三断测试"才算合格。