DRBD(Distributed Relicated Block Device 分佈式複製塊設備), 能夠解決磁盤單點故障。通常狀況下只支持2個節點。緩存
大體工做原理以下圖:bash
通常狀況下文件寫入磁盤的步驟是: 寫操做 --> 文件系統 --> 內存緩存中 --> 磁盤調度器 --> 磁盤驅動器 --> 寫入磁盤。而DRBD的工做機制如上圖所示,數據通過buffer cache後有內核中的DRBD模塊經過tcp/ip協議棧通過網卡和對方創建數據同步。ssh
這種機制,在某一時刻只容許有一個主節點。主節點的做用是能夠掛在使用,寫入數據等;從節點知識做爲主節點的鏡像,是主節點的備份。異步
這樣的工做機制的好處是能夠有效的避免磁盤出現單點故障,不會文件系統的錯亂。async
所謂雙主模型是2個節點均可以當作主節點來掛載使用。那麼,思考這樣一個問題?當第一個主節點對某一文件正在執行寫操做,此時另外一個節點也正在對同一文件也要執行寫操做,結果會如何呢??tcp
通常這種狀況會形成文件系統的錯亂,致使數據不能正常使用。緣由是:對文件的加鎖機制是由操做系統內核所管理的,一個節點對文件加速以後,另外一個節點並不知道對方的鎖信息。分佈式
解決辦法是:使用集羣文件系統。集羣文件系統使用分佈式文件鎖管理器,當一個節點對文件加鎖以後會經過某種機制來通知其餘節點鎖信息,從而實現文件鎖共享。ide
當某一進程對某一文件執行了寫操做時,寫操做在上圖執行到那個過程時就認爲文件已經同步完成。工具
A協議:異步複製(asynchronous)如上圖 文件寫操做執行到A點是就認爲寫入磁盤成功。性能好,數據可靠性差。性能
B協議:半同步複製(semi sync)如上圖 文件寫操做執行到B點是就認爲寫入磁盤成功。性能好,數據可靠性介於A和C之間。
C協議:同步複製( sync)如上圖 文件寫操做執行到C點是就認爲寫入磁盤成功。性能差,數據可靠性高。也是drbd默認使用的複製協議
2個節點:
172.16.10.50 director1.example.com
172.16.10.51 director2.example.com
# drbd 2個節點之間通訊是基於主機名的 # 設置主機名和主機名解析文件
# 準備好大小相同的磁盤,這裏使用大小相同的分區代替。只需劃好分區就好,不須要格式化。
drbd共有兩部分組成:內核模塊和用戶空間的管理工具。 其中drbd內核模塊代碼已經整合進Linux內核2.6.33之後的版本中,所以,若是內核版本高於 此版本的話,只須要安裝管理工具便可;不然,您須要同時安裝內核模塊和管理工具兩個軟件包, 而且此二者的版本號必定要保持對應。 # 對應的內核模塊的名字分別爲 drbd-kmod 注意: drbd和drbd-kmdl的版本要對應;另外一個是drbd-kmdl的版本要與當前系統的內核版本(uname -r)相 對應。 下載地址: 直接安裝便可。
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; } } 二、定義一個資源/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/* director2.example.com:/etc/drbd.d
1)初始化資源,在 director1 和 director2上分別執行: drbdadm create-md test 2)啓動服務,在 director1 和 director2 上分別執行: /etc/init.d/drbd start
完成以上2步驟後,查看啓動狀態:
# 將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的雙主模型,需藉助於集羣文件系統,在之後會詳細介紹。