DRBD簡介
DRBD的全稱爲:DistributedReplicatedBlockDevice(DRBD)分佈式塊設備複製DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡來鏡像整個設備。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。與心跳連接結合使用,也可以把它看作是一種網絡RAID。
DRBD工作機制
Drbd負責接收數據,把數據寫到本地磁盤,然後發送給另一個主機。另一個主機再將數據存到自己的磁盤中。目前,drbd每次只允許對一個節點進行讀寫訪問,這對於通常的故障切換高可用性集羣來講已經足夠用了。以後的版本將支持兩個節點進行讀寫存取。
DRBD協議說明
A數據一旦寫入磁盤併發送到網絡中就認爲完成了寫入操作。
B收到接收確認就認爲完成了寫入操作。
C收到寫入確認就認爲完成了寫入操作
軟件下載列表地址:http://oss.linbit.com/drbd/
環境介紹:
系統版本:CentOS6.4(32位)內核版本2.6.32-358.el6.i686
軟件版本:drbd-8.4.3.tar.gz
主:10.0.7.103從:10.0.7.104
爲了方便實驗,兩臺機器都各自加一塊20G的硬盤
[root@localhost~]#vim/etc/hosts
10.0.7.103node1
10.0.7.104node2
然後將剛剛添加的一塊硬盤sdb分區並格式化(步驟略)
[root@node1~]#mkdir/qq
[root@node1~]#mount/dev/sdb1/qq(還要寫到/etc/fstab裏面,不然重啓無效)
[root@node1~]#init6
安裝開始 yum -y install kernel-devel kernel-headers flex 注意:安裝kernel-devel一定要和你uname -r 看到的內核版本一致,建議kernel-devel用本地源安裝,不要用網絡源安裝 [root@node1 soft]# tar zxf drbd-8.4.3.tar.gz [root@node1 soft]# cd drbd-8.4.3 [root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km 注意:--with-km是啓用內核模塊 [root@node1 ~]# make KDIR=/usr/src/kernels/2.6.32-358.el6.i686 注意KDIR的路徑 (這個內核源碼路徑需要根據自己的系統修改) [root@node1 drbd-8.4.3]# make install [root@node1 ~]# mkdir -p /usr/local/drbd/var/run/drbd [root@node1 ~]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/ [root@node1 ~]# chkconfig --add drbd [root@node1 ~]# chkconfig drbd on 安裝drbd模塊 回到剛剛解壓drbd的目錄,然後 [root@node1 drbd-8.4.3]# cd drbd [root@node1 drbd]# make clean [root@node1drbd]# make KDIR=/usr/src/kernels/2.6.32-358.el6.i686 [root@node1 drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/ [root@node1 drbd]# modprobe drbd 查看模塊是否加載成功 [root@node1 drbd]# lsmod | grep drbd drbd 292307 0 libcrc32c 841 1 drbd
##################################配置################################## 官方文檔介紹:http://www.drbd.org/users-guide-8.4/ 查看drbd的主配置文件 [root@node1 etc]# pwd /usr/local/drbd/etc [root@node1 etc]# cat drbd.conf # You can find an example in /usr/share/doc/drbd.../drbd.conf.example include "drbd.d/global_common.conf"; include "drbd.d/*.res"; 由此可見:主配置文件裏面已經包含了全局配置文件和drbd目錄下以.res結尾的文件 修改全局配置文件: [root@node1 drbd.d]# pwd /usr/local/drbd/etc/drbd.d [root@node1 drbd.d]# ls global_common.conf 配置文件內容如下: [root@node1 drbd.d]# cat global_common.conf global { usage-count yes; #是否參加drbd的使用者統計,默認此選項爲yes # minor-count dialog-refresh disable-ip-verification } common { protocol C; #使用drbd的同步協議 handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. 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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options { # cpu-mask on-no-data-accessible } disk { on-io-error detach; #配置I/O錯誤處理策略爲分離 # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout } net { # protocol timeout max-epoch-size max-buffers unplug-watermark # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle } syncer { rate 1024M; #設置主備節點同步時的網絡速率 } } ##########################資源配置文件配置如下 需自己新建#################### [root@node1 ~]# vim /usr/local/drbd/etc/drbd.d/drbd.res resource r1 { #這個r1是定義資源的名字 on node1 { #on開頭,後面是主機名稱 device /dev/drbd0; #drbd設備名稱 disk /dev/sdb1; #drbd0使用的磁盤分區爲sdb1 address 10.0.0.105:7789; #設置drbd監聽地址與端口 meta-disk internal; } on node2 { #on開頭,後面是主機名稱 device /dev/drbd0; #drbd設備名稱 disk /dev/sdb1; #drbd0使用的磁盤分區爲sdb1 address 10.0.0.106:7789; #設置drbd監聽地址與端口 meta-disk internal; } }
##################################################################### 在node1上初始化資源 [root@node1 ~]# drbdadm create-md r1 啓動服務 [root@node1 ~]# service drbd start 查看drbd監聽端口: [root@node1 ~]# netstat -anput|grep 7789 tcp 0 0 10.0.0.105:7789 0.0.0.0:* LISTEN - tcp 0 0 10.0.0.105:55715 10.0.0.106:7789 TIME_WAIT - tcp 0 0 10.0.0.105:41264 10.0.0.106:7789 TIME_WAIT 注意:第一次啓動drbd時,兩個drbd節點默認都處於Secondary狀態, [root@node1 ~]# drbdadm role r1 Secondary/Secondary 由於默認沒有主次節點之分,因而需要設置兩個主機的主次節點,選擇需要設置爲主節點的主機,然後執行如下命令: [root@node1 /]# drbdadm -- --overwrite-data-of-peer primary all 第一次執行完此命令後,在後面如果需要設置哪個是主節點時,就可以使用另外一個命令:drbdadm primary r1 (這個r1是定義資源的角色)或者drbdadm primary all
查看資源的連接狀態 [root@node1 ~]# drbdadm cstate r1 Connected 資源的連接狀態;一個資源可能有以下連接狀態中的一種 StandAlone 獨立的:網絡配置不可用;資源還沒有被連接或是被管理斷開(使用 drbdadm disconnect 命令),或是由於出現認證失敗或是腦裂的情況 Disconnecting 斷開:斷開只是臨時狀態,下一個狀態是StandAlone獨立的 Unconnected 懸空:是嘗試連接前的臨時狀態,可能下一個狀態爲WFconnection和WFReportParams Timeout 超時:與對等節點連接超時,也是臨時狀態,下一個狀態爲Unconected懸空 BrokerPipe:與對等節點連接丟失,也是臨時狀態,下一個狀態爲Unconected懸空 NetworkFailure:與對等節點推動連接後的臨時狀態,下一個狀態爲Unconected懸空 ProtocolError:與對等節點推動連接後的臨時狀態,下一個狀態爲Unconected懸空 TearDown 拆解:臨時狀態,對等節點關閉,下一個狀態爲Unconected懸空 WFConnection:等待和對等節點建立網絡連接 WFReportParams:已經建立TCP連接,本節點等待從對等節點傳來的第一個網絡包 Connected 連接:DRBD已經建立連接,數據鏡像現在可用,節點處於正常狀態 StartingSyncS:完全同步,有管理員發起的剛剛開始同步,未來可能的狀態爲SyncSource或PausedSyncS StartingSyncT:完全同步,有管理員發起的剛剛開始同步,下一狀態爲WFSyncUUID WFBitMapS:部分同步剛剛開始,下一步可能的狀態爲SyncSource或PausedSyncS WFBitMapT:部分同步剛剛開始,下一步可能的狀態爲WFSyncUUID WFSyncUUID:同步即將開始,下一步可能的狀態爲SyncTarget或PausedSyncT SyncSource:以本節點爲同步源的同步正在進行 SyncTarget:以本節點爲同步目標的同步正在進行 PausedSyncS:以本地節點是一個持續同步的源,但是目前同步已經暫停,可能是因爲另外一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步 PausedSyncT:以本地節點爲持續同步的目標,但是目前同步已經暫停,這可以是因爲另外一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步 VerifyS:以本地節點爲驗證源的線上設備驗證正在執行 VerifyT:以本地節點爲驗證目標的線上設備驗證正在執行 查看資源角色的命令 [root@node1 ~]# drbdadm role r1 Primary/Secondary (在前面爲當前節點) Parimary 主:資源目前爲主,並且可能正在被讀取或寫入,如果不是雙主只會出現在兩個節點中的其中一個節點上 Secondary 次:資源目前爲次,正常接收對等節點的更新 Unknown 未知:資源角色目前未知,本地的資源不會出現這種狀態 查看硬盤狀態 [root@node1 ~]# drbdadm dstate r1 UpToDate/UpToDate 本地和對等節點的硬盤有可能爲下列狀態之一: Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤導致自動分離 Attaching:讀取無數據時候的瞬間狀態 Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態爲Diskless無盤 Negotiating:在已經連接的DRBD設置進行Attach讀取無數據前的瞬間狀態 Inconsistent:數據是不一致的,在兩個節點上(初始的完全同步前)這種狀態出現後立即創建一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態 Outdated:數據資源是一致的,但是已經過時 DUnknown:當對等節點網絡連接不可用時出現這種狀態 Consistent:一個沒有連接的節點數據一致,當建立連接時,它決定數據是UpToDate或是Outdated UpToDate:一致的最新的數據狀態,這個狀態爲正常狀態 查看同步進度 [root@node1 ~]# cat /proc/drbd 或者 執行/usr/local/drbd/sbin/drbd-overview version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected], 2016-04-24 20:16:24 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:2767088 nr:0 dw:0 dr:2774680 al:0 bm:168 lo:0 pe:1 ua:7 ap:0 ep:1 wo:f oos:18202972 [=>..................] sync'ed: 13.3% (17776/20476)M finish: 0:12:59 speed: 23,344 (22,492) K/sec 由此可見:進度已經完成了13.3%,傳輸速度大概22M/S 注: ds是磁盤狀態信息 dw是磁盤寫信息 dr是磁盤讀信息
###########################測試驗證################################### 格式化文件系統(文件格式根據自己的系統環境選擇) [root@node1 ~]# mkfs.ext4 /dev/drbd0 掛載此文件系統 [root@node1 ~]# mkdir /data [root@node1 ~]# mount /dev/drbd0 /data/ 在掛載data目錄中創建一個測試文件,然後卸載掛載目錄,然後切換主備節點,在備用節點上查看剛剛建立的測試文件還是否存在 Node1: [root@node1 ~]# mkdir /data/test [root@node1 ~]# umount /data/ 將node1變爲備用節點 [root@node1 ~]# drbdadm secondary r1 [root@node1 ~]# drbdadm role r1 Secondary/Secondary Node2上: 將node2變爲主節點 [root@node2 ~]# drbdadm primary r1 [root@node2 ~]# drbdadm role r1 Primary/Secondary 掛載設備,然後看文件是否存在 [root@node2 ~]# mount /dev/drbd0 /mnt/ [root@node2 ~]# cd /mnt/ [root@node2 mnt]# ls test OK! 到這裏已經算是完成了!
##################################報錯信息########################################### 報錯1: configure: error: Cannot build utils without flex, either install flex or pass the --without-utils option. 解決辦法: yum -y intalls flex 報錯2: make: [check-kdir] error 1 解決辦法:yum install -y kernel-devel 報錯3: SORRY, kernel makefile not found. You need to tell me a correct KDIR, Or install the neccessary kernel source packages. 報錯4:'drbd' not defined in your config (for this host). 這個因爲沒有加載到drbd模塊 啓動報錯: Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40 這是因爲sdb1已經有文件系統了,已經有數據存在了 解決方法: [root@node1 ~]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1 請檢查這個KDIR目錄指的路徑是否正確 ##############################################################################################################################################################