Linux之DRBA搭建與部署

什麼是DRBD


DRBD的全稱爲:Distributed Replicated Block Device(DRBD)分佈式塊設備複製,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡來鏡像整個設備。你可以把它看作是一種網絡RAID。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。


DRBD工作原理


(DRBD Primary)負責接收數據,把數據寫到本地磁盤併發送給另一臺主機(DRBD Secondary)。另一個主機再將數據存到自己的磁盤中。目前,DRBD每次只允許對一個節點進行讀寫訪問,但這對於通常的故障切換高可用集羣來說已經足夠用了。有可能以後的版本支持兩個節點進行讀寫存取。


DRBD與HA關係


一個DRBD系統由兩個節點構成,與HA集羣類似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操作系統可以運行和訪問DRBD設備(/dev/drbd*)。在主節點寫入的數據通過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的DRBD設備,最終寫入備用節點的磁盤設備上,在備用節點上,DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中。現在大部分的高可用性集羣都會使用共享存儲,而DRBD也可以作爲一個共享存儲設備,使用DRBD不需要太多的硬件的投資。因爲它在TCP/IP網絡中運行,所以,利用DRBD作爲共享存儲設備,要節約很多成本,因爲價格要比專用的存儲網絡便宜很多;其性能與穩定性方面也不錯


DRBD複製模式


協議A:

異步複製協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的。在一個節點發生故障時,可能發生數據丟失,因爲被寫入到遠程節點上的數據可能仍在發送隊列。儘管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點

協議B:

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

協議C:

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

一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。爲了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議


簡單解釋

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

B 收到接收確認就認爲完成了寫入操作.

C 收到寫入確認就認爲完成了寫入操作.


DRBD啓動進程


每個drbd設備會有三個進程:

drbd0_worker是drbd0的主要進程,

drbd0_asender是primary上drbd0的數據發送進程,

drbd0_receiver是secondary上drbd0的數據接收進程


DRBD內部原理圖

wKioL1cnRtiQV6qUAABYOlZb6-I005.png


DRBD安裝與部署


實驗環境

系統主機名IP磁盤
Centos6.5node1192.168.0.15/dev/sdb1
Centos6.5node2192.168.0.16/dev/sdb2





注:關閉防火牆,selinux,配置網卡,修改主機名,分區(僅分區,不格式化)省去


準備yum源,並安裝軟件(node1/node2)


[root@node1 ~]# wget http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

[root@node1 ~]# mv elrepo-release-6-6.el6.elrepo.noarch.rpm  /etc/yum.repos.d/

[root@node1 ~]# cd /etc/yum.repos.d/

[root@node1 yum.repos.d]# yum install drbd83-utils kmod-drbd83 -y

[root@node1 ~]# modprobe  drbd

[root@node1 ~]# lsmod | grep drbd

drbd                  332493  0 


配置DRBD(node1/node2配置文件相同)


(DRBD的配置文件主要分三個比分:global、common和resource。在運行的時候默認讀取配置文件的路徑是/etc/drbd.conf,這個文件描述了DRBD的一些配置參數以及設備與硬盤分區的映射關係,默認情況下是空的,不過在DRBD的源代碼包中包含了配置文件的樣例)

一般情況下global_common.conf(本次實驗文件所在目錄/etc/drbd.d/)文件僅包含global和common部分配置(理解爲全局配置),在/etc/drbd.d/*.res的文件定義於一個資源(理解爲主機定義)。

其實可以將DRBD配置整合到drbd.conf文件中,不過這樣做在資源比較多的情況下會變得混亂。


(1) 本次採用分佈式配置首先我們來配置/etc/drbd.d/global_common.conf


內容如下:

global {

usage-count no; #是否參加DRBD使用者統計,默認是參加

}

common {

syncer {rate 200M;} #主節點和備用節點同步時最大的網絡速率

protocol C; #使用DRBD的第三種同步協議,表示收到遠程主機的寫入確認後認爲寫入完成

handlers {

pri-on-incon-degr "echo o > /proc/sysrq-trigger ;halt -f";

pri-lost-after-sb "echo o > /proc/sysrq-trigger ;halt -f";

local-io-error "echo o >/proc/sysrq-trigger ;halt -f";

fence-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";

pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert'root";

split-brain "/usr/lib/drbd/notify-splot-brain.sh root";

out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

}

net { #DRBD同步時使用的驗證方式和密碼

cram-hmac-alg "sha1";

shared-secret "MySQL-HA";

}

disk { #使用dpod功能(drbd outdate-peer daemon)保證數據在同步時不能進行切換

on-io-error detach;

fencing resource-only;

}

startup {

wfc-timeout 120;

degr-wfc-timeout 120;

}

}

(2) 其次我們在drbd.d目錄下創建以.res爲後綴的文件,本次創建的文件是drbd.res目錄是/etc/drbd.d/

內容如下:

resource r0 { #定義資源名稱爲r0

on node1 { #每個主機的說明以on開頭 後面是主機名hostname

device /dev/drbd0; #定義DRBD使用磁盤的邏輯路徑

disk /dev/sdb1; #/dev/drbd0 使用的磁盤分區

address 192.168.0.15:7788; #設置DRBD的監聽端口,與另一臺主機通信

meta-disk internal; #DRBD元數據存放方式 internal 內部

}

on node2 {

device /dev/drbd0;

disk /dev/sdb1;

address 192.168.0.16:7788;

meta-disk internal;

}

}

3) 創建haclient組並設置權限 原因是:我們會使用drbd-peer-outdater fence-peer程序。使用該機制dopd心跳插件程序,就需要能夠調用drbdsetup和drbdmeta根特權。

命令如下:

            groupadd haclient

            chgrp haclient /sbin/drbdsetup

            chmod o-x /sbin/drbdsetup

            chmod u+s /sbin/drbdsetup

            chgrp haclient /sbin/drbdmeta

            chmod o-x /sbin/drbdmeta

            chmod u+s /sbin/drbdmeta

(4) 使用scp 將配置文件複製到另一臺計算機上 scp 192.168.0.16:/etc/dbrd.d/* /etc/drbd.d/

並執行

            groupadd haclient

            chgrp haclient /sbin/drbdsetup

            chmod o-x /sbin/drbdsetup

            chmod u+s /sbin/drbdsetup

            chgrp haclient /sbin/drbdmeta

            chmod o-x /sbin/drbdmeta

            chmod u+s /sbin/drbdmeta

(5) 在啓動DBRD之前,需要分別在兩臺主機上的指定分區(這裏是sdb4)上創建提供DRBD記錄信息的數據塊

drbdadm create-md r0(r0表示之前定義的資源)或者執行drbdadm create-md all

正確的提示是:

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.


這不操作也可能存在不成功的情況

[root@node1 drbd.d]# drbdadm create-md all

md_offset 10733953024

al_offset 10733920256

bm_offset 10733592576


Found ext3 filesystem

    10482380 kB data area apparently used

    10482024 kB left usable by current configuration


Device size would be truncated, which

would corrupt data and result in

'access beyond end of device' errors.

You need to either

   * use external meta data (recommended)

   * shrink that filesystem first

   * zero out the device (destroy the filesystem)

Operation refused.


Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40

drbdadm create-md r0: exited with code 40

執行如下命令解決此問題
[root@node1 drbd.d]# dd if=/dev/zero of=/dev/sdb1

(6) 在兩個節點上啓動DRBD服務 服務腳本位於/etc/init.d/drbd

/etc/init.d/drbd start

(7) 執行cat /proc/drbd

輸出內容如下

version: 8.3.16 (api:88/proto:86-97)

GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

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

輸出解釋:

ro表示角色信息,第一次啓動DRBD時,兩個節點默認都處於Secondary狀態

ds表示磁盤狀態信息,“Inconsistent/Inconsistent”即 “不一致/不一致”狀態表示兩個節點的磁盤數據不一樣

ns表示網絡發送的數據包信息

dw表示磁盤寫信息

dr表示磁盤讀信息

(8) 設置主用節點在默認情況下沒有主用節點和備用節點之分因此需要設置兩個主機的主次,選擇需要設置爲主用節點的主機執行以下命令

drbdsetup /dev/drbd0 primary -o 也可以執行以下命令 drbdadm -- --overwrite-data-of-peer primalry all

執行之後需要設置哪個主用節點就可以使用另一條命令

/sbin/drbdadm primary r0 或者/sbin/drbdadm primary all

稍等片刻後查看/proc/drbd

輸出如下:

version: 8.3.16 (api:88/proto:86-97)

GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

ns:10482024 nr:0 dw:0 dr:10482696 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

ro的狀態變成Primary/Secondary

ds狀態也變成UpToDate/UpToDate 表示實時同步

(9) 掛載DRBD設備在主節點上掛載以下操作

mkfs.ext4 /dev/drbd0  只需要格式化此分區,sdb1無需格式化

mount /dev/drbd0 /mnt (這裏是掛載到mnt下根據需要自行掛載)

(10) 測試DRBD數據鏡像

在主節點的掛載點/mnt下創建一個文件

dd if=/dev/zero of=/mnt/drdb_test.tmp bs=10M count=20

完成後接着查看備用主機上的文件是否同步過去了

首先先停止DRBD服務,爲了保證數據的一致性

/etc/init.d/drbd stop

mount /dev/sdb1 /mnt (這裏掛載是/dev/sdb1物理分區,因爲DRBD在啓動的時候纔會加載DRBD設備到系統中)

ls /mnt 即可查看到文件

-rw-r--r-- 1 root root 104857600 May  2 07:07 drdb_test.tmp

(11)主從節點切換

方法1:

關掉主節點服務,這是drbd分區會自動在主節點卸載,然後在備節點執行切換命令

[root@node2 drbd.d]# drbdsetup /dev/drbd0 primary -o

也可以執行drbdadm -- --overwrite-data-of-peer primalry all

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

version: 8.3.16 (api:88/proto:86-97)

GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/Outdated C r-----

    ns:0 nr:10882272 dw:10882272 dr:672 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

You have new mail in /var/spool/mail/root

Unknow是因爲沒有啓動服務
[root@node1 drbd.d]# /etc/init.d/drbd start

[root@node2 drbd.d]# mount /dev/drbd0 /mnt

[root@node2 drbd.d]# ll /mnt

total 102416

-rw-r--r-- 1 root root 104857600 May  2 07:07 drdb_test.tmp  由此證明數據同步成功


方法2:

先卸載分區

[root@node2 drbd.d]# umount /mnt

[root@node2 drbd.d]# drbdadm secondary all

在node1執行

[root@node1 drbd.d]# drbdadm primary all

[root@node1 drbd.d]# mount /dev/drbd

[root@node1 drbd.d]# ll /mnt

total 102416

-rw-r--r-- 1 root root 104857600 May  2 07:07 drdb_test.tmp


至此drbd配置完成

參考:

http://www.linuxidc.com/Linux/2013-09/90321.htm

http://www.linuxidc.com/Linux/2015-11/124760.htm

http://www.linuxidc.com/Linux/2015-11/125332.htm


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