1、 什麼是DRBD? node
DRBD是由內核模塊和相關腳本構成, 用以構建高可用的集羣, 其實現方式是經過網絡來鏡像整個設備. 它容許用戶在遠程機器上創建一個本地設備的實時鏡像, 能夠把它當作一個網絡RAID 1.linux
2、 工做原理vim
DRBD負責接收數據, 把數據寫到本地磁盤, 而後發送給另外一個主機. 另外一個主機再將數據存到本身的硬盤中;bash
DRBD每次只容許一個節點進行讀寫訪問, 這對於一般的故障切換高可用集羣已經夠了;服務器
DRBD協議:網絡
協議A: 數據一旦寫入磁盤併發送到網絡中就認爲完成了寫入操做;併發
協議B: 收到接受確認就認爲完成了寫入操做;ssh
協議C: 收到寫入確認就完成了寫入操做;ide
DRBD的三個進程:flex
drbd0--worker: 主進程
drbd0--asender: primary上drbd0的數據發送進程
drbd0--receiver: secondary上drbd0的數據接受進程
3、 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 root@192.168.15.12:/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 root@192.168.15.12:/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 root@192.168.15.12:/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
此文章參考別人加上後期修改而成.