1. 程式人生 > >drbd腦裂處理

drbd腦裂處理

split brain實際上是指在某種情況下,造成drbd的兩個節點斷開了連線,都以primary的身份來執行。當drbd某


primary節點連線對方節點準備傳送資訊的時候如果發現對方也是primary狀態,那麼會會立刻自行斷開連線,並認定


當前已經發生split brain了,這時候他會在系統日誌中記錄以下資訊:“Split-Brain detected,dropping


connection!”當發生split brain之後,如果檢視連線狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是


StandAlone(如果是同時發現split brain狀態),也有可能是WFConnection的狀態。


 


mfs-master�0�2為主,mfs-log為輔;我個人覺得這個DRBD腦裂的行為,也應該是前期人為或是故障切換造成的,


如HA。今天在做HA+DRBD+MFS的時候,模擬mfs-master宕機看是否會自動切換的時候出現了drbd錯誤


在mfs-master機上�0�2斷開primary�0�2�0�2down機或是斷開網線


檢視secondary機器的狀態






檢視掛載




[

[email protected] mfs]# �0�2mount
/dev/drbd1 on /usr/local/mfs type ext3 (rw)
掛載也成功了,但是資料有問題,所以就先恢復mfs-master的drbd,我這裡也就是啟用網絡卡


原來的primary機器好了,出現腦裂了drbd1現在是standalone,這個時候,主跟輔是不會相互聯絡的






[[email protected] ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by
[email protected]
, 2012-
05-07 11:56:36
m:res cs ro ds p mounted fstype
1:r0 StandAlone Primary/Unknown UpToDate/DUnknown r----- ext3
這個時候,如果嘗試把drbd2的drbd服務重啟的話,你就會發現根本無法起來!


[[email protected] mfs]# service drbd start
Starting DRBD resources: [ ]..........
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 0 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 0 seconds. [wfc-timeout]
(These values are for resource 'r0'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 487]:
原因分析
由於節點重啟導致資料不一致,而配置檔案中沒有配置自動修復錯誤的內容,因而導致握手失敗,資料無法同步。
split brain有兩種解決辦法:手動處理和自動處理。
手動處理:
兩端節點上停止heartbeat
Heartbeat會鎖定資源,只有停止後才能釋放
[
[email protected]
~]#�0�2/etc/init.d/heartbeat stop
在作為mfs-log的節點上放棄該資源的資料
[[email protected] ~]# drbdadm disconnect r0
[[email protected] ~]# drbdadm secondary r0
[[email protected] ~]# drbdadm -- --discard-my-data connect r0
然後在mfs-master(drbd1)上重連線資源:
[[email protected] ~]# drbdadm disconnect r0
[[email protected] ~]# drbdadm connect r0
把mfs-master設定為主節點
[[email protected] ~]# drbdadm primary r0
啟動mfs-log(drbd2)上的drbd服務
[[email protected] mfs]# service drbd start
Starting DRBD resources: [ n(r0) ].
(實際採用的恢復方法)
先選擇好一個備機,在備機上執行:
drbdadm secondary r0
drbdadm disconnect r0
drbdadm -- --discard-my-data connect r0
在主上執行:
drbdadm connect r0
檢視主節點的狀態�0�2顯示為Primary,已經恢復了正常
[[email protected] ~]# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by [email protected], 2012-
05-07 11:56:36
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:28672 nr:0 dw:1 dr:28805 al:1 bm:4 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
然後檢視備份機的狀態:顯示Secondary,恢復正常
[[email protected] ~]# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by [email protected], 2012-
05-07 11:56:36
1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:28672 dw:28672 dr:0 al:0 bm:4 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

自動處理
通過/etc/drbd.conf配置中設定自動處理策略,在發生資料不一致時自動處理。自動處理策略定義如下:
1 after-sb-0pri.
當兩個節點的狀態都是secondary時,可以通過after-sb-0pri策略自動恢復。
1)disconnect
預設策略,沒有自動恢復,簡單的斷開連線。
2)discard-younger-primary
在split brain發生前從主節點自動同步。
3)discard-older-primary
在split brain發生時從變成primary的節點同步資料。
4)discard-least-changes
在split brain發生時從塊最多的節點同步資料。
5)discard-node-NODENAME

自動同步到名位元組點


2 after-sb-1pri
當兩個節點的狀態只有一個是primary時,可以通過after-sb-1pri策略自動恢復。
1)disconnect
預設策略,沒有自動恢復,簡單的斷開連線。
2)consensus
丟棄secondary或者簡單的斷開連線。
3)discard-secondary
丟棄secondary資料。
4)call-pri-lost-after-sb
按照after-sb-0pri的策略執行。


3 after-sb-2pri
當兩個節點的狀態都是primary時,可以通過after-sb-2pri策略自動恢復。
1)disconnect
預設策略,沒有自動恢復,簡單的斷開連線。
2)violently-as0p
按照after-sb-0pri的策略執行。
3)call-pri-lost-after-sb
按照after-sb-0pri的策略執行,並丟棄其他節點。

和after-sb-0pri中同樣的修復策略。如果利用這些策略裂腦危害能選擇,就在受危害的節點上呼叫pri-lost-after-sb程式。這個程式必須確認在handlers中配置,並考慮到從叢集中移除該節點。 

配置自動恢復
編輯/etc/drbd.conf,找到resource r0部分新增到net選項裡面,配置策略如下,所有節點完全一致。
#after-sb-0pri disconnect;
after-sb-0pri discard-younger-primary;
注:當兩個節點的狀態都是secondary時,可以通過after-sb-0pri策略自動恢復

在split brain發生前從主節點自動同步。

#after-sb-1pri disconnect;
after-sb-1pri discard-secondary;
注:當兩個節點的狀態只有一個是primary時,可以通過after-sb-1pri策略自動恢復。

丟棄secondary資料。
#after-sb-2pri disconnect;
after-sb-2pri call-pri-lost-after-sb;
注:當兩個節點的狀態都是primary時,可以通過after-sb-2pri策略自動恢復。

按照after-sb-0pri的策略執行,並丟棄其他節點。

其他:

1. DRBD配置注意事項:http://www.bkjia.com/Linux/766999.html