磁盤鏡像技術DRBD
什么是DRBD
DRBD是由內(nèi)核模塊和相關腳本構成,用以構建高可用性的集群。其實現(xiàn)方式是通過網(wǎng)絡來鏡像整個設備。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。也可以把它看成一個網(wǎng)絡RAID1
工作原理:
DRBD負責接收數(shù)據(jù),把數(shù)據(jù)寫到本地磁盤,然后發(fā)送給另一個主機。另一個主機再將數(shù)據(jù)存到自己的磁盤中。目前,DRBD每次只允許對一個節(jié)點進行讀寫訪問,這對于通常的故障切換高可用性集群已經(jīng)夠了。
DRBD協(xié)議:
A:數(shù)據(jù)一旦寫入磁盤并發(fā)送到網(wǎng)絡中就認為完成了寫入操作
B:收到接受確認就認為完成了寫入操作
C:收到寫入確認就完成了寫入操作
目前運用最多的就是C協(xié)議
DRBD的三個進程:
drbd0——worker:主進程
drbd0——asender:primary上drbd0的數(shù)據(jù)發(fā)送進程
drbd0——receiver;secondary上drbd0的數(shù)據(jù)接受進程
配置DRBD前需要注意幾點:
mount drbd設備以前必須把設備切換到primary狀態(tài)
兩個節(jié)點中,同一時刻只能有一臺處于primary狀態(tài),另一臺處于secondary狀態(tài),處于secondary狀態(tài)的服務器上不能加載drbd設備。主備服務器同步的兩個分區(qū)大小最好相同,這樣不至于浪費磁盤空間,因為drbd鏡像相當于網(wǎng)絡raid1
前提:
1)本配置共有兩個測試節(jié)點,分別master-drbd和slave-drbd ,相的IP地址分別為192.168.32.200和192.168.32.202;
2)master-drbd和slave-drbd兩個節(jié)點上各提供了一個大小相同的分區(qū)作為drbd設備;我們這里為在兩個節(jié)點上均為/dev/sdb1,大小為20GB;
3)系統(tǒng)為centos6.5平臺;
4)內(nèi)核:2.6.32-431.el6.x86_64
兩個節(jié)點的主機名稱和對應的IP地址解析服務可以正常工作,且每個節(jié)點的主機名稱需要跟"uname -n“命令的結果保持一致;因此,需要保證兩個節(jié)點上的/etc/hosts文件均為下面的內(nèi)容:
192.168.32.200 master-drbd
192.168.32.202 slave-drbd
wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
drbd共有兩部分組成:內(nèi)核模塊和用戶空間的管理工具。
首先確認他的內(nèi)核版本
[root@master-drbd drbd.d]# uname -r
2.6.32-431.el6.x86_64
然后掛載光盤
mount /dev/sr0 /media/ #這里因為是虛擬機,所以他的系統(tǒng)盤就叫sr0
cd /media/Packages/
rpm -ivh flex-2.5.35-9.el6.x86_64 kernel-devel-2.6.32-431.el6.x86_64 kernel-headers-2.6.32-504.3.3.el6.x86_64
tar zxvf drbd-8.4.1.tar.gz
cd drbd-8.4.1
./configure –prefix=/usr/loca/drbd –with-km #–prefix是制定安裝路徑。–with-km是啟用內(nèi)核模塊
make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/ #KDIR指的是自己的內(nèi)核路徑
make install
mkdir -p /usr/local/drbd/var/run/drbd #這里必須創(chuàng)建這個目錄,不然啟動服務會報錯
cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
chkconfig –add drbd
chkconfig drbd on
接下來安裝drbd模塊
cd drbd
make clean
make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/
cp drbd.ko /lib/modules/2.6.32-431.el6.x86_64/kernel/lib/
moprobe drbd #加載內(nèi)核模塊
lsmod | grep drbd
drbd 303476 0
libcrc32c 1246 1 drbd
drbd的主配置文件為/usr/local/drbd/etc/drbd.conf;為了管理的便捷性,目前通常會將些配置文件分成多個部分,
且都保存至/usr/local/drbd/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。
通常,/etc/drbd.d目錄中的配置文件為global_common.conf和所有以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每一個.res的文件用于定義一個資源。
resource段則用于定義drbd資源,每個資源通常定義在一個單獨的位于/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須為其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯(lián)至的節(jié)點,其它參數(shù)均可以從common段或drbd的默認中進行繼承而無須定義。
下面的操作在master-drbd上完成。
1)配置global-common.conf
global {
usage-count no;#是否參加drbd的使用者統(tǒng)計,默認為yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;#使用drbd的同步協(xié)議
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;
#degr-wfc-timeout 120;
}
disk {
on-io-error detach;#配置I/O錯誤處理策略為分離
rate 50M;#設置主備節(jié)點同步時的網(wǎng)絡速率
}
net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab";
}
}
2)定義一個資源drbd.res,內(nèi)容如下:
resource r0 { #r0是定義資源的名字
on master-drbd { #on后面是主機名稱
address 192.168.32.200:7801;#設置DRBD的監(jiān)聽端口,用于與另一臺主機通信。
volume 0 {
device /dev/drbd0; #drbd設備名稱
disk /dev/sdb1; #drbd使用的磁盤分區(qū)為sdb1
meta-disk internal;
}
}
on slave-drbd {
address 192.168.32.202:7801;
volume 0 {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
}
}
}
以上文件在兩個節(jié)點上必須相同,因此,可以基于ssh將剛才配置的文件全部同步至另外一個節(jié)點。
1)啟動服務,在master-drbd和slave-drbd上分別執(zhí)行:
/etc/init.d/drbd start
2)查看啟動狀態(tài):
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
0: 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:505964
也可以使用drbd-overview命令來查看:
3)查看監(jiān)聽端口
[root@master-drbd drbd.d]# netstat -lanput | grep 7801
tcp 0 0 192.168.32.200:7801 192.168.32.202:34061 ESTABLISHED –
tcp 0 0 192.168.32.200:59747 192.168.32.202:7801 ESTABLISHED –
4)從上面的信息中可以看出此時兩個節(jié)點均處于Secondary狀態(tài)。于是,我們接下來需要將其中一個節(jié)點設置為Primary。在要設置為Primary的節(jié)點上執(zhí)行如下命令:
#drbdsetup primary all
注: 也可以在要設置為Primary的節(jié)點上使用如下命令來設置主節(jié)點:
drbdadm — –overwrite-data-of-peer primary r0
而后再次查看狀態(tài),可以發(fā)現(xiàn)數(shù)據(jù)同步過程已經(jīng)開始:
# drbd-overview
0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C r—-
[============>…….] sync'ed: 66.2% (172140/505964)K delay_probe: 35
等數(shù)據(jù)同步完成以后再次查看狀態(tài),可以發(fā)現(xiàn)節(jié)點已經(jīng)牌實時狀態(tài),且節(jié)點已經(jīng)有了主次:
# drbd-overview
0:r0 Connected Primary/Secondary UpToDate/UpToDate C r—-
mkfs.ext4 /dev/drbd0
mkdir /data #創(chuàng)建掛載目錄
mount /dev/drbd0 /data#掛載文件系統(tǒng)
df -h #查看掛載
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 18G 1.7G 15G 10% /
tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 485M 34M 426M 8% /boot
/dev/drbd0 20G 182M 19G 1% /data
注意:文件系統(tǒng)的掛載只能在Primary節(jié)點進行,因此,也只有在設置了主節(jié)點后才能對drbd設備進行格式化:
cd /data
dd if=/dev/zero of=test bs=1M count=10 #創(chuàng)建一個10M的文件
[root@slave-drbd data]# ll
total 10256
-rw-r–r– 1 root root 10485760 Jan 10 01:54 1.txt
drwx—— 2 root root 16384 Jan 10 01:53 lost+found
對主Primary/Secondary模型的drbd服務來講,在某個時刻只能有一個節(jié)點為Primary,因此,要切換兩個節(jié)點的角色,
只能在先將原有的Primary節(jié)點設置為Secondary后,才能原來的Secondary節(jié)點設置為Primary:
master-drbd:
drbdadm secondary all
查看 狀態(tài)
cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@localhost.localdomain, 2015-01-10 04:56:32
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—–
ns:21011460 nr:24 dw:473584 dr:20539309 al:137 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
slave-drbd:
drbdadm primary all
[root@slave-drbd ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@puppet-client, 2015-01-23 20:48:04
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
ns:24 nr:21011460 dw:21011484 dr:1021 al:3 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
mkdir /data
mount /dev/drbd0 /data
使用下面的命令查看在此前在主節(jié)點上復制至此設備的文件是否存在:
[root@slave-drbd data]# ll
total 10256
-rw-r–r– 1 root root 10485760 Jan 10 01:54 1.txt
drwx—— 2 root root 16384 Jan 10 01:53 lost+found
drbd 8.4中第一次設置某節(jié)點成為主節(jié)點的命令
# drbdadm primary –force resource
參考文獻:存儲高可用——DRBD單主模式的搭建 – 時間煮雨 – 51CTO技術博客
http://watchman110.blog.51cto.com/9194028/1608052
CentOS 6.4下DRBD 安裝配置_服務器應用_Linux公社-Linux系統(tǒng)門戶網(wǎng)站
http://www.linuxidc.com/Linux/2013-09/90536.htm
模擬腦裂:DRBD腦裂 – 大臉貓的日志 – 網(wǎng)易博客
http://zhangmaojun023.blog.163.com/blog/static/10919584620128270550813/
drbd注意事項參考:drbd注意事項_迷失de墻角_新浪博客
http://blog.sina.com.cn/s/blog_75a07c3b0101k4cg.html