分佈式塊設備drbd基礎概念、原理及其主從模式配置

1、drbd基礎
node

1.drbd基礎概念
mysql

    drbd(全稱爲Distributed Replicated Block Device,簡稱drbd)分佈式塊設備複製,說白了就是在不一樣節點上兩個相同大小的設備塊級別之間的數據同步鏡像。drbd是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。在高可用(HA)解決方案中使用drbd的功能,能夠代替使用一個共享盤陣存儲設備。由於數據同時存在於本地主機和遠程主機上,在遇到須要切換的時候,遠程主機只須要使用它上面的那份備份數據,就能夠繼續提供服務了。linux

2.drbd工做原理算法

wKioL1X-rwOCUvaAAAHy9Qgd4vg151.jpg

    從上圖咱們能夠清晰的看出drbd是以主從(Primary/Secondary)方式工做的,這點原理與mysql的主從複製的架構有些類似。主 節點上的drbd提高爲Primary並負責接收寫入數據,當數據到達drbd模塊時,一份繼續往下走寫入到本地磁盤實現數據的持久化,同時並將接收到的 要寫入的數據發送一分到本地的drbd設備上經過tcp傳到另一臺主機的drbd設備上(Secondary node),另外一臺主機上的對應的drbd設備再將接收到的數據存入到本身的磁盤當中。這裏與mysql的基於經過二進制日誌完成數據的複製的確很類似, 可是也有一些不一樣之處。好比:mysql的從節點不能寫可是能夠讀,可是drbd的從節點是不能讀、不能掛載。sql

   所以,drbd對同一設備塊每次只容許對主節點進行讀、寫操做,從節點不能寫也不能讀。這樣感受是否是對主機有資源浪費,的確HA架構中爲了提供冗餘能 力是有資源浪費,可是你能夠對上圖的兩臺主機創建兩個drbd資源並互爲主從,這樣兩臺機器都能利用起來,可是配置起來就複雜了。可是話又說回來,用 drbd做爲廉價的共享存儲設備,要節約不少成本,由於價格要比專用的存儲網絡便宜不少,其性能與穩定性方面也還不錯。vim

3.drbd複製模式(協議)api

     A協議:異步複製協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的。在一個節點發生故障時,可能發生數據丟失,由於被寫入到遠程節點 上的數據可能仍在發送隊列。儘管,在故障轉移節點上的數據是一致的,但沒有及時更新。所以,這種模式效率最高,可是數據不安全,存在數據丟失。安全

   B協議:內存同步(半同步)複製協議。一旦本地磁盤寫入已完成且複製數據包達到了對等節點則認爲寫在主節點上被認爲是完成的。數據丟失可能發生在參加的兩個節點同時故障的狀況下,由於在傳輸中的數據可能不會被提交到磁盤bash

   C協議:同步複製協議。只有在本地和遠程節點的磁盤已經確認了寫操做完成,寫才被認爲完成。沒有數據丟失,因此這是一個羣集節點的流行模式,但I/O吞吐量依賴於網絡帶寬。所以,這種模式數據相對安全,可是效率比較低。網絡

4.drbd資源:用來定義一組drbd設備,它包含如下四個屬性。

    資源名稱:能夠是除了空白字符外的任意ACSII碼字符;
    DRBD設備:在雙方節點上,此DRBD設備的設備文件,通常爲/dev/drbdN,其主設備號147;
    磁盤:在雙方節點上,各自提供的存儲設備;
    網絡配置:雙方數據同步時所使用的網絡屬性;

2、drbd安裝與配置

1.環境

    node1(CentOS6.5):192.168.220.132

    node2(CentOS6.5):192.168.220.133

2.準備工做

     配置各節點SSH互信:

# node1
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.220.133
# node2
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.220.132

    配置主機名稱與uname -n一致,並經過/etc/hosts解析:

# node1
hostname node1.wyb.com
 sed -i 's@\(HOSTNAME=\).*@\1node1.wyb.com@g' /etc/sysconfig/network
echo '192.168.220.132 node1.wyb.com   node1' >> /etc/hosts
echo '192.168.220.133 node2.wyb.com   node2' >> /etc/hosts
# node2
hostname node2.wyb.com
 sed -i 's@\(HOSTNAME=\).*@\1node2.wyb.com@g' /etc/sysconfig/network
echo '192.168.220.132 node1.wyb.com   node1' >> /etc/hosts
echo '192.168.220.133 node2.wyb.com   node2' >> /etc/hosts

    時間同步:

# node1 node2
ntpdate asia.pool.ntp.org
echo '*/3 * * * * /usr/sbin/ntpdate asia.pool.ntp.org &> /dev/null' >> /var/spool/cron/root

    分別在兩個節點上準備一個大小相同的磁盤設備(具體操做省略)。

3.安裝

    drbd共有兩部分組成:內核模塊和用戶空間的管理工具。其中drbd內核模塊代碼已經整合進Linux內核2.6.33之後的版本中,所以,若是您的內核版本高於此版本的話,你只須要安裝管理工具便可;不然,您須要同時安裝內核模塊和管理工具兩個軟件包,而且此二者的版本號必定要保持對應。因爲CentOS6.5自帶yum源沒有drbd軟件包,因此須要手動下載對應版本軟件包安裝,下載地址爲:http://rpm.pbone.com。

#node1 node2
[root@node1 drbd]# ls
drbd-8.4.3-33.el6.x86_64.rpm  drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
[root@node1 drbd]# yum --nogpgcheck localinstall *.rpm -y

4.配置

    drbd的主配置文件爲/etc/drbd.conf;爲了管理的便捷性,目前一般會將些配置文件分紅多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片段整合起來。一般,/etc/drbd.d目錄中的配置文件爲global_common.conf和全部以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每個.res的文件用於定義一個資源。
    在配置文件中,global段僅能出現一次,且若是全部的配置信息都保存至同一個配置文件中而不分開爲多個文件的話,global段必須位於配置文件的最開始處。目前global段中能夠定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
    common段則用於定義被每個資源默認繼承的參數,能夠在資源定義中使用的參數均可以在common段中定義。實際應用中,common段並不是必須,但建議將多個資源共享的參數定義爲common段中的參數以下降配置文件的複雜度。
    resource段則用於定義drbd資源,每一個資源一般定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須爲其命名,名字能夠由非空白的ASCII字符組成。每個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數都可以從common段或drbd的默認中進行繼承而無須定義。

    配置主配置文件:

[root@node1 drbd.d]# vim /etc/drbd.d/global_common.conf 
global {
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
}

common {
        protocol C;    #定義drbd複製協議
        handlers {    #定義處理機制程序
                # These are EXAMPLE handlers only.
                # They may have severe implications,
                # like hard resetting the node under certain circumstances.
                # Be careful when chosing your poison.

                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";
                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }

        startup {
                # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
        }

        options {
                # cpu-mask on-no-data-accessible
        }

        disk {
                on-io-error detach;
                # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
                # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
        }

        net {
                cram-hmac-alg "sha1";    #設置加密算法 
                shared-secret "mydrbd784uif";    #設置加密密鑰 
                # protocol timeout max-epoch-size max-buffers unplug-watermark
                # connect-int ping-int sndbuf-size rcvbuf-size ko-count
                # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
                # after-sb-1pri after-sb-2pri always-asbp rr-conflict
                # ping-timeout data-integrity-alg tcp-cork on-congestion
                # congestion-fill congestion-extents csums-alg verify-alg
                # use-rle
        }
        syncer {
                rate 200M;    #定義drbd複製時最大使用帶寬
        }
}

    資源定義:

[root@node1 drbd.d]# vim mydrbd.res
resource mydrbd {    #資源名稱
  on node1.wyb.com {    #定義主機名爲node2.wyb.com的節點的屬性配置
    device    /dev/drbd0;    #drbd設備名稱
    disk      /dev/sda6;    #drbd使用的物理設備
    address   192.168.220.132:7789;    #監聽套接字
    meta-disk internal;    #drbd元數據存放位置
  }
  on node2.wyb.com {
    device    /dev/drbd0;
    disk      /dev/sda6;
    address   192.168.220.133:7789;
    meta-disk internal;
  }
}

注:相同屬性能夠定義在resource外部。

    將剛纔配置的文件所有同步至另一個節點:

scp -r /etc/drbd.*  node2:/etc

四、在兩個節點上初始化已定義的資源並啓動服務:
1)、初始化資源,在Node1和Node2上分別執行:

[root@node1 ~]# drbdadm create-md mydrbd
Writing meta data...
initializing activity log
NOT initializing bitmap    #錯誤能夠忽略
lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory
New drbd meta data block successfully created.
lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory

2)、啓動服務,在Node1和Node2上分別執行:

/etc/init.d/drbd start

3)、查看啓動狀態:

[root@node1 ~]# cat /proc/drbd 
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
 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:f oos:1055424

    也可使用drbd-overview命令來查看:

[root@node1 ~]# drbd-overview 
  0:mydrbd/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

4)、設置node1爲主節點:

drbdadm -- --overwrite-data-of-peer primary mydrbd

5)、建立文件系統
    文件系統的掛載只能在Primary節點進行,所以,也只有在設置了主節點後才能對drbd設備進行格式化:

[root@node1 ~]# mkfs -t ext4 /dev/drbd0
[root@node1 ~]# mkdir /mnt/drbd
[root@node1 ~]# mount /dev/drbd0 /mnt/drbd/

6)、切換Primary和Secondary節點
    對Primary/Secondary模型的drbd服務來說,在某個時刻只能有一個節點爲Primary,所以,要切換兩個節點的角色,只能在先將原有的Primary節點設置爲Secondary後,才能原來的Secondary節點設置爲Primary:

#node1:
[root@node1 ~]# cp /etc/inittab /mnt/drbd/
[root@node1 ~]# umount /mnt/drbd/
[root@node1 ~]# drbdadm secondary mydrbd

#node2:
[root@node2 ~]# drbdadm primary mydrbd
[root@node2 ~]# drbd-overview 
  0:mydrbd/0  Connected Primary/Secondary UpToDate/UpToDate C r----- 
[root@node2 ~]# mkdir /mnt/drbd
[root@node2 ~]# mount /dev/drbd0 /mnt/drbd/
[root@node2 ~]# ls /mnt/drbd/
inittab  lost+found

成功!

參考資料:

drbd介紹、工做原理及腦裂故障處理:http://bruce007.blog.51cto.com/7748327/1330959

drbd安裝配置、工做原理及故障恢復:http://www.linuxidc.com/Linux/2013-09/90321.htm

相關文章
相關標籤/搜索