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

一、drbd基礎

1.drbd基礎概念

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

2.drbd工作原理

wKioL1X-rwOCUvaAAAHy9Qgd4vg151.jpg

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

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

3.drbd複製模式(協議)

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

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

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

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

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

二、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 [email protected]
# node2
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub [email protected]

    配置主機名稱與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

4、在兩個節點上初始化已定義的資源並啓動服務:
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

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