一、 什麼是DRBD?
DRBD是由內核模塊和相關腳本構成, 用以構建高可用的集羣, 其實現方式是通過網絡來鏡像整個設備. 它允許用戶在遠程機器上建立一個本地設備的實時鏡像, 可以把它看成一個網絡RAID 1.
二、 工作原理
DRBD負責接收數據, 把數據寫到本地磁盤, 然後發送給另一個主機. 另一個主機再將數據存到自己的硬盤中;
DRBD每次只允許一個節點進行讀寫訪問, 這對於通常的故障切換高可用集羣已經夠了;
DRBD協議:
協議A: 數據一旦寫入磁盤併發送到網絡中就認爲完成了寫入操作;
協議B: 收到接受確認就認爲完成了寫入操作;
協議C: 收到寫入確認就完成了寫入操作;
DRBD的三個進程:
drbd0--worker: 主進程
drbd0--asender: primary上drbd0的數據發送進程
drbd0--receiver: secondary上drbd0的數據接受進程
三、 DRBD安裝
1. 實驗拓撲
2. 實驗環境
虛擬機環境: CentOS release 6.6 (Final) 主服務器IP: 192.168.15.11(Centos1) 備服務器IP: 192.168.15.12(Centos2) 軟 件 包: drbd-8.4.3.tar.gz 兩臺主機個添加一塊硬盤, 分區爲/dev/sdb1, 並且格式化; 關閉iptables與selinux防火牆
3. 添加本地host(兩臺主機都添加);
[root@Node1 ~]# vim /etc/hosts ………………/省略 192.168.15.11 Node1 192.168.15.12 Node2
4. 節點直接實現ssh無祕鑰通信(兩臺主機設置爲無祕鑰通信);
[root@Node1 ~]# ssh-keygen -t rsa [root@Node1 ~]# scp .ssh/id_rsa.pub [email protected]:/root
5. 安裝依賴包和環境;
[root@Node1 ~]# yum -y install gcc kernel-devel kernel-headers flex perl ####建議使用本地yum源安裝;
6. 下載DRBD(/http://oss.linbit.com), 並安裝;
[root@Node1 ~]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz [root@Node1 ~]# tar -zxvf drbd-8.4.3.tar.gz [root@Node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km ### --prefix是制定安裝路徑,--with-km是啓用內核模塊; [root@Node1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64 ### KDIR指的是自己的內核路徑; [root@Node1 drbd-8.4.3]# make install [root@Node1 drbd-8.4.3]# mkdir -p /usr/local/drbd/var/run/drbd ### 這裏必須創建則這個目錄, 不然啓動會報錯; [root@Node1 drbd-8.4.3]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/ ###將drbd拷貝到/etc/init.d/目錄下; [root@Node1 drbd-8.4.3]# chkconfig --add drbd # 將drbd添加到系統服務中; [root@Node1 drbd-8.4.3]# chkconfig drbd on # 實現drbd實現開機自啓; [root@Node1 drbd-8.4.3]# cd drbd [root@Node1 drbd]# make clean [root@Node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/ #安裝drbd模塊; [root@Node1 drbd]# cp drbd.ko /lib/modules/2.6.32-358.el6.x86_64/kernel/lib/ [root@Node1 drbd]# modprobe drbd # 加載內核模塊; [root@Node1 drbd]# lsmod | grep drbd
[root@Node2 drbd]# lsmod | grep drbd
7. 配置DRBD;
[root@Node1 drbd]# cd /usr/local/drbd/etc/drbd.d/ drbd的主配置文件爲/usr/local/drbd/etc/drbd.conf, 爲了管理的便捷性, 目前通常會將這些配置文件分成多個部分; 且都保存只/usr/local/drbd/etc/drbd.d/目錄中, 主配置文件中僅使用"include"指令將這些配置文件片斷整合起來; [root@Node1 drbd.d]# cp global_common.conf global_common.conf.bak #備份 [root@Node1 drbd.d]# vi global_common.conf global { usage-count yes; #是否參加drbd的使用者統計, 默認爲yes # minor-count dialog-refresh disable-ip-verification } common { protocol C; #使用協議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"; ###一旦本地io錯誤的處理是關機 } disk { on-io-error detach; #配置I/O錯誤處理策略爲分離; rate 50M; #設置主備節點同步時的網絡速率; } net { cram-hmac-alg "sha1"; #DRBD同步時使用的驗證方式和密碼信息; shared-secret "drbd"; # 消息摘要認證密鑰 } [root@Node1 drbd.d]# scp global_common.conf [email protected]:/usr/local/drbd/etc/drbd.d
8. 定義一個資源drbd.res文件;
[root@Node1 drbd.d]# pwd /usr/local/drbd/etc/drbd.d [root@Node1 drbd.d]# vim drbd.res resource drbd { #定義的資源名稱; on Node1 { #on後面是主機名; address 192.168.15.11:7801; #設置DRBD的監聽端口, 用於與另一臺主機通信; device /dev/drbd0; #DRBD設備名稱; disk /dev/sdb1; #drbd使用的磁盤分區爲/dev/sdb1; meta-disk internal; #DRBD的元數據存放方式; } on Node2 { address 192.168.15.12:7801; device /deb/drbd0; disk /dev/sdb1; meta-disk internal; } } [root@Node1 drbd.d]# scp drbd.res [email protected]:/usr/local/drbd/etc/drbd.d 以上文件(global_common.conf和drbd.res)在兩個節點上必須相同, 因此, 可以基於ssh將剛纔配置的文件全部同步到另外一個節點;
9. 初始化資源並啓動服務;
[root@Node1 drbd.d]# drbdadm create-md drbd Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40 #報錯 ↑ #解決方案: 使用dd指令將一些資料塞到/dev/sdb1, 然後在執行drdbadm; [root@Node1 drbd.d]# dd if=/dev/zero of=/dev/sdb1 bs=1KB count=100 [root@Node1 drbd.d]# drbdadm create-md drbd
[root@Node1 drbd.d]# service drbd start #啓動DRBD服務;
[root@Node2 drbd.d]# dd if=/dev/zero of=/dev/sdb1 bs=1KB count=10 [root@Node2 drbd.d]# drbdadm create-md drbd [root@Node2 drbd.d]# service drbd start
[root@Node1 drbd.d]# service drbd start [root@Node1 drbd.d]# netstat -anpt | grep 7789 #查看監聽端口;
[root@Node2 drbd.d]# netstat -anpt | grep 7789
[root@Node1 drbd.d]# cat /proc/drbd #查看啓動狀態;
[root@Node1 drbd.d]# cat /proc/drbd
從上面信息可以看出此時兩個節點均處於Secondary狀態, 於是, 接下來需要將其中一個節點設置爲Primary狀態.
ro: 第一個啓動drbd時, 兩個節點默認都處於Secondary狀態;
ns: 網絡發送的數據包信息;
dw:磁盤寫信息;
dr: 磁盤讀信息;
10. 設置主用節點(將Node1設置爲主節點);
由於默認沒有主次節點之分, 因此需要設置主機的主次節點,選擇主機節點執行以下命令: [root@Node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary all [root@Node1 drbd.d]# cat /proc/drbd
[root@Node2 drbd.d]# cat /proc/drbd
11. 創建文件系統;
文件系統的掛載只能在Primary節點進行, 因此, 也只有設置了主節點後纔可以對drbd設備進行格式化; [root@Node1 drbd.d]# mkfs.ext3 -j -L DRBD /dev/drbd0 [root@Node1 drbd.d]# mkdir /mydrbd/ [root@Node1 drbd.d]# mount /dev/drbd0 /mydrbd/ [root@Node1 drbd.]# df -h
[root@Node1 ~]# ll /mydrbd/
ps: Node2節點無法掛載/dev/drbd0, 因爲處於Secondary狀態
12. 對主Primary/Secondary模型的drbd服務來講, 在某個時刻只能有一個節點爲Primary, 因此要切換兩個節點的角色, 只能先將原有的Primary節點設置爲Secondary後,Node2節點設置爲Primary才能掛載.
###ON Node1
[root@Node1 ~]# cp /etc/inittab /mydrbd/ [root@Node1 ~]# ll /mydrbd/
[root@Node1 ~]# umount /mydrbd/ [root@Node1 ~]# drbdadm secondary drbd #設置drbd狀態爲Secondary狀態; [root@Node1 ~]# cat /proc/drbd
##ON Node2 #設置Node2的drbd爲Primary [root@Node2 ~]# drbdadm primary drbd [root@Node2 ~]# cat /proc/drbd
[root@Node2 ~]# mkdir /mydrbd/ [root@Node2 ~]# mount /dev/drbd0 /mydrbd/ [root@Node2 ~]# ls -l /mydrbd/
ps: 可以看到已經複製到node2節點上.. 如果將node2設置爲secondary狀態, 第一步卸載/dev/drbd0掛載點, 第二步執行drbdadm secondary drbd, 第三步node1執行drbdadm primary drbd, 第四步掛載/dev/drbd0
此文章參考別人加上後期修改而成.