drbd(二):配置和使用
本文目錄:
1.drbd配置文件
2.創建metadata區並計算metadata區的大小
3.啟動drbd
4.實現drbd主從同步
5.數據同步和主從角色切換
6.drbd腦裂後的解決辦法
7.drbd多卷組配置
drbd的簡介、同步機制和安裝見另一篇文章:drbd(一):簡介、同步機制和安裝。
本文所述為drbd8.4的配置,和8.4版本之前的版本,以及drbd9版本的差別都非常大。
1.drbd配置文件
drbd的主配置文件/etc/drbd.conf,為了管理的便捷性,在此文件中使用了include指令指定了包含的配置文件段,默認的是在/etc/drbd.d/目錄下。在此目錄有全局配置文件global_common.conf
*.res
文件。其中在主配置文件中include全局配置文件的指令只能出現一個,且必須出現在最前面。
兩個節點的配置文件應盡量完全一致。
在/usr/share/doc/drbd-版本/
下有drbd.conf的樣例配置文件。
以下是global_common.conf的結構。
global {
usage-count yes; # 是否參加drbd的使用者統計,默認此選項為YES
}
common { # common段定義每一個資源從此繼承的參數,非必須,但建議將多個資源共享的參數定義在此以降低配置文件的復雜度
handlers {
}
startup {
}
options {
}
disk {
}
net {
}
}
全局配置修改如下:
global {
usage-count no;
}
common {
handlers{ # 定義出現以下問題(如splitbrain或out-of-sync錯誤)時處理策略
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f" ;
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
split-brain "/usr/lib/drbd/notify-split-brain.sh root";
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
}
disk {
on-io-error detach; # 當發生io錯誤時,直接拔除備節點設備
resync-rate 600M;
}
# syncer { # 註意,8.4版本已不支持該選項
# rate 10M; # re-sync速率,官方建議設置為網絡IO和磁盤IO能力最小者的30%
# verify-alg crc32c; # 用於校驗block是否一致
}
protocol C; # 定義使用C協議,即同步復制。可不定義,此為默認
}
再新建一個配置文件data1.res,裏面定義資源。
resource data1 { # 定義資源名稱
on drbd1.longshuai.com { # 指定在drbd1.longshuai.com節點上,節點名要和uname -n一致
device /dev/drbd0; # 指定drbd設備,0是其此設備號
disk /dev/sdb5; # 指定要同步的數據分區
address 192.168.100.51:7788; # 指定監聽用來同步數據的地址和端口,此處指定為數據同步專用地址eth1
meta-disk /dev/sdb1;
}
on drbd2.longshuai.com {
device /dev/drbd0;
disk /dev/sdb5;
address 192.168.100.52:7788;
meta-disk /dev/sdb1;
}
}
或者簡化為如下:
resource data1 {
device /dev/drbd0;
disk /dev/sdb5;
meta-disk /dev/sdb1[0];
on drbd1.longshuai.com {
address 192.168.100.51:7788;
}
on drbd2.longshuai.com {
address 192.168.100.52:7788;
}
}
resource段用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須為其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個節點,其它參數均可以從common段或drbd的默認中進行繼承。
其中上述配置文件的meta-disk有三種記錄方式:internal/device/device[index_num]。其中不管是哪種方式,metadata存放的分區不能格式化,哪怕使用internal時metadata和一般data在同一個分區也不能格式化該分區。
internal是將元數據也寫入到數據分區的尾部,即數據和元數據同分區。如果指定的device沒有給定index時,則表示元數據存儲到該設備中。如果某節點指定device[index_num],那麽指定幾次元數據分區索引就必須大於128M的幾倍,例如上述文件中drbd1.longshuai.com節點指定了/dev/sdb1[0],那麽sdb1就必須大於128M,如果此時其他資源的節點也指定了同一臺服務器的/dev/sdb1[1],則指定了兩次就必須大於256M。指定為internal和device時,元數據區的大小是drbd自行計算的。
2.創建metadata塊(初始化)並計算metadata區的大小
drbdadm create-md [all|resource_names]
兩節點都初始化。
[root@drbd1 drbd.d]# drbdadm create-md data1
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
初始化成功後,可以使用下面幾個命令來獲取drbd的metadata區信息。
[root@drbd1 ~]# drbdadm show-gi data1
+--< Current data generation UUID >-
| +--< Bitmap‘s base data generation UUID >-
| | +--< younger history UUID >-
| | | +-< older history >-
V V V V
0000000000000004:0000000000000000:0000000000000000:0000000000000000:0:0:0:0:0:0:0
^ ^ ^ ^ ^ ^ ^
-< Data consistency flag >--+ | | | | | |
-< Data was/is currently up-to-date >--+ | | | | |
-< Node was/is currently primary >--+ | | | |
-< Node was/is currently connected >--+ | | |
-< Node was in the progress of setting all bits in the bitmap >--+ | |
-< The peer‘s disk was out-dated or inconsistent >--+ |
-< This node was a crashed primary, and has not seen its peer since >--+
flags: Secondary, StandAlone, Inconsistent
meta-data: clean
zero size device -- never seen peer yet?
從上面命令的結果中,可以看出數據的代數,還能獲取一些節點狀態信息。
關於drbd的代數,它在drbd的內部機制中,用於實現:
(1).判斷兩節點是否是同一個集群的節點。也就是說,對方節點是不是自己的對端節點。因為有可能出現意外連接,卻不是自己對端的情況。
(2).判斷節點設備是否需要全部重新同步(re-sync)或者部分重新同步。
(3).判斷重新同步的方向。即是從節點1重新同步到節點2還是從節點2重新同步到節點1。
(3).標識節點是否處於腦裂(brain split)。
[root@drbd1 ~]# drbdadm dump-md data1
# DRBD meta data dump
# 2018-03-29 22:53:52 +0800 [1522335232]
# drbd1.longshuai.com> drbdmeta 0 v08 /dev/sdb1 flex-external dump-md
#
version "v08";
# md_size_sect 1951744
# md_offset 0
# al_offset 4096
# bm_offset 36864
uuid {
0x0000000000000004; 0x0000000000000000; 0x0000000000000000; 0x0000000000000000;
flags 0x00000000;
}
# al-extents 257;
la-size-sect 0;
bm-byte-per-bit 4096;
device-uuid 0x0A293D126547895D;
la-peer-max-bio-size 0;
al-stripes 1;
al-stripe-size-4k 8;
# bm-bytes 0;
bm {
}
# bits-set 0;
從此命令中可以獲知不同標記代數的uuid值,以及metadata的元數據信息,例如md_size_sect=1951744
表示元數據所在分區占用了1951744個扇區。註意,該命令不要在drbd設備已啟動的情況下執行。
知道這兩個命令可以獲取一些信息後,現在我們要做的是計算metadata部分的數據大小。這個大小在"修改drbd設備空間大小"時有用。
首先獲取元數據所在分區的扇區數。即上面結果中的"md_size_sect"。不過也可以使用塊設備工具blockdev
來獲取。
[root@drbd1 ~]# blockdev --getsz /dev/sdb1
1951744
有了該值,根據計算公式:Size = (md_size_sect/2^18)*8*N+72
進行計算。其中md_size_sect如上計算,N是對端的數量,一般情況下drbd實現的是雙節點,因此N=1,可以不用考慮。計算的結果是扇區數。
因此,此處計算的結果為:1951744/1024/256*8+72=131.5625
共132扇區。如果要轉換為KB大小,則再除以2即可(假設扇區大小為512bytes)。
3.在節點上啟動drbd
可使用如下命令來管理資源的啟動、停止。
drbdadm {up|down} {all|resource_names}
例如:
drbdadm up data1
如果啟動報以下錯誤,則可能是因為對metadata進行了格式化。解決方法是將其刪除再重新創建但不要格式化。
0: Failure: (119) No valid meta-data signature found.
此時可以查看/proc/drbd文件來查看drbd中配置的資源的狀態,也可以使用命令drbd-overview RESOURCE
或drbdadm status RESOURCE
來查看。如果角色ro是從/從,則表明配置成功,若有一端是unknown,則表明和對方不能通信,可能是主機路由的問題,這樣會導致腦裂的問題。
cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:6297452
狀態信息極其重要,其中:
- cs:connection state,必須是connected狀態才表示連接成功。
- ro:roles,各節點是是primary還是secondary。
- ds:disk state,數據的狀態,由此判斷是否要同步、重新同步、正在同步、同步完成、是否一致等等信息。
關於drbd的狀態信息,見另一篇文章。
實際上,drbdadm up
啟動drbd設備時做了很多工作,如果細致劃分的話,可以將"drbdadm up"拆分為以下幾個動作:
- 將drbd的資源關聯到底層設備(metadata和data區)上,使之能通過底層設備存、取數據。該過程調用的是drbdsetup程序。
drbdadm attach data1
- 加載drbd資源的同步參數。
drbdadm syncer data1
- 連接對端。
這些命令在drbdadm中部分已失效,放在這裏只是為了說明"up"時所執行的幾個步驟。drbdadm connect data1
到目前為止,drbd的資源已經關聯完成,也已經準備好進行同步,所不知道的僅僅只是誰作為同步的源端,誰做為同步的目標端,也就是primary和secondary的角色。
4.實現drbd的主從同步
在需要設置為主機點的機器上執行:
drbdadm primary --force data1 # 第一次初始化同步只能執行這個
# 或者
drbdsetup /dev/drbd0 primary
其中"--force"表示強制升級為primary,這會導致本節點的數據強制同步到對端上。
由於是第一次執行同步,因此該過程會同步整個分區進行初始化。
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:812136 nr:0 dw:0 dr:813048 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4069272
[==>.................] sync‘ed: 16.7% (3972/4764)M
finish: 0:02:24 speed: 28,216 (17,652) K/sec
可以看到本端已經設置為主節點,且ds的一端是uptodate狀態,最後還看到了鏡像到對方的進度信息。
當鏡像完成後,再查看資源的信息。可以發現兩端的ds都變成uptodate狀態了。說明鏡像完成了。
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:4881408 nr:0 dw:0 dr:4882320 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
5.數據同步和主從角色切換
現在已經有一端是主節點了。drbd的主從節點中,只有主節點是可以掛載並進行讀寫的。所以在主節點上掛載drbd設備(可能需要重新格式化data分區,而且如果metadata使用的是internal模式,則需要格式化分區才OK)。
掛載drbd到mnt,然後向其中拷貝一個文件。
[root@drbd1 ~]# mount /dev/drbd0 /mnt
[root@drbd1 ~]# cp /etc/inittab /mnt
[root@drbd1 ~]# ls /mnt
inittab lost+found
如果對端也有這個文件則說明同步成功了,但是對端是從節點,無法讀取數據,所以只能切換主從角色再查看。不過在,實驗環境下直接把從節點的drbd給down掉,再直接掛載/dev/sdb5也是可以的。
首先將主節點切換為從節點,必須先卸載掛載點才行。
[root@drbd1 ~]# umount /mnt
[root@drbd1 ~]# drbdadm secondary data1
[root@drbd1 ~]# drbd-overview
0:data1/0 Connected Secondary/Secondary UpToDate/UpToDate
再在從節點上將自己設置為主節點,然後掛載drbd設備,再查看是否有文件同步過來了。
[root@drbd2 ~]# drbdadm primary data1
[root@drbd2 ~]# mount /dev/drbd0 /mnt
[root@drbd2 ~]# ls /mnt
inittab lost+found
這說明實現了數據同步。但是這樣手動切換來切換去的很麻煩,一般會將其交給heartbeat或者corosync來管理,實現drbd的自動切換。
6.drbd腦裂的解決方法
當DRBD的兩節點都發現對方後,並都交換了初始化握手協議後,發現雙方都是primary角色,就會出現腦裂。出現腦裂後,由於兩端節點都可以掛載、寫數據,會導致數據的混亂。
當檢測到出現腦裂時,drbd會立即中斷雙方的連接,並在日誌中記錄
Split-Brain detected, dropping connection!
在出現腦裂的時候,一定有一端的連接狀態處於StandAlone
,另一端的狀態可能是StandAlone
(當雙方同時檢測到腦裂),也可能是Connecting
(當一端先檢測到腦裂立即中斷連接後使得另一端無法再檢測出腦裂)。
出現腦裂的時候,如果沒有配置drbd自動從腦裂狀態恢復,那麽必須進行人為的手動幹涉。幹涉的方法是放棄一端的數據,這一端稱為"腦裂的受害者",另一端保存數據的節點則稱為"腦裂的幸存者"。
處理方法如下:
(1).在腦裂的受害者節點上執行:
drbdadm disconnect {resource | all} # 先中斷連接,防止再次寫入數據
drbdadm secondary {resource | all} # 設置為secondary
drbdadm connect --discard-my-data {resource | all} # 丟棄數據,並再次連接
(2).如果腦裂的幸存者節點也是StandAlone
狀態,則執行下面的命令重新連接,如果仍然保持Connecting
狀態,則不需任何操作:
drbdadm disconnect {resource | all}
drbdadm connect {resource | all}
當幹涉完兩邊後,兩邊重新建立連接,重新握手交換初始化協議信息。此時,腦裂的受害者端的狀態將變為SyncTarget
,表示同步的目標端,它將從另一節點上獲取數據。
但註意,受害者在SyncTarget
狀態下同步數據時,並不會從幸存者節點獲取所有數據,而是按照自己節點上的事務信息進行回滾,再從幸存者節點上獲取回滾後還缺少的數據。因此,drbd腦裂後完成數據同步也是很快的。
7.drbd多卷組配置
前文實驗中使用的配置文件如下:
[root@drbd2 ~]# drbdadm dump data1
# resource data1 on drbd2.longshuai.com: not ignored, not stacked
# defined at /etc/drbd.d/data1.res:1
resource data1 {
on drbd1.longshuai.com {
device /dev/drbd0 minor 0;
disk /dev/sdb5;
meta-disk /dev/sdb1;
address ipv4 192.168.100.51:7788;
}
on drbd2.longshuai.com {
device /dev/drbd0 minor 0;
disk /dev/sdb5;
meta-disk /dev/sdb1;
address ipv4 192.168.100.52:7788;
}
}
它等價於:
resource data1 {
device /dev/drbd0;
disk /dev/sdb5;
meta-disk /dev/sdb1;
on drbd1.longshuai.com {
address 192.168.100.51:7788;
}
on drbd2.longshuai.com {
address 192.168.100.52:7788;
}
}
其實它還等價於:
resource data1 {
volume 0 {
device /dev/drbd0;
disk /dev/sdb5;
meta-disk /dev/sdb1;
}
on drbd1.longshuai.com {
address 192.168.100.51:7788;
}
on drbd2.longshuai.com {
address 192.168.100.52:7788;
}
}
drbd會為沒有分卷組的資源使用默認卷組"volume 0"。
如果需要多個底層設備(磁盤、分區、LVM、RAID等)提供drbd的同步功能,可以設置多個卷組。
例如,除了上面使用的/dev/sdb{5,1}外,添加/dev/sdc1(data區)、/dev/sdc2(metadata區)到另一個卷組。
resource data1 {
volume 0 {
device /dev/drbd0;
disk /dev/sdb5;
meta-disk /dev/sdb1;
}
volume 1 {
device /dev/drbd1;
disk /dev/sdc1;
meta-disk /dev/sdc2;
}
on drbd1.longshuai.com {
address 192.168.100.51:7788;
}
on drbd2.longshuai.com {
address 192.168.100.52:7788;
}
}
如果第二個卷組是在drbd已經運行後再添加的完全的新分區,則需要先創建元數據區、調整配置文件、啟動資源等過程。
兩邊節點都執行:
drbdadm create-md data1/1 # data1/1表示data1資源下的卷組1
drbdadm adjust data1 # 調整資源,相當於reload資源配置文件
主節點執行:
drbdadm --force primary data1/1
查看兩卷組的狀態信息:
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:76408 nr:0 dw:76408 dr:3441 al:22 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:5352 nr:0 dw:0 dr:6264 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4876056
[>....................] sync‘ed: 0.2% (4760/4764)M
finish: 0:43:32 speed: 1,784 (1,784) K/sec
再次提醒,兩端的配置文件應當盡量保持一致,因此最好不要隨意分區。
回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到數據庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/8678883.html
註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!
drbd(二):配置和使用