1 概述
1.1 DRBD簡介
DRBD,即Distributed Replicated Block Device分佈式複製塊設備。它是被設計成構建高可用集羣(HA)的一個構建組件的塊設備。它通過網絡實現塊設備數據實時鏡像。DRBD可以被理解爲一種基於網絡的raid-1。
從概述來看,DRBD有以下幾個特點
l DRBD是一種塊設備
2 可用於高可用集羣中(HA)
3 通過網絡實現塊設備數據實時鏡像
4 類似於一個網絡的raid-1
工作特點:
l DRBD工作在內核空間,它鏡像複製的是二進制數據,這也是它速度快的根本原因
2 DRBD至少需要兩個節點來工作。
1.1 DRBD工作原理
如上圖所示,左右兩部分相當於兩臺服務器,黑色箭頭代表了各個內核組件之間的數據流方向。橙色箭頭代表了通過網絡實現的從本地節點到遠程節點的實時塊設備數據流方向。
DRBD的三種複製模式:
l 協議A
即 異步複製協議。當本地磁盤寫入完成,並且拷貝數據包進入本地TCP發送緩衝區裏後,就認爲在主節點的本地寫操作完成。這種模式,在發生強制故障轉移的時候可能發生數據丟失的現象。協議A常用在長距離複製環境中。當它和DRBD代理結合使用的時候,它成爲一個有效的災難恢復解決方案。
l 協議B
即 內存同步複製協議。當本地磁盤寫入發生,並且拷貝數據包到達對等層節點時,就認爲在主節點中的本地寫操作完成。正常情況下,在故障轉移事件中,寫入的數據不會丟失。然而,如果節點同時停電,主節點的數據存儲將發生不可逆的損壞,大部分最近在主節點中寫入完成的數據可能會丟失。
l 協議C
即 同步複製協議。只有當本地磁盤和遠程磁盤都確認寫入完成時,就認爲在主節點的本地寫操作完成。結果,即使一個節點崩潰,也不會丟失任何數據。唯一丟失數據的可能是兩個節點同時崩潰。
到目前爲止,協議C是安裝DRBD是最常使用的複製協議。在部署DRBD是可以根據安
1.2 DRBD在高可用中體系結構
從圖中可以看出,DRBD是作爲調度服務器的存儲高可用套件來實現數據的在調度服務器保持同步,完成相關的業務服務。
1.3 安裝
系統環境: centos-6.4 64bit
drbd: drbd-8.4.4.tar.gz
第一步:在如下網站下載源碼包(本次採用Version drbd-8.4.4)
DRBD的官方網站爲:http://www.drbd.org/
源碼下載地址:http://oss.linbit.com/drbd/
在此之前。請安裝一下一些簡單的工具
yum install -y kernel-devel
推薦源碼安裝:
tar xvf drbd-8.4.4.tar.gz
./configure --prefix=/usr/local/drbd --with-km 生成drbd.ko文件
make KDIR=/usr/src/kernels/2.6.32-131.0.15.el6.x86_64 內核版本根據具體情況
make install
cp drbd/drbd.ko /lib/modules/`uname -r`/kernel/lib/
# modprobe drbd
查看模塊是否加載成功
# lsmod | grep drbd
drbd 344534 0
libcrc32c 1180 1 drbd cp
設置開機啓動
cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
chkconfig --add drbd
chkconfig drbd on
mkdir -p /usr/local/drbd/var/run/drbd 添加必要運行目錄
到此drbd安裝完成。
主備兩臺都如上安裝。
1.4 配置
基本的主備配置主服務器:
查看drbd的主配置文件
# pwd
/usr/local/drbd/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結尾的文件
修改全局配置文件:
# pwd
/usr/local/drbd/etc/drbd.d
# ls
global_common.conf
配置文件內容如下修改(紅色新增):
# 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; #設置主備節點同步時的網絡速率
}
}
資源配置文件配置如下需自己新建,這是關鍵
# vim /usr/local/drbd/etc/drbd.d/drbd.res
resource r1 { #這個r1是定義資源的名字
on rh10 { #on開頭,後面是主機名稱
device /dev/drbd0; #drbd設備名稱
disk /dev/xvdb1; #drbd0使用的磁盤分區爲xvdb1
address 10.243.29.64:7789; #設置drbd監聽地址與端口
meta-disk internal;
}
on rh11 { #on開頭,後面是主機名稱
device /dev/drbd0; #drbd設備名稱
disk /dev/xvdb1; #drbd0使用的磁盤分區爲xvdb1
address 10.243.29.65:7789; #設置drbd監聽地址與端口
meta-disk internal;
}
}
備服務器配置:(同上)
主備啓動服務:
在啓動DRBD之前,你需要分別在兩臺主機上創建供DRBD記錄信息的數據塊.分別在兩臺主機上執行:
# drbdadm create-md r0 或者執行drbdadm create-md all
# drbdadm create-md r0
如果遇到no resourcedefind可以指定配置文件位置
drbdadm -c /usr/local/drbd/etc/drbd.conf create-md r0
如果提示:Command 'drbdmeta 0 v08 /dev/sdc7 internal create-md' terminated with exit coolcode 40
運行如下命令清除元數據,重新執行
# dd if=/dev/zero bs=1M count=1 of=/dev/xvdb1
如果已經配置過了重新配置可以將原資源down
Drbdadm down r0
如果遇到腦裂問題如:
0:mfs_store/0 WFConnection Primary/UnknownUpToDate/DUnknown C r-----
從節點上執行:
# drbdadm disconnect r0
# drbdadm secondary r0
# drbdadm --discard-my-data connect r0
# cat /proc/drbd
主節點上執行:
# drbdadm connect r0
# cat /proc/drbd
在兩個節點啓動服務
#/etc/init.d/drbd start
#/etc/init.d/drbd start
最好同時啓動
# netstat -anput|grep 7789
tcp 0 0 10.243.29.64:7789 10.243.29.65:51989 ESTABLISHED
tcp 0 0 10.243.29.64:53835 10.243.29.65:7789 ESTABLISHED
在任意節點查看節點狀態:
[root@drbd1 ~]# cat /proc/drbd
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:2007644
對輸出的含義解釋如下:
ro表示角色信息,第一次啓動drbd時,兩個drbd節點默認都處於Secondary狀態,
ds是磁盤狀態信息,“Inconsistent/Inconsisten”,即爲“不一致/不一致”狀態,表示兩個節點的磁盤數據處於不一致狀態。
Ns表示網絡發送的數據包信息。
Dw是磁盤寫信息
Dr是磁盤讀信息
設置主節點
由於默認沒有主次節點之分,因而需要設置兩個主機的主次節點,選擇需要設置爲主節點的主機,然後執行如下命令:
#drbdsetup /dev/drbd1 primary –o
或者執行下面命令也是可以的
#drbdadm -- --overwrite-data-of-peer primary all
然後可以設置主備了
#/sbin/drbdadm primary r0(主節點)
#/sbin/drbdadm secondary r0(備節點)
查看主備節點
# drbd-overview
0:??not-found?? Connected Secondary/Primary UpToDate/UpToDate C r-----
查看同步狀態:
# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@rh11, 2015-05-12 00:12:42
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
ns:1644176 nr:0 dw:0 dr:1646232 al:0 bm:100 lo:1 pe:10 ua:7 ap:0 ep:1 wo:f oos:19322388
[>...................] sync'ed: 7.9% (18868/20472)M
finish: 0:08:07 speed: 39,640 (36,480) K/sec
從輸出可知:
“ro狀態現在變爲“Primary/Secondary”,“ds”狀態也變爲“UpToDate/Inconsistent”,也就是“實時/不一致”狀態,現在數據正在主備兩個主機的磁盤間進行同步,且同步進度爲7.9%,同步速度每秒3968M左右。
等待片刻,再次查看同步狀態,輸出如下:
[root@rh10 ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@rh10, 2015-05-11 09:47:31
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:20964116 dw:20964116 dr:0 al:0 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
可以看到同步完成了,並且“ds“狀態也變爲“UpToDate/UpToDate”了。即爲“實時/實時”狀態了。
驗證測試:主服務器增加文件
格式化文件系統
#mkfs.ext4 /dev/drbd0
#mount /dev/drbd0 /drbd
如果在從節點,會報錯
[root@rh10 ~]# mkfs.ext4 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
mkfs.ext4: 錯誤的介質類型 while trying to determine filesystem size
[root@rh11 drbd]# ls 增加測試文件,切換後在備服務器是否正確
data.txt lost+found si-tech
主備切換
主備節點切換有兩種方式,分別是停止drbd服務切換和正常切換
正常切換方式:
#drbdadm secondary all(主節點)
#drbdadm primary all(備節點)
最後在備用節點掛載磁盤分區即可:
[root@drbd2 ~]#mount /dev/drbd0 /mnt
[root@rh10 drbd]# ls
data.txt lost+found si-tech
服務切換方式:
關閉主節點服務,此時掛載的drbd分區就自動在主節點卸載了,然後在備用節點執行切換命令:
#drbdsetup /dev/drbd0 primary --o
#drbdadm primary all
1.5 卸載
軟件卸載
直接make uninstall,然後
make clean