DRBD(Distributed Relicated Block Device 分布式復制塊設備), 可以解決磁盤單點故障。一般情況下只支持2個節點。
大致工作原理如下圖:
一般情況下文件寫入磁盤的步驟是: 寫操作 --> 文件系統 --> 內存緩存中 --> 磁盤調度器 --> 磁盤驅動器 --> 寫入磁盤。而DRBD的工作機制如上圖所示,數據經過buffer cache后有內核中的DRBD模塊通過tcp/ip協議棧經過網卡和對方建立數據同步。
一、DRBD的工作模式
1、主從模型master/slave(primary/secondary)
這種機制,在某一時刻只允許有一個主節點。主節點的作用是可以掛在使用,寫入數據等;從節點知識作為主節點的鏡像,是主節點的備份。
這樣的工作機制的好處是可以有效的避免磁盤出現單點故障,不會文件系統的錯亂。
2、雙主模型 dula primary(primary/primary)
所謂雙主模型是2個節點都可以當做主節點來掛載使用。那么,思考這樣一個問題?當第一個主節點對某一文件正在執行寫操作,此時另一個節點也正在對同一文件也要執行寫操作,結果會如何呢??
一般這種情況會造成文件系統的錯亂,導致數據不能正常使用。原因是:對文件的加速機制是由操作系統內核所管理的,一個節點對文件加速之后,另一個節點並不知道對方的鎖信息。
解決辦法是:使用集群文件系統。集群文件系統使用分布式文件鎖管理器,當一個節點對文件加鎖之后會通過某種機制來通知其他節點鎖信息,從而實現文件鎖共享。
二、DRBD的復制模型
當某一進程對某一文件執行了寫操作時,寫操作在上圖執行到那個過程時就認為文件已經同步完成。
復制協議:
A協議:異步復制(asynchronous)如上圖 文件寫操作執行到A點是就認為寫入磁盤成功。性能好,數據可靠性差。
B協議:半同步復制(semi sync)如上圖 文件寫操作執行到B點是就認為寫入磁盤成功。性能好,數據可靠性介於A和C之間。
C協議:同步復制( sync)如上圖 文件寫操作執行到C點是就認為寫入磁盤成功。性能差,數據可靠性高。也是drbd默認使用的復制協議
三、drbd的配置(主從模式)
實驗環境:
2個節點:
172.16.10.50 director1.example.com
172.16.10.51 director2.example.com
1、准備工作
# drbd 2個節點之間通信是基於主機名的 # 設置主機名和主機名解析文件
# 准備好大小相同的磁盤,這里使用大小相同的分區代替。只需划好分區就好,不需要格式化。
2、安裝軟件包
drbd共有兩部分組成:內核模塊和用戶空間的管理工具。 其中drbd內核模塊代碼已經整合進Linux內核2.6.33以后的版本中,因此,如果內核版本高於此版本的話, 只需要安裝管理工具即可;否則,您需要同時安裝內核模塊和管理工具兩個軟件包,並且此兩者的版本號一定要保持對應。 # 對應的內核模塊的名字分別為 drbd-kmod 注意: drbd和drbd-kmdl的版本要對應;另一個是drbd-kmdl的版本要與當前系統的內核版本(uname -r)相對應。 下載地址: http://www.rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/ 下載完成后,直接安裝即可。
3、配置drbd
配置文件說明:
drbd的主配置文件為/etc/drbd.conf;為了管理的便捷性,目前通常會將些配置文件分成多個部分,且都保存至/etc/drbd.d/目錄中, 主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d目錄中的配置文件為global_common.conf和所有以.res結尾的文件。 其中global_common.conf中主要定義global段和common段,而每一個.res的文件用於定義一個資源。 在配置文件中,global段僅能出現一次,且如果所有的配置信息都保存至同一個配置文件中而不分開為多個文件的話,global段必須位於配置文件的最開始處。 目前global段中可以定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。 common段則用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義。 實際應用中,common段並非必須,但建議將多個資源共享的參數定義為common段中的參數以降低配置文件的復雜度。 resource段則用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。 資源在定義時必須為其命名,名字可以由非空白的ASCII字符組成。 每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或drbd的默認中進行繼承而無須定義。
配置過程:
###############下面的操作在director1.example.com上完成。 1 配置/etc/drbd.d/global-common.conf global { usage-count no; # 是否為drbd官方收集數據 # minor-count dialog-refresh disable-ip-verification } # common是各個資源共用的選項 common { protocol C; # 復制協議 handlers { 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"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { #wfc-timeout 120; #degr-wfc-timeout 120; } disk { on-io-error detach; # 發生i/o錯誤的處理方法,detach將鏡像磁盤直接拔除 #fencing resource-only; } net { cram-hmac-alg "sha1"; shared-secret "mydrbdlab"; } syncer { rate 1000M; } } 2、定義一個資源/etc/drbd.d/test.res,內容如下: resource test { on director1.example.com { device /dev/drbd0; disk /dev/sda3; address 172.16.10.50:7789; meta-disk internal; } on director2.example.com { device /dev/drbd0; disk /dev/sda3; address 172.16.10.51:7789; meta-disk internal; } }
以上文件在兩個節點上必須相同,因此,可以基於ssh將剛才配置的文件全部同步至另外一個節點。
scp /etc/drbd.d/* director.example.com:/etc/drbd.d
在兩個節點上初始化已定義的資源並啟動服務
1)初始化資源,在 director1 和 director2上分別執行: drbdadm create-md test 2)啟動服務,在 director1 和 director2 上分別執行: /etc/init.d/drbd start
完成以上2步驟后,查看啟動狀態:
完成以上操作后,繼續下面操作。同步metadata(元數據)
# 將director1.example.com 節點設置為Primary。在要設置為Primary的節點上執行如下命令: drbdadm primary --force test
接下來創建文件系統,掛載使用
mke2fs -t ext4 -L DRBD /dev/drbd0 mount /dev/drbd0 /mnt/
配置完成。
三、主從節點切換
drbd主從模型只有主節點才能掛載使用。所以就會有升級降級的操作。對主Primary/Secondary模型的drbd服務來講,在某個時刻只能有一個節點為Primary,因此,要切換兩個節點的角色,只能在先將原有的Primary節點設置為Secondary后,才能原來的Secondary節點設置為Primary。
具體使用如下:
這樣的切換需手動升級,降級。通常drbd會於HA一起使用來達到自動切換的效果,此時drbd是HA的一種clone資源。
drbd的雙主模型,需借助於集群文件系統,在以后會詳細介紹。