DRBD,即Distributed Replicated Block Device分布式複制塊裝置。它是被設計成建構高可用叢集(HA)的一個建構元件的塊裝置。它通過網絡實作塊裝置資料實時鏡像。DRBD可以被了解為一種基于網絡的raid-1。
從概述來看,DRBD有以下幾個特點
l DRBD是一種塊裝置
2 可用于高可用叢集中(HA)
3 通過網絡實作塊裝置資料實時鏡像
4 類似于一個網絡的raid-1
工作特點:
l DRBD工作在核心空間,它鏡像複制的是二進制資料,這也是它速度快的根本原因
2 DRBD至少需要兩個節點來工作。
如上圖所示,左右兩部分相當于兩台伺服器,黑色箭頭代表了各個核心元件之間的資料流方向。橙色箭頭代表了通過網絡實作的從本地節點到遠端節點的實時塊裝置資料流方向。
<a href="http://s3.51cto.com/wyfs02/M00/6D/0C/wKiom1VaxgOxh2yJAAGU4_N1x28956.jpg" target="_blank"></a>
DRBD的三種複制模式:
l 協定A
即 異步複制協定。當本地磁盤寫入完成,并且拷貝資料包進入本地TCP發送緩沖區裡後,就認為在主節點的本地寫操作完成。這種模式,在發生強制故障轉移的時候可能發生資料丢失的現象。協定A常用在長距離複制環境中。當它和DRBD代理結合使用的時候,它成為一個有效的災難恢複解決方案。
l 協定B
即 記憶體同步複制協定。當本地磁盤寫入發生,并且拷貝資料包到達對等層節點時,就認為在主節點中的本地寫操作完成。正常情況下,在故障轉移事件中,寫入的資料不會丢失。然而,如果節點同時停電,主節點的資料存儲将發生不可逆的損壞,大部分最近在主節點中寫入完成的資料可能會丢失。
l 協定C
即 同步複制協定。隻有當本地磁盤和遠端磁盤都确認寫入完成時,就認為在主節點的本地寫操作完成。結果,即使一個節點崩潰,也不會丢失任何資料。唯一丢失資料的可能是兩個節點同時崩潰。
到目前為止,協定C是安裝DRBD是最常使用的複制協定。在部署DRBD是可以根據安
<a href="http://s3.51cto.com/wyfs02/M01/6D/07/wKioL1Vax5KxnaCdAAIEAxFcV5g936.jpg" target="_blank"></a>
從圖中可以看出,DRBD是作為排程伺服器的存儲高可用套件來實作資料的在排程伺服器保持同步,完成相關的業務服務。
系統環境: centos-6.4 64bit
drbd: drbd-8.4.4.tar.gz
第一步:在如下網站下載下傳源碼包(本次采用Version drbd-8.4.4)
源碼下載下傳位址: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安裝完成。
主備兩台都如上安裝。
基本的主備配置主伺服器:
檢視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結尾的檔案
修改全局配置檔案:
/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開頭,後面是主機名稱
disk /dev/xvdb1; #drbd0使用的磁盤分區為xvdb1
address 10.243.29.65:7789; #設定drbd監聽位址與端口
}
備伺服器配置:(同上)
主備啟動服務:
在啟動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
在兩個節點啟動服務
#/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-----
檢視同步狀态:
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
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
服務切換方式:
關閉主節點服務,此時挂載的drbd分區就自動在主節點解除安裝了,然後在備用節點執行切換指令:
#drbdsetup /dev/drbd0 primary --o
#drbdadm primary all
軟體解除安裝
直接make uninstall,然後
make clean
本文轉自zsaisai 51CTO部落格,原文連結:http://blog.51cto.com/3402313/1652739