2015/04/18 DRBD


一、 什麼是DRBD?  

          DRBD是由內核模塊和相關腳本構成, 用以構建高可用的集羣, 其實現方式是通過網絡來鏡像整個設備. 它允許用戶在遠程機器上建立一個本地設備的實時鏡像, 可以把它看成一個網絡RAID 1.


二、 工作原理

          DRBD負責接收數據, 把數據寫到本地磁盤, 然後發送給另一個主機. 另一個主機再將數據存到自己的硬盤中;

          DRBD每次只允許一個節點進行讀寫訪問, 這對於通常的故障切換高可用集羣已經夠了;

          DRBD協議:

                              協議A: 數據一旦寫入磁盤併發送到網絡中就認爲完成了寫入操作;

                              協議B:  收到接受確認就認爲完成了寫入操作;

                              協議C:  收到寫入確認就完成了寫入操作;

          DRBD的三個進程:

                              drbd0--worker: 主進程

                              drbd0--asender: primary上drbd0的數據發送進程

                              drbd0--receiver: secondary上drbd0的數據接受進程

三、  DRBD安裝

        1. 實驗拓撲

spacer.gifwKioL1UyEFCBvncLAADNc6aKvUY494.jpg

        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

spacer.gifwKiom1UyDxbxsVK_AAA4M31FltU358.jpg

[root@Node2 drbd]# lsmod | grep drbd

wKiom1UyDyzRiOiHAABBdGtkmV0745.jpg


        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

wKiom1UyD0KSJFNyAACd9Fru2v8674.jpg

[root@Node1 drbd.d]# service drbd start               #啓動DRBD服務;

wKioL1UyEKbTvEB1AAIwJ5XC9Lo593.jpg

[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

wKioL1UyEK7jdIbSAACgy4eNMpg826.jpg

[root@Node1 drbd.d]# service drbd start
[root@Node1 drbd.d]# netstat -anpt | grep 7789          #查看監聽端口;

wKiom1UyD2WRPF9AAADPKVaWCbQ428.jpg

[root@Node2 drbd.d]# netstat -anpt | grep 7789

wKioL1UyEMfhIAUcAADOwC5zUEo594.jpg

[root@Node1 drbd.d]# cat /proc/drbd                   #查看啓動狀態;

wKiom1UyD5TDB8yWAAEL4n2BUxU454.jpg

[root@Node1 drbd.d]# cat /proc/drbd

wKioL1UyEPfiecs1AAEuhYnGxWQ640.jpg從上面信息可以看出此時兩個節點均處於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

wKiom1UyD-rQNtiKAAF3W3JjOG8410.jpg

[root@Node2 drbd.d]# cat /proc/drbd

wKiom1UyD_izU-DIAAFrRtOhugo416.jpg

       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

wKioL1UyEViTAijpAADfOSlqEQE291.jpg

[root@Node1 ~]# ll /mydrbd/

wKiom1UyEArxLgC0AAByt9PBkVg040.jpg

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/

wKiom1UyEBSw_oO8AACXEdCjanE154.jpg

[root@Node1 ~]# umount /mydrbd/
[root@Node1 ~]# drbdadm secondary drbd          #設置drbd狀態爲Secondary狀態;
[root@Node1 ~]# cat /proc/drbd

wKiom1UyECPCyynmAAE42Lpmp28238.jpg

##ON Node2
#設置Node2的drbd爲Primary
[root@Node2 ~]# drbdadm primary drbd
[root@Node2 ~]# cat /proc/drbd

wKioL1UyEYPCDOrkAAEWefyEDEk959.jpg

[root@Node2 ~]# mkdir /mydrbd/
[root@Node2 ~]# mount /dev/drbd0 /mydrbd/
[root@Node2 ~]# ls -l /mydrbd/

spacer.gifwKiom1UyEDjQk7b-AACYN2zjZOU437.jpg

ps: 可以看到已經複製到node2節點上.. 如果將node2設置爲secondary狀態, 第一步卸載/dev/drbd0掛載點, 第二步執行drbdadm secondary drbd, 第三步node1執行drbdadm primary drbd, 第四步掛載/dev/drbd0


此文章參考別人加上後期修改而成.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章