1. 程式人生 > >drbd(二):配置和使用

drbd(二):配置和使用

func protocol 底層 手動 crc32 程序 索引 ... 讀取數據

本文目錄:
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 RESOURCEdrbdadm 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"拆分為以下幾個動作:

  1. 將drbd的資源關聯到底層設備(metadata和data區)上,使之能通過底層設備存、取數據。該過程調用的是drbdsetup程序。
    drbdadm attach data1
    
  2. 加載drbd資源的同步參數。
    drbdadm syncer data1
    
  3. 連接對端。
    drbdadm connect data1
    
    這些命令在drbdadm中部分已失效,放在這裏只是為了說明"up"時所執行的幾個步驟。

到目前為止,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(二):配置和使用