2015/04/18 DRBD


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. 實驗拓撲

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 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

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 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

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


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

相關文章
相關標籤/搜索