Skip to content

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
StackCorosync + Pacemaker 2.1.2
DRBD 版本8.4.11
DRBD Resourceha_nfs(protocol C)
DRBD Port7003
同步速率限制resync-rate 300M(實際約 40MB/s)
Filesystemext4 on /dev/drbd0 → /mnt/nfs_share
NFS VIP10.248.36.109/22
節點IP角色
master2.srv.world10.248.36.249DRBD Secondary / SyncTarget(犧牲方)
master3.srv.world10.248.36.127DRBD Primary / SyncSource(保留方)
master1NFS 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/UpToDate

Step 2:交回 Pacemaker 管理

bash
sudo pcs resource manage drbd_nfs_promotable
sudo pcs resource cleanup drbd_nfs_promotable
sudo pcs resource cleanup nfs-group

Step 3:驗證 Cluster 狀態

bash
sudo pcs status

預期:

  • drbd_nfs_promotable: Promoted master3 / Unpromoted master2
  • nfs-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_share

Step 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                        # 資源應留在 master3

Step 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_nfs

Pacemaker 資源清單

資源類型狀態說明
nfsserver_clonesystemd:nfs-server (clone)兩台均 Started
drbd_nfs_promotableocf:linbit:drbd (promotable)同步期間設為 unmanaged
fs_workocf💓FilesystemStarted on Primary
nfs_ipocf💓IPaddr2cidr_netmask=22
nfs_exportocf💓exportfsStarted on Primary

相關概念

來源