DRBD(Distributed Relicated Device分佈式複製塊設備),可以解決磁盤
單點故障。一般情況下只支持2個節點
DRBD是一種塊設備,能夠被用於高可用(HA)之中.它相似於一個網絡RAID-1功能.當你將數據寫入本地 文件系統時,數據還將會被髮送到網絡中另外一臺主機上.以同樣的形式記錄在一個文件系統中。
簡單來說:drbd就是一款基於網絡的raid0技術
DRBD的全稱爲:Distributed ReplicatedBlock Device(DRBD)分佈式塊設備複製,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡來鏡像整個設備。你可以把它看作是一種網絡RAID。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。
DRBD工作模式:
(DRBD Primary)負責接收數據,把數據寫到本地磁盤併發送給另一臺主機(DRBD Secondary)。另一個主機再將數據存到自己的磁盤中。目前,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個節點都要安裝drbd
環境:2個節點
192.168.56.101 one
192.168.56.102 two
準備工作:兩臺主機之間通過主機名互通,在/etc/hosts里加IP與主機名的對應
每個節點各準備一個磁盤,只分區即可,不需格式化:fdisk /dev/sd磁盤號
分區大小必須一致;分區後執行partprobe,刷新分區信息,便於內核讀取到
安裝軟件包:
drbd共有兩部分組成,內核模塊和用戶空間管理工具
其中drbd內核模塊代碼已經整合進Linux內核2.6.33以後的版本中,因此,如果內核版本高於此版本的話,只需要安裝管理工具即可;否則,需要同時安裝內核模塊和管理工具兩個軟件包,並且此兩者的版本號一定要保持對應
對應的內核模塊的名字分別爲: drbd-kmdl(內核模塊)和drbd(用戶空間管理工具)
drdb和drdb-kmdl的版本要對應;drbd-kmdl的版本要與當前系統的內核版本(uname -r)相對應
在每個節點執行:modprobe drbd和lsmod |grep drbd 查看系統是否支持drbd模塊,若支持,則只用安裝drbd,否則要更新內核:
yum install kernel-devel kernel kernel-headers -y
更新完內核後需要重啓系統
http://elrepo.org/tiki/tiki-index.php 參考該網站執行yum倉庫的安裝
採取安裝指定yum源再安裝的方式: (編譯太複雜,容易錯)
下載rpm包: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum install -y kmod-drbd84 drbd84-utils -y 安裝完成
安裝的是: kmod-drbd84和drbd84-utils 這兩個,一個是內核,一個是服務
安裝完成後需要重啓,因爲這個過程中也升級了內核版本
編譯安裝需要安裝:drbd、drbdmanage、drbd-utils
安裝drbd: tar -zxvf drbd-版本號.tar.gz
cd drbd-版本號/
make && make install
加載drbd內核模塊: modprobe drbd ; lsmod | grep drbd
安裝drbd-utils : tar -zxvf drbd-utils-版本號.tar.gz
./autogen.sh
./configure -prefix=/usr --localstatedir=/var --sysconfdir=/etc
make && make install
安裝drbdmanage: tar -zxvf drbdmanage-版本號.tar.gz
python setup.py install
安裝完這三個軟件後,drbd就完成安裝了
DRBD配置文件:
/etc/drbd.conf 主配置文件
/etc/drbd.d/global_common.conf 全局配置文件
以及 /etc/drbd.d/目錄下以.res結尾的文件(需要自己編寫添加)
主配置文件中的內容包括了: global_common.conf以及/etc/drbd.d/目錄下以.res結尾的文件
配置文件/etc/drbd.d/global_common.conf :
在此配置文件中,global段僅能出現一次;且如果所有的配置信息都保存至同一個配置文件中而不分開爲多個文件的話,global段必須位於配置文件的最開始處
global_common.conf中主要定義global段和common段,而每一個.res的文件用於定義一個資源
global段中可以定義的參數有:
minor-count, dialog-refresh, disable-ip-verification和usage-count
common段用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義,實際應用中,common段並非必須,但建議將多個資源共享的參數定義爲common段中的參數以降低配置文件的複雜度。
resource段則用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。
.res資源在定義時必須爲其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或drbd的默認中進行繼承而無須定義
配合文件示例:
/etc/drbd.d/global_common.conf 全局配置文件配置:
global {
usage-count no; #是否參加DRBD使用統計,默認爲yes,是官方統計debd的裝機量
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; #使用DRBD的同步協議C,有A、B、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";
}
startup {
#wfc-timeout 120;
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
}
options {
# cpu-mask on-noo-data-accessible
}
disk {
on-io-error detach; #配置磁盤I/O錯誤處理策略爲分離
# size max-bio-bvecs on-io-error fencingdisk-barrier disk-flushes
# disk-drain md-flushes resync-rate resync-afteral-extents
# c-plan-ahead c-delay-target c-fill-targetc-max-rate
# c-min-rate disk-timeout
}
net {
cram-hmac-alg "sha1"; #用哪一種加密算法來做消息認證
shared-secret "mydrbd1ab"; #共享密鑰,可自己設置
# protocol timeout max-epoch-sizemax-buffers unplug-watermark
# connect-int ping-int sndbuf-sizercvbuf-size ko-count
# allow-two-primaries cram-hmac-algshared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbprr-conflict
# ping-timeout data-integrity-alg tcp-corkon-congestion
#congestion-fill congestion-extents csums-alg verify-alg
# use-rle
}
syncer {
rate 1024M; #設置主備節點同步時的網絡速率,以免過大佔用帶寬資源
}
}
on-io-error 策略可能爲以下選項之一:
detach分離:這是默認和推薦的選項,如果在節點上發生底層的硬盤I/O錯誤,它會將設備運行在Diskless
無盤模式下,會把磁盤從當前鏡像中拆除
pass_on :DRBD會將I/O錯誤報告到上層,在主節點上,它會將其報告給掛載的文件系統,但是在此節點上就往往忽略(因此此節點上沒有可以報告的上層)
-local-in-error:調用本地磁盤I/O處理程序定義的命令;這需要有相應的local-io-error調用的資源處理程序處理錯誤的命令;這就給管理員有足夠自由的權力命令命令或是腳本調用local-io-error處理I/O錯誤定義一個資源
/etc/drbd.d/test.res 資源配置文件配置
resource test { #test是資源名,可以自己設定
#protocol C; #指定使用的協議
meta-disk internal; #drbd的元數據存放在何處,internal表示存放在內部
device /dev/drbd0; #DRBD設備名稱,可自己指定,如/dev/drbd0或/dev/drbd1等
syncer {
verify-alg sha1; #加密算法
} 藍色底紋的可以寫可以不寫
net {
allow-two-primaries;
}
on one { #節點1主機名
disk /dev/sdb1; #用於drbd鏡像的磁盤或分區,及新創建的磁盤或分區
address 192.168.56.102:7789; #節點主機IP,端口默認是7789
}
on two { #節點2主機名
disk /dev/sdb1; #用於drbd鏡像的磁盤或分區,及新創建的磁盤或分區
address 192.168.56.102:7789; #資源監聽的節點主機IP,端口默認是7789
}
}
以上的兩個文件在兩個節點上必須相同,一個節點配置完後,執行拷貝
將配置好的兩個配置文件copy到另一個節點上:
scp /etc/drbd.d/* two:/etc/drbd.d/
具體操作步驟:
1、執行: drbdadm create-md test 初始化資源test,在兩個節點上都執行
2、執行: drbdadm up test #啓動資源test,在兩個節點都執行
3、執行:/etc/init.d/drbd start 或systemctl start drbd.service 啓動服務,兩個節點上都執行
4、查看drdb啓動狀態,可通過這兩個命令:cat /proc/drbd 或 drbd-overview
ds:Inconsistent/Inconsistent #這個提示表示主從節點上數據非一致
在drbd的主從模式中,只有主節點才能掛載使用,從節點僅作爲備份的功能。所以要使用該設備需要將其中一個節點提升爲主節點(primary)
兩個節點先創建一個磁盤且分一個區即可
5、執行:drbdadm primary test --force將節點設爲Primary,在要設置爲Primary的節點上執行
查看設爲主節點Primary後的狀態:cat /proc/drbd
執行: drbdadm role test 在任何節點上執行,可查看該節點是Primary還是Secondary
6、執行: drbd-overview 可查看數據正處於同步過程中,由於drbd的兩個對等設備是按位同步的,所以不管設備上面有沒有數據,都會有這個過程
查看同步完成後的狀態:drbd-overview
7、同步完成後即可在/dev/drbd0上創建文件系統並進行掛載:
格式化創建文件系統: mke2fs -t ext4 /dev/drbd0 或其他文件系統格式
掛載: mount /dev/drbd0 /mnt/ 掛載到/mnt目錄下
cd /mnt
cp /etc/issue ./ #複製一個文件到掛載點目錄下,用來測試8步驟是否同步
綜上:只有主節點執行掛載和格式化文件系統,副節點不需要執行
8、主從切換:DRBD的主從模型,在某一個時刻只能有一個節點爲Primary,若要進行角色轉換,需要先將Primary節點設置爲Secondary後,才能將原來的Secondary節點提升爲Primary,切換主節點時必須保證資源不在使用中
角色切換步驟:
在當前Primary節點上執行:
umount /mnt
drbdadm secondary test
在當前Secondary節點上執行:
drbdadm primary test
drbd-overview 查看,此時又在同步了
mount /dev/drbd0 /mnt #將/dev/drbd0掛載到/mnt上
此時在剛提升爲Primary節點上的/mnt目錄下會看到之前在原主節點one上掛載點的文件
建議:如果是單主模式,資源只能在主(Primary)節點上掛載使用,而且不建議手動切換主備節點
drbd的掛載點可以是一個磁盤也可以是一個分區,drbd的文件系統只能掛載在主Primary節點上
這是drbd的手動切換主節點,通常drbd會與HA一起使用來達到自動切換的效果,此時drbd是HA的一種clone資源
drbd的雙主模型,需藉助於集羣文件系統
drbd節點間的通信延遲在3秒內
9、drbd腦裂恢復: 針對於集羣情況
集羣發生故障,drbd可能會發生腦裂。在drbd的兩個節點上都得不到對方的情況
若發生腦裂,這時可以對其中一個設備重新創建設備,在兩個節點上重啓服務即可
drbdadm down test
drbdadm create-md test
重啓服務之後數據會重新開始同步:
其他命令:
查看其他資源連接狀態:
drbdadm cstate test #test爲資源名稱
查看硬盤狀態命令:
drbdadm dstate test
啓用和禁用資源: 也可使用all 表示所有資源
drbdadm up test #啓用資源
drbdadm down test #禁用資源
drbdadm up all 或 drbdadm down all
升級和降級資源:
drbdadm primary test #升級
drbdadm secondary test #降級
連接和斷開資源:
drbdadm connect test #連接資源
drbdadm disconnect test #斷開資源,斷開資源需要先 umoun /mnt
在單主模式下的DRBD,兩個節點同時處於連接狀態,任何一個節點都可以在特定的時間內變成主;但兩個節點中只能一爲主,如果已經有一個主,需先降級纔可能升級;在雙主模式下沒有這個限制
總結:
DRBD與HA的關係:
一個DRBD系統由兩個節點構成,與HA集羣類似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操作系統可以運行和訪問DRBD設備(/dev/drbd*)。在主節點寫入的數據通過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的DRBD設備,最終寫入備用節點的磁盤設備上,在備用節點上,DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中。現在大部分的高可用性集羣都會使用共享存儲,而DRBD也可以作爲一個共享存儲設備,使用DRBD不需要太多的硬件的投資。因爲它在TCP/IP網絡中運行,所以,利用DRBD作爲共享存儲設備,要節約很多成本,因爲價格要比專用的存儲網絡便宜很多;其性能與穩定性方面也不錯