1.drbd簡介
drbd是通過網絡(tcp連接)在不同服務器之間實現基於block級別進行數據實時同步的軟件。類似於inotify+rsync,只不過inotify+rsync是按文件級別來同步的,而drbd是工作在文件系統下層的,實現的是block同步和拷貝,效率相對較高。且inotify+rsync是通過監控事件來實現實時同步的,而drbd則跟普通寫入磁盤的過程一樣,只不過多了一條寫入網卡的分支路線。
如下圖,此處只是簡單的示意圖。更具體的原理圖見下文。
drbd只能在分區上、LVM邏輯卷上或整塊磁盤上實現,不能在某一個目錄上實現。
drbd支持同步、半同步、異步三種數據同步的方式。
drbd支持腦裂(brain split)通知和自動恢復。
2.drbd工作原理和術語說明
drbd的核心功能是通過Linux內核模塊實現的。特別地,操作系統中的虛擬塊設備(virtual block device)中有它的驅動,因此drbd幾乎處於操作系統I/O堆棧的"最底部"。這使得它非常具有彈性,可以很容易地為服務提供高可用性。
但注意,drbd處於文件系統之下的層次,不能實現文件系統層次的功能,例如檢查文件是否損壞、為文件系統提供高可用等。但它是基於block的,可以做塊設備檢查、同步的完整性檢查等。
2.1 drbd工作原理
drbd實現基於塊級別的數據同步,其實現方式是通過tcp連接來鏡像整個設備。
它有主備節點的概念。在主節點上,可以對drbd設備創建文件系統以供讀取,甚至可以直接IO。在主節點寫入的數據通過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據塊也會通過網絡傳輸到備節點對應的DRBD設備上,最終寫入備用節點的磁盤設備上實現同步。在備用節點上,DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中,無法供外界讀、寫,之所以連讀都提供,是為了維護緩存一致性(cache coherency)的問題。
現在大部分的高可用集群都會使用共享存儲,在實時同步以及數據一致性角度而言,drbd能代替共享存儲。而且,drbd可以配合高可用軟件,實現高可用服務的切換而不會數據丟失,因為備節點和主節點數據是實時同步的,這樣給用戶的體驗是更好的,但卻節約了成本,其性能與穩定性方面也不錯。
下圖是drbd的原理圖。
對於正常的文件系統,寫入數據的流程:buffer-->filesystem--> disk scheduler-->disk driver-->disk
。
而使用drbd時,流程是上圖中的紅色箭頭。在filesystem的下一層加上drbd層,該層將寫入的數據通過drbd發送到tcp套接字的send緩存(send buffer),再通過DMA的方式拷貝到網卡,由網卡發送到備節點。備節點的drbd設備從tcp套接字的recv緩存(recv buffer)中接收數據,然后從drbd設備讀出數據並等待disk scheduler調度寫入到磁盤中。
如果不理解或者理解的不清晰,可先閱讀:不可不知的socket和TCP連接過程。
其中A/B/C是drbd復制的協議級別,如下"drbd復制模型"所述。
2.2 drbd復制協議模型
上面drbd工作原理圖中的A、B、C對應的是drbd的不同復制模型。復制模型指的是數據的寫入執行到哪個過程就認為此次寫操作已經完成。
drbd有三種復制協議:同步、半同步、異步。
A協議
:異步復制(asynchronous),如上圖A標識,指的是當數據寫到本地磁盤上,並且復數據已經復制到tcp的send buffer緩沖區以后,此時就認為寫入磁盤成功。此復制協議性能好,但可能會丟失一些最近的數據。
B協議
:半同步復制(semi sync),也稱為內存復制,如上圖B標識,指的是數據已經寫到本地磁盤上,並且已經被對方的tcp協議棧接收到(即寫入到了對方的recv buffer中),此時就認為此次寫操作成功。此復制協議性能較好,且只有當兩節點都斷電時才會丟失最近處於socket buffer中的數據。因此性能和數據可靠性介於協議A和C之間。
C協議
:同步復制(sync),如上圖C標識,指的是數據已經寫入到本地磁盤,也已經寫入到遠程磁盤上,此時就認為此次寫操作成功。此復制協議性能較差,但數據可靠性高。
C復制協議是drbd默認使用的協議。
2.3 DRBD設備的概念
DRBD設備是操作系統中的一個虛擬塊設備,在Linux上游內核中已經集成了DRBD的塊設備模塊和驅動。它的主設備號(major)為147,次設備號默認從0開始編號。
在一組主機上,drbd設備的設備名稱為/dev/drbdN,這個N通常和它的次設備號一致。
DRBD需要構建在底層設備之上,然后構建出一個塊設備出來。對於用戶來說,一個DRBD設備,就像是一個分區,可以在上面創建文件系統。DRBD所支持的底層設備有以下這些類:
- 1、磁盤或磁盤的某一個分區;
- 2、軟 raid 設備;
- 3、LVM的邏輯卷;
- 4、EVMS(企業卷管理系統,Enterprise Volume Management System);
- 4、其他任何的塊設備,甚至DRBD塊設備自身也能成為另一個DRBD的底層設備。
2.4 drbd資源角色
在drbd構造的集群中,資源具有角色的概念,分別為primary和secondary(主從的概念)。
所有primary的資源將不受限制進行讀寫操作,可以創建文件系統,可以使用裸設備,可以直接io。而所有secondary的設備中不能掛載,不能讀、寫。
2.5 drbd工作模式
-
主從模型master/slave(primary/secondary)
這種機制在某一時刻只允許有一個主節點。主節點的作用是可以掛載使用,寫入數據等;從節點只是作為主節點的鏡像,是主節點的備份,且是不可見的。
這樣的工作機制的好處是可以有效的避免磁盤出現單點故障,而且數據不會錯亂。 -
雙主模型dula primary(primary/primary)
所謂雙主模型是2個節點都可以當做主節點來掛載使用。但會導致數據錯亂。當第一個主節點對某一文件正在執行寫操作,此時另一個節點也正在對同一文件執行寫操作,這種情況會造成數據錯亂,從而導致數據不能正常使用。
解決雙主模型數據混亂的方案是:使用集群(分布式)文件系統,如gfs2。集群文件系統使用分布式文件鎖管理器,當一個節點對文件加鎖之后會通過某種機制來通知其他節點鎖信息,從而實現文件鎖共享。
也可以將兩節點的不同drbd設備分別設置主從,從而實現雙主模型。例如服務器A上的a分區(主)和服務器B上的a分區(從),同時服務器A上的b分區(從)和服務器B上的b分區(主)。
2.6 分區說明
drbd分為兩種分區。其中一個分區是metadata區,用於存儲元數據,給個1G就夠了,2G就非常多了;另一種分區是數據區,這是drbd塊設備的底層設備。因此,大多數情況下需要在drbd的兩節點上創建兩個分區,分別作為metadata區和data區。
注意,metadata區也可以和數據區在同一分區,這時metadata區稱為"內部元數據區(Internal metadata)"。
關於分區有幾點注意:
- 數據區創建完成后不能掛載。
- metadata分區創建完成后不能格式化,也就是不能創建文件系統(要交給drbd來處理)。
- 建議兩邊的數據分區大小給一樣的,否則一端會浪費空間。如何解決此問題后文說明。
3.drbd部署實驗
絕大多數情況下,drbd都是兩節點的,要么是主從工作模式(primary/secondary),要么是結合集群文件系統的主主模式(primary/primary)。很少情況下,可以添加一個第三節點,作為backup角色。
drbd節點最好部署在使用專門的網絡環境下,節點之間可以使用直連模式、back-to-back模式或使用高速網卡。如果中間跨了交換機,建議加上Linux的網卡綁定功能(如不了解,請百度"bonding驅動")。不建議drbd節點之間跨路由器,這會嚴重影響性能。
drbd兩節點之間的數據區應盡量差不多大小。
3.1 實驗環境以及安裝前的准備
drbd的實驗環境:
A服務器上:
管理IP:eth0 192.168.100.49
數據同步IP:eth1 192.168.100.51
B服務器上:
管理IP:eth0 192.168.100.50
數據同步IP:eth1 192.168.100.52
操作系統均為CentOS 7.2,安裝的drbd是8.4版。
-
修改主機名。因為drbd是基於主機名解析的。
hostnamectl set-hostname drbd1.longshuai.com # A服務器上配置 hostnamectl set-hostname drbd2.longshuai.com # B服務器上配置
-
修改hosts文件。最好將主機名配置成數據同步專用通道eth1的地址。
A/B服務器上都配置192.168.100.51 node1.longshuai.com node1 192.168.100.52 node2.longshuai.com node2
-
添加主機路由。
route add -host 192.168.100.52 dev eth1 # A服務器上配置 route add -host 192.168.100.51 dev eth1 # B服務器上配置
-
時間同步。
ntpdate ntp1.aliyun.com # A、B都執行
-
提供分區。
分別在A/B服務器上添加一塊硬盤,然后都分為兩個區。注意,作為metadata的分區不要格式化,而用作data的分區格式化后不要掛載。
此處實驗分區為/dev/sdb1(metadata區)和/dev/sdb5(數據區)。# 在兩節點上執行: # 磁盤熱插 for i in /sys/class/scsi_host/*;do echo "- - -" >$i/scan;done # 分區 # 主分區(metadata區)/dev/sdb1:1G,擴展分區/dev/sdb2,邏輯分區(data區)/dev/sdb5:5G parted /dev/sdb mklabel msdos parted /dev/sdb mkpart p 1 1G parted /dev/sdb "mkpart e 1G -1" parted /dev/sdb mkpart l 1G 6G fdisk /dev/sdb mke2fs -t ext4 /dev/sdb5
3.2 yum安裝drbd
drbd工具分為兩部分:內核模塊(kmod-drbd)和用戶空間的管理工具(drbd-utils),其中內核模塊已經整合到了2.6.33版本及以后版本的上游內核中。如果早於這個版本,則需要安裝和管理工具相同版本的模塊。
在elrepo源中,可以找到drbd的內核模塊和管理工具。因此先配置elrepo源(此處配置清華大學鏡像站的elrepo)。
cat /etc/yum.repos.d/elrepo.repo
[elrepo]
name=elrepo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elrepo/archive/elrepo/el7/x86_64/
enable=1
gpgcheck=0
再安裝drbd84-utils和對應版本的模塊kmod-drbd84。安裝后裝載drbd模塊。
yum -y install drbd84-utils kmod-drbd84 modprobe drbd
如果裝載drbd模塊時發現"not found",說明沒有安裝"kernel", yum -y install kernel 安裝后重啟系統即可。
要想開機加載drbd模塊,則將其寫入/etc/sysconfig/modules/目錄下的"*.modules"文件中,如果是CentOS 6,則可以加入/etc/rc.d/rc.sysinit或/etc/rc.modules。
以下是/etc/sysconfig/modules/drbd.modules文件中的內容,配置后記得賦予x權限。
# drbd module exists?
/usr/sbin/modinfo -F filename drbd &>/dev/null
if [ "$?" -eq 0 ];then
/usr/sbin/modprobe drbd
fi
看看drbd84-utils提供了哪些工具:
[root@node1 ~]# rpm -ql drbd84-utils | grep bin
/usr/sbin/drbd-overview # drbd資源信息查看工具,和cat /proc/drbd功能類似
/usr/sbin/drbdadm # drbd主要的管理工具
/usr/sbin/drbdmeta # drbd元數據區管理工具
/usr/sbin/drbdmon # drbd資源狀態監控工具
/usr/sbin/drbdsetup # drbd更底層的管理工具,直接操作塊設備
其中drbdadm是主要管理工具,可以給其傳遞一些模塊化的命令來調用其他的drbd工具。例如drbdadm create-md
將調用drbdmeta工具。
此外,還提供了/etc/ha.d/resource.d/drbddisk腳本,用於結合heartbeat使用,該腳本用於標記節點塊設備為primary角色並進行文件系統的掛載。
3.3 編譯安裝drbd
測試環境CentOS 6.6
安裝相關程序:
yum -y install gcc make automake autoconf kernel-devel kernel-headers flex libxslt
如果發現更新了kernel版本,則需要重啟系統。重啟后需要重新配置路由,否則兩端不能通信。
下載drbd-utils:wget http://www.drbd.org/download/drbd/utils/drbd-utils-8.9.10.tar.gz
下載drbd軟件:wget http://www.drbd.org/download/drbd/9.0/drbd-9.0.4-1.tar.gz
- 先安裝drbd-utils再安裝drbd
wget http://www.drbd.org/download/drbd/utils/drbd-utils-8.9.10.tar.gz tar xf drbd-utils-8.9.10.tar.gz cd drbd-utils-8.9.10 ./autogen.sh ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/ make install
- 再安裝drbd
tar xf drbd-9.0.4-1.tar.gz cd drbd-9.0.4-1 make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/ make install
- 最后加載drbd模塊
lsmod|grep drbd modprobe drbd lsmod|grep drbd drbd 500374 0 libcrc32c 1246 2 drbd,btrfs
由於重啟模塊不自動加載,可以在/etc/sysconfig/modules/
目錄下新建一個*.modules文件,里面寫入modprobe drbd
,或者在/etc/rc.modules文件(可能不存在)中追加此行。當然,放入到rc.local也是一樣的。