Appearance
DRBD Split-Brain 修復(Pacemaker HA Cluster)
DRBD Split-Brain 發生時的診斷邏輯、三步修復方式,以及同步完成後的 Pacemaker 資源恢復 SOP。
概述
DRBD Split-Brain 是高可用叢集中最嚴重的故障情境之一:兩個節點在失去通訊時各自晉升為 Primary,寫入不同的資料,UUID 分叉後 DRBD 偵測到衝突即斷線進入 StandAlone 模式。恢復的核心決策是:選定一個節點作為資料來源(SyncSource),另一節點放棄本地資料(--discard-my-data)進行全量同步。
除了 Split-Brain 本身,本次事件還暴露了兩個相關設定缺陷:
- Failover 後自動回流:
colocation constraint設為INFINITY導致資源永遠被拉回特定節點 - nfs_ip findif 失敗:
cidr_netmask設定與實際網卡不符
核心內容
問題一:Split-Brain(手動選邊站)
診斷:dmesg 或 /proc/drbd 看到:
uuid_compare()=100 by rule 90
Split-Brain detected but unresolved, dropping connection!DRBD 進入 StandAlone 模式,兩節點無法自動同步。
修復決策:選定保留資料的節點(SyncSource),另一節點執行 --discard-my-data 放棄本地資料:
bash
# 在犧牲節點(master2)執行:
sudo drbdadm -- --discard-my-data connect ha_nfs
# 在保留節點(master3)執行(如果連線未自動建立):
sudo drbdadm connect ha_nfs同步進度監控:
bash
cat /proc/drbd
# cs:SyncTarget ds:Inconsistent/UpToDate
# [>.................] sync'ed: 0.1% (xxxxx/xxxxx)M
# finish: xx:xx:xx speed: xxxxx (xxxxxx) want: 300000 K/sec問題二:Failover 後資源自動回流
根因:colocation constraint 設為 INFINITY,導致 DRBD promote score 計算結果永遠讓原節點贏過 resource-stickiness(預設 200)。
修復:將 colocation score 從 INFINITY 降為 5000,讓 resource-stickiness 發揮作用:
bash
sudo pcs constraint colocation remove drbd_nfs_promotable nfs-group
sudo pcs constraint colocation add drbd_nfs_promotable with nfs-group 5000 rsc-role=Master with-rsc-role=Started問題三:nfs_ip findif 失敗
根因:nfs_ip 資源設定 cidr_netmask=24,但實際網卡是 /22,Pacemaker 的 findif 無法匹配介面。
修復:
bash
sudo pcs resource update nfs_ip cidr_netmask=22關鍵要點
- Split-Brain 修復是破壞性操作:
--discard-my-data那端的所有本地寫入將被覆蓋,執行前必須確認選對犧牲方 - 全量同步期間(1.3TB 約需 9-10 小時),絕對不能 將
drbd_nfs_promotable交回 Pacemaker 管理(pcs resource manage),否則 Pacemaker 可能在同步未完成時嘗試 promote Secondary - 同步期間 Primary 節點(master3)的 NFS 服務可正常使用,使用者不受影響
resource-stickiness全域預設為 200;colocation score 應低於此值(如 5000 仍高於 200,但搭配其他 score 計算後效果正常)
實際應用
此 SOP 適用於 Corosync + Pacemaker + DRBD 的雙節點 HA 叢集,資源組包含 NFS server、Filesystem、IPaddr2、exportfs。
部署設定參考
環境參數
| 項目 | 值 |
|---|---|
| Cluster 名稱 | ha_cluster |
| Stack | Corosync + Pacemaker 2.1.2 |
| DRBD 版本 | 8.4.11 |
| DRBD Resource | ha_nfs(protocol C) |
| DRBD Port | 7003 |
| 同步速率限制 | resync-rate 300M(實際約 40MB/s) |
| Filesystem | ext4 on /dev/drbd0 → /mnt/nfs_share |
| NFS VIP | 10.248.36.109/22 |
| 節點 | IP | 角色 |
|---|---|---|
| master2.srv.world | 10.248.36.249 | DRBD Secondary / SyncTarget(犧牲方) |
| master3.srv.world | 10.248.36.127 | DRBD Primary / SyncSource(保留方) |
| master1 | — | NFS Client |
Constraint 設定(修復後)
Colocation: drbd_nfs_promotable with nfs-group (score:5000) rsc-role:Master with-rsc-role:Started
Ordering: promote drbd_nfs_promotable then start nfs-group (Mandatory)
Resource-stickiness: 200 (global default)同步完成後恢復 SOP(7 Steps)
Step 1:確認同步完成
bash
cat /proc/drbd
# 預期:cs:Connected ds:UpToDate/UpToDateStep 2:交回 Pacemaker 管理
bash
sudo pcs resource manage drbd_nfs_promotable
sudo pcs resource cleanup drbd_nfs_promotable
sudo pcs resource cleanup nfs-groupStep 3:驗證 Cluster 狀態
bash
sudo pcs status預期:
drbd_nfs_promotable: Promoted master3 / Unpromoted master2nfs-group全部 Started on master3- 無 Failed Resource Actions
Step 4:驗證 NFS 服務
bash
# 在 master3 確認 VIP
ip addr show enp129s0np0 | grep 10.248.36.109
# 在 master1 測試 NFS
ls /mnt/nfs_share/
# 若為空,重新掛載:
# umount /mnt/nfs_share && mount 10.248.36.109:/mnt/nfs_share /mnt/nfs_shareStep 5:驗證 Failover 不回流
bash
sudo pcs node standby master3.srv.world
sudo pcs status # 資源應遷移到 master2
sudo pcs node unstandby master3.srv.world
sudo pcs status # 資源應留在 master2,不回流Step 6:驗證反向 Failover
bash
sudo pcs node standby master2.srv.world
sudo pcs status # 資源應遷移到 master3
sudo pcs node unstandby master2.srv.world
sudo pcs status # 資源應留在 master3Step 7(選用):加入 Split-Brain 自動處理策略
編輯 /etc/drbd.d/ha_nfs.res,在 net {} 區塊加入(兩台都要改):
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;改完後:
bash
sudo drbdadm adjust ha_nfs
after-sb-2pri disconnect表示兩台都是 Primary 時仍斷線(最安全,需手動處理)。若需自動解決,可改為call-pri-lost-after-sb,但有資料遺失風險。
同步中斷恢復
若同步中途因網路斷線中斷:
bash
# 在 master2(SyncTarget)執行
sudo drbdadm up ha_nfs
# 若報 split-brain
sudo drbdadm disconnect ha_nfs
sudo drbdadm -- --discard-my-data connect ha_nfs
# 在 master3(SyncSource)執行
sudo drbdadm connect ha_nfsPacemaker 資源清單
| 資源 | 類型 | 狀態說明 |
|---|---|---|
| nfsserver_clone | systemd:nfs-server (clone) | 兩台均 Started |
| drbd_nfs_promotable | ocf:linbit:drbd (promotable) | 同步期間設為 unmanaged |
| fs_work | ocf💓Filesystem | Started on Primary |
| nfs_ip | ocf💓IPaddr2 | cidr_netmask=22 |
| nfs_export | ocf💓exportfs | Started on Primary |
相關概念
- DRBD + Pacemaker NFS HA Cluster 完整復原 Runbook — 全場景復原手冊:涵蓋 is-managed=false、group 出錯、無 promotion score、單節點存活、RA 啟動失敗、split-brain 六大 Scenario 與日常維護 Checklist
- MariaDB 遷移(Bitnami Galera → 官方 StatefulSet) — Galera 多 Master 架構同樣面臨 split-brain 風險,遷移過程中的資料一致性保障可與 DRBD 的手動選邊策略對照