DRBD

描述

數(shù)據(jù)鏡像軟件 DRBD 介紹

分布式塊設(shè)備復(fù)制(Distributed Replicated Block Device),簡稱 DRBD,它是一種基于軟件的、基于網(wǎng)絡(luò)的塊復(fù)制存儲(chǔ)解決方案,主要用于服務(wù)器之間的磁盤、分區(qū)、邏輯卷等進(jìn)行數(shù)據(jù)鏡像。當(dāng)用戶將數(shù)據(jù)寫入本地磁盤時(shí),還會(huì)將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中另一臺(tái)主機(jī)的磁盤上,這樣本地主機(jī)(主節(jié)點(diǎn))與遠(yuǎn)程主機(jī)(備節(jié)點(diǎn))的數(shù)據(jù)就可以保證實(shí)時(shí)同步,當(dāng)本地主機(jī)出現(xiàn)問題,遠(yuǎn)程主機(jī)上還保留著一份相同的數(shù)據(jù),可以繼續(xù)使用,保證了數(shù)據(jù)的安全

DRBD 的基本功能

DRBD 的核心功能就是數(shù)據(jù)的鏡像,其實(shí)現(xiàn)方式是通過網(wǎng)絡(luò)來鏡像整個(gè)磁盤設(shè)備或磁盤分區(qū),將一個(gè)節(jié)點(diǎn)的數(shù)據(jù)通過網(wǎng)絡(luò)實(shí)時(shí)的傳送到另一個(gè)遠(yuǎn)程節(jié)點(diǎn),保證兩個(gè)節(jié)點(diǎn)間數(shù)據(jù)的一致性,這有點(diǎn)類似于一個(gè)網(wǎng)絡(luò) RAID1 的功能。對于 DRDB 數(shù)據(jù)鏡像來說,它具有如下特點(diǎn):

實(shí)時(shí)性。當(dāng)應(yīng)用對磁盤數(shù)據(jù)有修改操作時(shí),數(shù)據(jù)復(fù)制立即發(fā)生。
透明性。應(yīng)用程序的數(shù)據(jù)存儲(chǔ)在鏡像設(shè)備上是透明和獨(dú)立的。數(shù)據(jù)可以存儲(chǔ)在基于網(wǎng)絡(luò)的不同服務(wù)器上。
同步鏡像。當(dāng)本地應(yīng)用申請寫操作時(shí),同時(shí)也在遠(yuǎn)程主機(jī)上開始進(jìn)行寫操作。
異步鏡像。當(dāng)本地寫操作已經(jīng)完成時(shí),才開始對遠(yuǎn)程主機(jī)進(jìn)行寫操作。

DRBD 的構(gòu)成

DRBD 是 Linux 內(nèi)核存儲(chǔ)層中的一個(gè)分布式存儲(chǔ)系統(tǒng),具體來說有兩部分構(gòu)成,一個(gè)是內(nèi)核模板,主要用于虛擬一個(gè)塊設(shè)備;一個(gè)是用戶空間管理程序,主要用于和 DRBD 內(nèi)核模塊通信,以管理 DRBD 資源,在 DRBD 中,資源主要包含 DRBD 設(shè)備、磁盤配置、網(wǎng)絡(luò)配置等。

DRBD 設(shè)備在整個(gè) DRBD 系統(tǒng)中位于物理塊設(shè)備之上,文件系統(tǒng)之下,在文件系統(tǒng)和物理磁盤之間形成了一個(gè)中間層,當(dāng)用戶在主用節(jié)點(diǎn)的文件系統(tǒng)中寫入數(shù)據(jù)時(shí),數(shù)據(jù)被正式寫入磁盤前會(huì)被 DRBD 系統(tǒng)截獲,同時(shí),DRBD 在捕捉到有磁盤寫入的操作時(shí),就會(huì)通知用戶空間管理程序把這些數(shù)據(jù)復(fù)制一份,寫入到遠(yuǎn)程主機(jī)的 DRBD 鏡像,然后存入 DRBD 鏡像所映射的遠(yuǎn)程主機(jī)磁盤。

drbd.png

DRBD 負(fù)責(zé)接收數(shù)據(jù),把數(shù)據(jù)寫到本地磁盤,然后發(fā)送給另一個(gè)主機(jī)。另一個(gè)主機(jī)再將數(shù)據(jù)存到自己的磁盤中。目前,DRBD 每次只允許對一個(gè)節(jié)點(diǎn)進(jìn)行讀寫訪問,這對于通常的故障切換高可用性集群來講已經(jīng)足夠用了。以后的版本將支持兩個(gè)節(jié)點(diǎn)進(jìn)行讀寫存取。

DRBD 的主要特性

DRBD 系統(tǒng)在實(shí)現(xiàn)數(shù)據(jù)鏡像方面有很多有用的特性,我們可以根據(jù)自己的需要和應(yīng)用環(huán)境,選擇適合自己的功能特性。下面依次介紹 DRBD 幾個(gè)非常重要的應(yīng)用特性。

  1. 單主模式這種是最經(jīng)常使用的一種模式,主要用在高可用集群的數(shù)據(jù)存儲(chǔ)方面,解決集群中數(shù)據(jù)共享的問題,在這種模式下,集群中只有一個(gè)主節(jié)點(diǎn)可以對數(shù)據(jù)進(jìn)行讀寫操作,可以用在這種模式下的文件系統(tǒng)有 ext3、ext4、xfs 等。

  2. 雙主模式這種模式只能在 DRBD8.0 以后的版本中使用,主要用在負(fù)載均衡集群中,解決數(shù)據(jù)共享和一致性問題,在這種模式下,集群中存在兩個(gè)主節(jié)點(diǎn),由于兩個(gè)主節(jié)點(diǎn)都有可能對數(shù)據(jù)進(jìn)行并發(fā)的讀寫操作,因此單一的文件系統(tǒng)就無法滿足需求了,此時(shí)就需要共享的集群文件系統(tǒng)來解決并發(fā)讀寫問題。常用在這個(gè)模式下的文件系統(tǒng)有 GFS、OCFS2 等,通過集群文件系統(tǒng)的分布式鎖機(jī)制就可以解決集群中兩個(gè)主節(jié)點(diǎn)同時(shí)操作數(shù)據(jù)的問題。

復(fù)制模式
DRBD 提供了三種不同的復(fù)制方式,分別是:

協(xié)議 A,只要本地磁盤寫入已經(jīng)完成,數(shù)據(jù)包已經(jīng)在發(fā)送隊(duì)列中,則認(rèn)為一個(gè)寫操作過程已經(jīng)完成。
這種方式在遠(yuǎn)程節(jié)點(diǎn)故障或者網(wǎng)絡(luò)故障時(shí),可能造成數(shù)據(jù)丟失,因?yàn)橐獙懭氲竭h(yuǎn)程節(jié)點(diǎn)的數(shù)據(jù)可能還在發(fā)送隊(duì)列中。

協(xié)議 B,只要本地磁盤寫入已經(jīng)完成,并且數(shù)據(jù)包已經(jīng)到達(dá)遠(yuǎn)程節(jié)點(diǎn),則認(rèn)為一個(gè)寫操作過程已經(jīng)完成。
這種方式在遠(yuǎn)程節(jié)點(diǎn)發(fā)生故障時(shí),可能造成數(shù)據(jù)丟失。

協(xié)議 C,只有本地和遠(yuǎn)程節(jié)點(diǎn)的磁盤已經(jīng)都確認(rèn)了寫操作完成,寫認(rèn)為一個(gè)寫操作過程已經(jīng)完成。
這種方式?jīng)]有任何數(shù)據(jù)丟失,就目前而言應(yīng)用最多、最廣泛的就是協(xié)議 C,但在此方式下磁盤的 I/O 吞吐量依賴于網(wǎng)絡(luò)帶寬。建議在網(wǎng)絡(luò)帶寬較好的情況下使用這種方式。

安裝與配置

系統(tǒng)環(huán)境:CentOS 6

安裝yum源

http://www.elrepo.org/上找到系統(tǒng)對應(yīng)的
rpm -Uvi [...]

安裝gcc,make,如果系統(tǒng)沒有裝
yum install gcc make*

安裝DRBD
  1. 安裝drbd的系統(tǒng)內(nèi)核支持
#yum install kernel-devel kernel kernel-headers flex
  1. 安裝
#yum -y install drbd83-utils kmod-drbd83
配置DRBD

我們在/etc/drbd.d下面創(chuàng)建一個(gè)mydb.res文件。下面是兩臺(tái)DRBD主機(jī)節(jié)點(diǎn)配置文件的簡單示例
resource "mydb" { #資源名字為mydb
protocol C; #使用DRBD的第三種同步協(xié)議,表示收到遠(yuǎn)程主機(jī)的寫入確認(rèn)后認(rèn)為寫入完成

net {
cram-hmac-alg "sha1"; #DRBD同步時(shí)使用的驗(yàn)證方式
shared-secret "passwd";
}

syncer { #數(shù)據(jù)同步傳輸控制
rate 200M; #最大同步速率,下面兩個(gè)是輔助參數(shù)
al-extents 257;
on-no-data-accessible io-error;
}

disk { #處理發(fā)生數(shù)據(jù)不同步的問題,新的版本已不使用
on-io-error detach;
fencing resource-only;
}

startup { #啟動(dòng)時(shí)的參數(shù)設(shè)置
wfc-timeout 30; #等待30s服務(wù)啟動(dòng)
outdated-wfc-timeout 20;
degr-wfc-timeout 30;
}

on join { #主機(jī)名
device /dev/drbd0; #drbd的塊設(shè)備名
disk /dev/sdb1;
address 192.168.99.131:7788; #drbd的監(jiān)聽端口,用于主機(jī)通信
meta-disk internal; #元數(shù)據(jù)的存放方式(默認(rèn))
}

on jinbo {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.99.132:7788;
meta-disk internal;
}
}

DRBD的管理與維護(hù)

啟動(dòng)DRBD

1.在兩個(gè)節(jié)點(diǎn)上執(zhí)行
在啟動(dòng)DRBD之前,需要分別在兩臺(tái)主機(jī)的分區(qū)上創(chuàng)建供DRBD記錄信息的數(shù)據(jù)塊,具體是分別在兩臺(tái)主機(jī)上執(zhí)行:

#drbdadm create-md mydb  或者執(zhí)行  drbdadm create-md all

2. 在兩個(gè)節(jié)點(diǎn)上啟動(dòng)服務(wù)
[root@jinbo ~]# /etc/init.d/drbd start
[root@join ~]# /etc/init.d/drbd start

drbdadm up all/mydb all表示啟動(dòng)所有資源,drbdadm down all 關(guān)閉資源。
與drbdadm connect/disconnect all/mydb一樣

3.在任意節(jié)點(diǎn)上查看節(jié)點(diǎn)狀態(tài)
登陸任意drbd節(jié)點(diǎn),然后執(zhí)行“cat /proc/drbd”命令,輸出結(jié)果如下:
[root@jinbo drbd.d]# cat /proc/drbd
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:20964116

對輸出的含義解釋如下(常見的):
cs連接狀態(tài):
StandAlone 獨(dú)立的:網(wǎng)絡(luò)配置不可用。資源還沒有被連接或者被管理員斷開(使用drbdadm disconnect 命令),或者是由于認(rèn)證失敗或者是腦裂的情況。
Disconnecting 斷開:斷開只是臨時(shí)狀態(tài),下一個(gè)狀態(tài)將是StandAlone獨(dú)立的。
Unconnected 懸空:是嘗試連接前的臨時(shí)狀態(tài),可能的下一個(gè)狀態(tài)為WFconnection 和 WFReportParams
Timeout 超時(shí):與對等節(jié)點(diǎn)連接超時(shí),也是臨時(shí)狀態(tài)
WFConnection 等待和對等節(jié)點(diǎn)建立網(wǎng)絡(luò)連接
WFReportParams:已經(jīng)建立TCP連接,本節(jié)點(diǎn)等待從對等節(jié)點(diǎn)傳來的第一個(gè)網(wǎng)絡(luò)包
Connected 正常連接
SyncSource:以本節(jié)點(diǎn)為同步源的同步正在進(jìn)行
SyncTarget:以本節(jié)點(diǎn)為同步目標(biāo)的同步正在進(jìn)行

ro:即roles,本地節(jié)點(diǎn)和遠(yuǎn)程節(jié)點(diǎn)的角色,第一次啟動(dòng)drbd時(shí),兩個(gè)drbd節(jié)點(diǎn)默認(rèn)都處于Secondary狀態(tài)。
ds:即disk states,本地和遠(yuǎn)程節(jié)點(diǎn)的硬盤狀態(tài),“Inconsistent/Inconsistent”即“不一致/不一致狀態(tài)”,表示兩個(gè)節(jié)點(diǎn)的磁盤數(shù)據(jù)處于不一致狀態(tài)
C:表示所使用的協(xié)議時(shí)C

以下六個(gè)表示的是I/O狀態(tài)標(biāo)記
r或s : 表示I/O操作正在進(jìn)行, s表示I/O掛起,正常r
-或a : a表示延遲后再同步
-或p : p表示因?yàn)閷Φ葘訂?dòng)同步掛起而引起的數(shù)據(jù)再同步的情況
-或u : u表示因?yàn)楸镜貑?dòng)同步掛起而引起的數(shù)據(jù)再同步的情況
-或d,b,n,a : d表示因?yàn)閐rbd內(nèi)部原因引起的I/O阻塞,類似一種過渡磁盤狀態(tài);b表示備用設(shè)備I/O正在阻塞;n表示網(wǎng)絡(luò)套接字的阻塞;a表示同時(shí)發(fā)生I/O設(shè)備阻塞和網(wǎng)絡(luò)阻塞
-或s : s表示當(dāng)掛起更新的活動(dòng)日志時(shí)的標(biāo)記。

以下的標(biāo)記表示的是性能指標(biāo)(主要前面的4項(xiàng))
ns: 即network send,表示通過網(wǎng)絡(luò)發(fā)送到對等節(jié)點(diǎn)的數(shù)據(jù)量,單位是kbyte
nr: 即network receive,表示通過網(wǎng)絡(luò)接收來自對等節(jié)點(diǎn)的數(shù)據(jù)量
dw: 即disk write,表示寫到本地資產(chǎn)的網(wǎng)絡(luò)數(shù)據(jù)
dr: 即disk read,表示從本地磁盤讀出的網(wǎng)絡(luò)數(shù)據(jù)

4. 設(shè)置主節(jié)點(diǎn)
由于默認(rèn)沒有主次節(jié)點(diǎn)之分,因此需要設(shè)置兩個(gè)主機(jī)的主次節(jié)點(diǎn)。選擇需要設(shè)置為主節(jié)點(diǎn)的主機(jī),然后執(zhí)行如下命令:
**[root@jinbo ~]#drbdsetup /dev/drbd0 primary -o ** #建議使用這條指令
也可以執(zhí)行下面的命令:
[root@jinbo ~]# drbdadm --overwrite-data-of-peer primary all

第一次執(zhí)行上面指令后,如果需要設(shè)置哪個(gè)為主節(jié)點(diǎn),也可以使用另外的一個(gè)命令:
[root@jinbo ~]# /sbin/drbdadm primary mydb 或者 /sbin/drbdadm primary all
-->開始數(shù)據(jù)同步

如果第一次設(shè)置主備節(jié)點(diǎn)使用"/sbin/drbdadm primary mydb"命令,那么會(huì)提示你如下錯(cuò)誤:
0:State change failed:(-2) Need access to UpToDate data
Command '/sbin/drbdsetup 0 primary' terminated with exit code 17
只要第一次執(zhí)行上面的命令成功,以后就可以用“/sbin/drbdadm primary mydb”切換主節(jié)點(diǎn)了。

5. 掛載DRBD設(shè)備
[root@jinbo ~]# mkfs.ext4 /dev/drbd0
[root@jinbo ~]# mount /dev/drbd0 /data/

由于mount操作只能在主節(jié)點(diǎn)進(jìn)行,因此只有設(shè)置了主節(jié)點(diǎn)后才能格式化磁盤分區(qū),同時(shí),在兩個(gè)節(jié)點(diǎn)中,同一時(shí)刻只能有一臺(tái)處于primary,另一臺(tái)處于secondary狀態(tài),而處于secondary狀態(tài)的節(jié)點(diǎn)上不能掛載DRBD設(shè)備,要在備用節(jié)點(diǎn)上掛載DRBD設(shè)備,請往下看~

DRBD主備節(jié)點(diǎn)切換

在系統(tǒng)維護(hù)得時(shí)候,或者在高可用集群中,當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),就需要將主備節(jié)點(diǎn)得角色互換。主備節(jié)點(diǎn)切換有兩種方式,分別是停止drbd服務(wù)切換和正常切換。

1. 停止DRBD服務(wù)切換

關(guān)閉主節(jié)點(diǎn)服務(wù),此時(shí)掛載的DRBD分區(qū)就自動(dòng)在主節(jié)點(diǎn)卸載了,操作如下:
[root@master-drbd /]#/etc/init.d/drbd stop
Stopping all DRBD resources:

然后查看備用節(jié)點(diǎn)的DRBD狀態(tài):
[root@slave-drbd ~]#cat /proc/drbd
從輸出可以看到,現(xiàn)在的主節(jié)點(diǎn)的狀態(tài)變?yōu)?unknown",接著在備用節(jié)點(diǎn)執(zhí)行切換命令:
[root@slave-drbd ~]#drbdadm primary all #此命令會(huì)報(bào)錯(cuò)
因此,必須在備用節(jié)點(diǎn)執(zhí)行如下命令:

[root@slave-drbd ~]#drbdadm /dev/drbd0 primary -o
或者
[root@slave-drbd ~]#drbdadm --overwrite-data-of-peer primary all

現(xiàn)在就正常切換了,接著查看此節(jié)點(diǎn)的狀態(tài)。可以看出,原來的備用節(jié)點(diǎn)已經(jīng)處于primary狀態(tài),而原來的主節(jié)點(diǎn)由于DRBD服務(wù)未啟動(dòng),還處于Unknown狀態(tài),在原來的主節(jié)點(diǎn)服務(wù)啟動(dòng)后,會(huì)自動(dòng)變?yōu)镾econdary狀態(tài),無需在原來的主節(jié)點(diǎn)上再次執(zhí)行切換到備用節(jié)點(diǎn)的命令
最后,在新的主節(jié)點(diǎn)上掛載DRBD設(shè)備完成主備節(jié)點(diǎn)的切換

2. 正常切換
  首先在主節(jié)點(diǎn)卸載磁盤分區(qū):
[root@master-drbd /]#umount /data
   然后執(zhí)行:
[root@master-drbd /]#drbdadm secondary mydb
   此時(shí)查看DRBD的狀態(tài)
[root@master-drbd /]#cat /proc/drbd
   可以看到,兩個(gè)節(jié)點(diǎn)都處于“Secondary”狀態(tài)了,那么接下來就要指定一個(gè)主節(jié)點(diǎn)

在備用節(jié)點(diǎn)上執(zhí)行如下命令:
[root@slave-drbd ~]#drbdadm primary all
[root@slave-drbd ~]#cat /proc/drbd
    至此,主備節(jié)點(diǎn)成功切換角色。最后在新的主節(jié)點(diǎn)上掛載DRBD磁盤即可

腦裂的處理

drbd的對等節(jié)點(diǎn)如果不在線的話,即主節(jié)點(diǎn)的數(shù)據(jù)更改如果無法及時(shí)傳送到備節(jié)點(diǎn)達(dá)到一定時(shí)間,會(huì)造成數(shù)據(jù)不一致,即使故障節(jié)點(diǎn)離線后恢復(fù),drbd可能也不能正常同步了。或者另外一種情況,主備都在線,但心跳網(wǎng)絡(luò)斷了而出現(xiàn)腦裂,兩個(gè)節(jié)點(diǎn)都認(rèn)為自己是主節(jié)點(diǎn),也會(huì)造成兩個(gè)節(jié)點(diǎn)的數(shù)據(jù)不一致,這樣需要人工干預(yù),告訴drbd以哪個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn),或者在dbrd配置腦裂的行為。下面是長時(shí)間備節(jié)點(diǎn)不在線后出現(xiàn)的情況:

查看備用節(jié)點(diǎn)的狀態(tài):
[root@slave-drbd ~]#cat /proc/drbd
1:cs:StandAlone ro:Secondary/Unknown ds:UpToDate/Unknown 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:57596

cs(連接狀態(tài)),孤立的
ro(角色)
ds(磁盤狀態(tài))是uptodate/unknown,本地節(jié)點(diǎn)處于正在更新狀態(tài),而對等節(jié)點(diǎn)為unknown狀態(tài)。 從以上可以看出,備節(jié)點(diǎn)發(fā)生了drbd腦裂。

發(fā)生腦裂后,需要認(rèn)為確認(rèn)哪個(gè)節(jié)點(diǎn)有最新的數(shù)據(jù),那么就以哪個(gè)節(jié)點(diǎn)為主,比如發(fā)生腦裂后,主節(jié)點(diǎn)master-drbd數(shù)據(jù)最新,那么就以master-drbd節(jié)點(diǎn)數(shù)據(jù)為準(zhǔn),然后進(jìn)行恢復(fù)和手動(dòng)同步。

手動(dòng)恢復(fù)腦裂
步奏如下:

  1. 在slave-drbd從節(jié)點(diǎn)上設(shè)置為從節(jié)點(diǎn),并丟棄資源數(shù)據(jù)
#drbdadm secondary mydb   #首先讓此drbd節(jié)點(diǎn)為從節(jié)點(diǎn)
#drbdadm disconnect mydb   #關(guān)閉主從連接,如果提示需要關(guān)閉的話
#drbdadm --discard-my-data connect mydb  #從節(jié)點(diǎn)同步數(shù)據(jù),并且discard自己的數(shù)據(jù)
  1. 在master-drbd主節(jié)點(diǎn)上手動(dòng)連接資源
    [root@master-drbd /]#drbdadm connect mydb

這樣,就解決了腦裂的問題,主從節(jié)點(diǎn)又開始同步數(shù)據(jù)了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、DRBD簡介 DRBD的全稱為:Distributed ReplicatedBlock Device(DRBD...
    淺色的嗥嘯閱讀 2,278評論 0 5
  • 簡介 什么是DRBD DRBD (Distributed Replicated Block Device,分布式復(fù)...
    Lisong閱讀 3,383評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 安裝配置(node1/node2上操作) 1、準(zhǔn)備: 兩個(gè)節(jié)點(diǎn)node1和node2均按照centos6.5系統(tǒng),...
    宇信智臻sy閱讀 1,694評論 1 1
  • 一、載物門匾,家風(fēng)永存 窗外,陽光明媚,春風(fēng)撫葉,直發(fā)出“沙沙”的聲音。今年的清明節(jié),天氣可是“清明時(shí)節(jié)雨紛紛嗎”...
    夕月幽窗閱讀 955評論 0 7

友情鏈接更多精彩內(nèi)容