【高可用HA】HA之DRBD詳解(基於CentOS7.0)

分類:IT技術 時間:2017-08-08

一、DRBD簡介 
DRBD的全稱為:Distributed ReplicatedBlock Device(DRBD)分布式塊設備復制,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。其實現方式是通過網絡來鏡像整個設備。你可以把它看作是一種網絡RAID。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。 
1.1、DRBD是如何工作的呢? 
(DRBD Primary)負責接收數據,把數據寫到本地磁盤並發送給另一臺主機(DRBD Secondary)。另一個主機再將數據存到自己的磁盤中。目前,DRBD每次只允許對一個節點進行讀寫訪問,但這對於通常的故障切換高可用集群來說已經足夠用了。有可能以後的版本支持兩個節點進行讀寫存取。 
1.2、DRBD與HA的關系 
一個DRBD系統由兩個節點構成,與HA集群類似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操作系統可以運行和訪問DRBD設備(/dev/drbd*)。在主節點寫入的數據通過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的DRBD設備,最終寫入備用節點的磁盤設備上,在備用節點上,DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中。現在大部分的高可用性集群都會使用共享存儲,而DRBD也可以作為一個共享存儲設備,使用DRBD不需要太多的硬件的投資。因為它在TCP/IP網絡中運行,所以,利用DRBD作為共享存儲設備,要節約很多成本,因為價格要比專用的存儲網絡便宜很多;其性能與穩定性方面也不錯 
二、DRBD復制模式 
2.1、協議A: 
異步復制協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認為是完成的。在一個節點發生故障時,可能發生數據丟失,因為被寫入到遠程節點上的數據可能仍在發送隊列。盡管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點 
2.2、協議B: 
內存同步(半同步)復制協議。一旦本地磁盤寫入已完成且復制數據包達到了對等節點則認為寫在主節點上被認為是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因為在傳輸中的數據可能不會被提交到磁盤 
2.3、協議C: 
同步復制協議。只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認為完成。沒有任何數據丟失,所以這是一個群集節點的流行模式,但I / O吞吐量依賴於網絡帶寬 
一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。為了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議

三、 DRBD工作原理圖 
DRBD是linux的內核的存儲層中的一個分布式存儲系統,可用使用DRBD在兩臺Linux服務器之間共享塊設備,共享文件系統和數據。類似於一個網絡RAID-1的功能,如圖所示:

這裏寫圖片描述 
四、安裝配置 (節點1上操作) 
4.1、準備: 
兩個節點ha-node1和ha-node2均按照centos7.0系統,每個節點兩塊磁盤,一塊用作根分區一塊用作drbd

192.168.8.51 ha-node1
192.168.8.52 ha-node2 
  • 修改主機名: 

節點1

# hostnamectl set-hostname ha-node1
# su -l
  • 節點2
# hostnamectl set-hostname ha-node2
# su -l
  • 4.2、磁盤分區如下
[root@ha-node2 corosync]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0   20G  0 disk 
sr0              11:0    1 1024M  0 rom  
[root@ha-node1 corosync]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0   20G  0 disk 
sr0              11:0    1 1024M  0 rom
  • 4.3、創建lvm(每個節點都需執行)
# pvcreate /dev/sdb
# vgcreate data /dev/sdb
# lvcreate --size 2G --name mysql data
  • 4.4、關閉防火墻(每個節點都需執行)
setenforce 0
sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
systemctl disable firewalld.service
systemctl stop firewalld.service
iptables --flush
  • 4.5、配置hosts文件
echo '192.168.8.51 ha-node1 ' >>/etc/hosts
echo '192.168.8.52 ha-node2 ' >>/etc/hosts
  • 4.6、配置ntp(10.239.44.128為ntp服務器)每個節點都需執行
# chkconfig chronyd off
# chkconfig ntpd on  
# sed -i "/^server\ 3.centos.pool/a server\ 10.239.44.128 " /etc/ntp.conf 
# service ntpd start
# ntpq -p
  • 4.6、配置互信(每個節點都需執行)
# ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
# ssh-copy-id ha-node1
# ssh-copy-id ha-node2
  • 4.7、安裝drbd
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# yum install -y kmod-drbd84 drbd84-utils
  • 4.8、配置文件介紹 

/etc/drbd.conf #主配置文件 
/etc/drbd.d/global_common.conf #全局配置文件 
a、/etc/drbd.conf說明 
主配置文件中包含了全局配置文件及”drbd.d/”目錄下以.res結尾的文件

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res"; 
  • b、/etc/drbd.d/global_common.conf說明
global {
    usage-count no;  #是否參加DRBD使用統計,默認為yes。官方統計drbd的裝機量
    # 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; #配置I/O錯誤處理策略為分離
        # 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 {

        # 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 1024M;    #設置主備節點同步時的網絡速率
    }
} 
  • 註釋: on-io-error 策略可能為以下選項之一 

detach 分離:這是默認和推薦的選項,如果在節點上發生底層的硬盤I/O錯誤,它會將設備運行在Diskless無盤模式下 
pass_on:DRBD會將I/O錯誤報告到上層,在主節點上,它會將其報告給掛載的文件系統,但是在此節點上就往往忽略(因此此節點上沒有可以報告的上層) 
-local-in-error:調用本地磁盤I/O處理程序定義的命令;這需要有相應的local-io-error調用的資源處理程序處理錯誤的命令;這就給管理員有足夠自由的權力命令命令或是腳本調用local-io-error處理I/O錯誤 
定義一個資源 
c、創建/etc/drbd.d/MySQL.res並寫入

resource mysql { #資源名稱
protocol C; #使用協議
meta-disk internal;
device /dev/drbd1; #DRBD設備名稱
syncer {
verify-alg sha1;# 加密算法
}
net {
allow-two-primaries;
}
on ha-node1 {
disk /dev/data/mysql; drbd1使用的磁盤分區為"mysql"
address 192.168.8.51:7789; #設置DRBD監聽地址與端口
}
on ha-node2 {
disk /dev/data/mysql;
address 192.168.8.52:7789;
}
}
  • 4.9、將配置文件拷貝到node2上
# scp -rp  /etc/drbd.d/* ha-node2:/etc/drbd.d/
  • 4.10、啟用drbd
# drbdadm create-md mysql
# modprobe drbd
# drbdadm up mysql
# drbdadm -- --force primary mysql
  • 查看狀態
# cat /proc/drbd 
  • 4.11、配置對端節點
ssh ha-node2 “drbdadm create-md mysql”
ssh ha-node2 “modprobe drbd”
ssh ha-node2 “drbdadm up mysql”
  • 4.12、格式化設備並掛載
# mkfs.xfs /dev/drbd1
# mount /dev/drbd1 /mnt
  • 五、相關配置操作 

6.1、資源的連接狀態詳細介紹 
如何查看資源連接狀態?

[root@ha-node1 ~]# drbdadm cstate mysql  #mysql為資源名稱
WFConnection
  • 資源的連接狀態;一個資源可能有以下連接狀態中的一種 

StandAlone 獨立的:網絡配置不可用;資源還沒有被連接或是被管理斷開(使用 drbdadm disconnect 命令),或是由於出現認證失敗或是腦裂的情況 
Disconnecting 斷開:斷開只是臨時狀態,下一個狀態是StandAlone獨立的 
Unconnected 懸空:是嘗試連接前的臨時狀態,可能下一個狀態為WFconnection和WFReportParams 
Timeout 超時:與對等節點連接超時,也是臨時狀態,下一個狀態為Unconected懸空 
BrokerPipe:與對等節點連接丟失,也是臨時狀態,下一個狀態為Unconected懸空 
NetworkFailure:與對等節點推動連接後的臨時狀態,下一個狀態為Unconected懸空 
ProtocolError:與對等節點推動連接後的臨時狀態,下一個狀態為Unconected懸空 
TearDown 拆解:臨時狀態,對等節點關閉,下一個狀態為Unconected懸空 
WFConnection:等待和對等節點建立網絡連接 
WFReportParams:已經建立TCP連接,本節點等待從對等節點傳來的第一個網絡包 
Connected 連接:DRBD已經建立連接,數據鏡像現在可用,節點處於正常狀態 
StartingSyncS:完全同步,有管理員發起的剛剛開始同步,未來可能的狀態為SyncSource或PausedSyncS 
StartingSyncT:完全同步,有管理員發起的剛剛開始同步,下一狀態為WFSyncUUID 
WFBitMapS:部分同步剛剛開始,下一步可能的狀態為SyncSource或PausedSyncS 
WFBitMapT:部分同步剛剛開始,下一步可能的狀態為WFSyncUUID 
WFSyncUUID:同步即將開始,下一步可能的狀態為SyncTarget或PausedSyncT 
SyncSource:以本節點為同步源的同步正在進行 
SyncTarget:以本節點為同步目標的同步正在進行 
PausedSyncS:以本地節點是一個持續同步的源,但是目前同步已經暫停,可能是因為另外一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步 
PausedSyncT:以本地節點為持續同步的目標,但是目前同步已經暫停,這可以是因為另外一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步 
VerifyS:以本地節點為驗證源的線上設備驗證正在執行 
VerifyT:以本地節點為驗證目標的線上設備驗證正在執行 
5.2、資源角色 
查看資源角色命令

[root@ha-node ~]# drbdadm role  mysql
Secondary/Secondary
[root@ha-node1ha-node1 ~]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 04:30:21
 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:2103412
  • 註釋: 

Parimary 主:資源目前為主,並且可能正在被讀取或寫入,如果不是雙主只會出現在兩個節點中的其中一個節點上 
Secondary 次:資源目前為次,正常接收對等節點的更新 
Unknown 未知:資源角色目前未知,本地的資源不會出現這種狀態 
5.3、硬盤狀態 
查看硬盤狀態命令

[root@ha-node1ha-node1 ~]# drbdadm dstate mysql
Inconsistent/Inconsistent 
  • 本地和對等節點的硬盤有可能為下列狀態之一: 

Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤導致自動分離 
Attaching:讀取無數據時候的瞬間狀態 
Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態為Diskless無盤 
Negotiating:在已經連接的DRBD設置進行Attach讀取無數據前的瞬間狀態 
Inconsistent:數據是不一致的,在兩個節點上(初始的完全同步前)這種狀態出現後立即創建一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態 
Outdated:數據資源是一致的,但是已經過時 
DUnknown:當對等節點網絡連接不可用時出現這種狀態 
Consistent:一個沒有連接的節點數據一致,當建立連接時,它決定數據是UpToDate或是Outdated 
UpToDate:一致的最新的數據狀態,這個狀態為正常狀態 
5.4、啟用和禁用資源 
手動啟用資源

手動啟用資源
drbdadm up <resource>
手動禁用資源
drbdadm down <resource>
  • 註釋: 

resource:為資源名稱;當然也可以使用all表示[停用|啟用]所有資源 
5.5、升級和降級資源

升級資源
drbdadm primary <resource>
降級資源
drbdadm secondary <resource>
  • 註釋:在單主模式下的DRBD,兩個節點同時處於連接狀態,任何一個節點都可以在特定的時間內變成主;但兩個節點中只能一為主,如果已經有一個主,需先降級才可能升級;在雙主模式下沒有這個限制 

5.6、初始化設備同步 
選擇一個初始同步源;如果是新初始化的或是空盤,這個選擇可以是任意的,但是如果其中的一個節點已經在使用並包含有用的數據,那麽選擇同步源是至關重要的;如果選錯了初始化同步方向,就會造成數據丟失,因此需要十分小心 
啟動初始化完全同步,這一步只能在初始化資源配置的一個節點上進行,並作為同步源選擇的節點上;命令如下:

[root@ha-node1 ~]# drbdadm -- --overwrite-data-of-peer primary mysql
[root@ha-node1 ~]# cat /proc/drbd     #查看同步進度
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 04:30:21
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
    ns:1897624 nr:0 dw:0 dr:1901216 al:0 bm:115 lo:0 pe:3 ua:3 ap:0 ep:1 wo:f oos:207988
    [=================>..] synced: 90.3% (207988/2103412)K
    finish: 0:00:07 speed: 26,792 (27,076) K/sec
######當同步完成時如以下狀態
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 04:30:21
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2103412 nr:0 dw:0 dr:2104084 al:0 bm:129 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
  • 註釋: drbd:為資源名稱 

查看同步進度也可使用以下命令

drbd-overview
  • 5.7、創建文件系統 

文件系統只能掛載在主(Primary)節點上,因此在設置好主節點後才可以對DRBD設備進行格式化操作 
格式化文件系統

[root@ha-node1 ~]# mkfs.ext4 /dev/drbd1
  • 掛載文件系統
[root@ha-node1 ~]# mount /dev/drbd1 /mnt/
  • 查看掛載
[root@ha-node1 ~]# mount |grep drbd1
/dev/drbd1 on /mnt type ext4 (rw)
  • 註釋: 

“/dev/drbd1”為資源中定義已定義的資源名稱 
查看DRBD狀態

[root@ha-node1 ~]# drbd-overview
  0:drbd/0  Connected Primary/Secondary UpToDate/UpToDate C r-----
  • 註釋: 

Primary:當前節點為主;在前面為當前節點 
Secondary:備用節點為次 
5.8、切換主備節點 
先把當前主節點降級為次

[root@ha-node1 ~]# drbdadm secondary mysql
  • 查看DRBD狀態
[root@ha-node1 ~]# drbd-overview
  0:drbd/0  Connected Secondary/Secondary UpToDate/UpToDate C r-----
  • 在HA-NODE2節點升級
[root@ha-node2 ~]# drbdadm primary mysql
  • 查看DRBD狀態
[root@ha-node2 ~]# drbd-overview
  0:drbd/0  Connected Primary/Secondary UpToDate/UpToDate C r-----
  • 5.9、掛載設備並驗證文件是否存在
[root@ha-node2 ~]# mount /dev/drbd1 /mnt/
[root@ha-node2 ~]# ls /mnt/
lost+found  test
  • 六、DRBD腦裂的模擬及修復 

註釋:我們還接著上面的實驗繼續進行,現在HA-NODE2為主節點而HA-NODE1為備節點 
6.1、斷開主(parmary)節點; 
關機、斷開網絡或重新配置其他的IP都可以;這裏選擇的是斷開網絡 
6.2、查看兩節點狀態

[root@ha-node2 ~]# drbd-overview
  0:drbd/0  WFConnection Primary/Unknown UpToDate/DUnknown C r----- /mnt ext4 2.0G 68M 1.9G 4%
[root@ha-node1 ~]# drbd-overview
  0:drbd/0  StandAlone Secondary/Unknown UpToDate/DUnknown r-----
  • 由上可以看到兩個節點已經無法通信;HA-NODE2為主節點,HA-NODE1為備節點 

6.3、將HA-NODE1節點升級為主(primary)節點並掛載資源

[root@ha-node1 ~]# drbdadm primary mysql
[root@ha-node1 ~]# drbd-overview
  0:drbd/0  StandAlone Primary/Unknown UpToDate/DUnknown r-----
[root@ha-node1 ~]# mount /dev/drbd1 /mnt/
[root@ha-node1 ~]# mount | grep drbd1
/dev/drbd1 on /mnt type ext4 (rw) 
  • 6.4、假如原來的主(primary)節點修復好重新上線了,這時出現了腦裂情況
[root@ha-node2 ~]# tail -f /var/log/messages
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: Terminating drbd_a_drbd
Sep 19 01:56:06 ha-node2 kernel: block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-0 exit code 0 (0x0)
Sep 19 01:56:06 ha-node2 kernel: block drbd1: Split-Brain detected but unresolved, dropping connection!
Sep 19 01:56:06 ha-node2 kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-0
Sep 19 01:56:06 ha-node2 kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-0 exit code 0 (0x0)
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: conn( NetworkFailure -> Disconnecting )
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: error receiving ReportState, e: -5 l: 0!
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: Connection closed
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: conn( Disconnecting -> StandAlone )
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: receiver terminated
Sep 19 01:56:06 ha-node2 kernel: d-con drbd: Terminating drbd_r_drbd
Sep 19 01:56:18 ha-node2 kernel: block drbd1: role( Primary -> Secondary ) 
  • 6.5、再次查看兩節點的狀態
[root@ha-node1 ~]# drbdadm role drbd
Primary/Unknown
[root@ha-node2 ~]# drbdadm role mysql
Primary/Unknown
  • 6.6、查看HA-NODE1與HA-NODE2連接狀態
root@ha-node1 ~]# drbd-overview
  0:mysql/0  StandAlone Primary/Unknown UpToDate/DUnknown r----- /mnt ext4 2.0G 68M 1.9G 4%
[root@ha-node2 ~]# drbd-overview
  0:mysql/0  WFConnection Primary/Unknown UpToDate/DUnknown C r----- /mnt ext4 2.0G 68M 1.9G 4%
  • 由上可見,狀態為StandAlone時,主備節點是不會通信的 

6.7、在HA-NODE1備用節點處理辦法

[root@ha-node1 ~]# umount /mnt/
[root@ha-node1 ~]# drbdadm disconnect drbd
drbd: Failure: (162) Invalid configuration request
additional info from kernel:
unknown connection
Command 'drbdsetup disconnect ipv4:192.168.137.225:7789 ipv4:192.168.137.222:7789' terminated with exit code 10
[root@ha-node1 ~]# drbdadm secondary drbd
[root@ha-node1 ~]# drbd-overview
  0:drbd/0  StandAlone Secondary/Unknown UpToDate/DUnknown r-----
[root@ha-node1 ~]# drbdadm connect --discard-my-data drbd
  • 執行完以上三步後,你查看會發現還是不可用
[root@ha-node1 ~]# drbd-overview
  0:drbd/0  WFConnection Secondary/Unknown UpToDate/DUnknown C r----- 
  • 6.8、需要在HA-NODE2節點上重新建立連接資源
[root@ha-node2 ~]# drbdadm connect drbd
  • 查看節點連接狀態
[root@ha-node2 ~]# drbd-overview
  0:mysql/0  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt ext4 2.0G 68M 1.9G 4%
[root@ha-node1 ~]# drbd-overview
  0:mysql/0  Connected Secondary/Primary UpToDate/UpToDate C r-----

Tags: 節點 DRBD 設備 磁盤 備用 數據

文章來源:


ads
ads

相關文章
ads

相關文章

ad