1》DRBD介紹 1>數據鏡像軟體DRBD介紹 分散式塊設備複製(Distributed Relicated Block Deivce,DRBD),是一種基於軟體、基於網路的塊複製存儲解決方案,主要用於對伺服器之間的磁碟分 區、邏輯捲等進行數據鏡像,當用戶將數據寫入本地磁碟時,還會將數據發送到網路中 ...
1》DRBD介紹
1>數據鏡像軟體DRBD介紹
分散式塊設備複製(Distributed Relicated Block Deivce,DRBD),是一種基於軟體、基於網路的塊複製存儲解決方案,主要用於對伺服器之間的磁碟分 區、邏輯捲等進行數據鏡像,當用戶將數據寫入本地磁碟時,還會將數據發送到網路中另一臺主機的磁碟上,這樣的本地主機(主節點)與遠程主機(備節點) 的數據就可以保證實時同步,當本地主機出現問題,遠程主機上還保留著一份相同的數據,可以繼續使用,保證了數據的安全;
2>DRBD的基本功能
DRBD的核心功能就是數據的鏡像,其實現方式是通過網路來鏡像整個磁碟設備或者磁碟分區,將一個節點的數據通過網路實時地傳送到另外一個遠 程節點,保證兩個節點間數據的一致性,這有點類似於一個網路RAID1的功能,對於DRBD數據鏡像來說,它具有如下特點:
實時性: 當應用對磁碟數據有修改操作時,數據複製立即發生;
透明性: 應用程式的數據存儲在鏡像設備上是透明和獨立的,數據可以存儲在基於網路不同伺服器上;
同步鏡像: 當本地應用申請寫操作時,同時也在遠程主機上開始進行寫操作;
非同步鏡像: 當本地寫操作已經完成時,才開始對遠程主機上進行寫操作;
3>DBRD的構成
DRBD是Linux內核存儲層中的一個分散式存儲系統,具體來說兩部分構成,
(1) 一部分:內核模板,主要用於虛擬一個塊設備;
(2) 一部分:是用戶控制項管理程式,主要用於和DRBD內核模塊通信,以管理DRBD資源,
在DRBD中,資源主要包含DRBD設備,磁碟配置,網路配置等;
一個DRBD系統有兩個以上的節點構成,分為主節點和備節點兩個角色,在主節點上,可以對DRBD設備進行不受限制的讀寫操作,可以用初始化、創 建、掛在文件系統,在備節點上,DRBD設備無法掛載,只能用來接收主節點發送過來的數據,也就是說備節點不能用於讀寫訪問,這樣的目的是保證數據 緩衝區的一致性;
主用節點和備用節點不是一成不變的。可以通過手工的方式改變節點的角色,備用節點可以升級為主節點,主節點也降級為備節點;
DRBD設備在整個DRBD系統中位於物理塊設備上,文件系統之下,在文件系統和物理磁碟之間形成了一個中間層,當用戶在主節點的文件系統中寫入 數據時,數據被正式寫入磁碟前會被DRBD系統截獲,同時,DRBD在捕捉到有磁碟寫入的操作時,就會通知用戶控制項管理程式把這些數據複製一份。寫入 遠程主機的DRBD鏡像,然後存入DRBD鏡像所有映射的遠程主機磁碟;
DRBD負責接收數據,把數據寫到本地磁碟,然後發送給另一臺主機,另一臺主機再將數據存到自己的磁碟中,目前,DRBD每次只允許對一個節點 進行讀寫訪問,這對於通常的故障切換高可用性集群來講已經足夠用了;
4>DRBD與集群的關係
DRBD由兩個或者兩個以上節點構成,與HA集群類似,也有主節點和備節點之分,因而經常用於高可用集群和負載集群系統中作,由於DRBD系 統是在IP網路運行,所以,在集群中使用DRBD作為共用存儲設備,不需要任何硬體投資,可以節約很多成本,因為在價格上IP網路要比專用的存儲網路更加 經濟。另外DRBD也可以用於數據備份、數據容災等方面;
5>DRBD的主要特性
DRBD系統在實現數據鏡像方面有很多有用的特性,我們可以根據自己的需求和應用環境,選擇合適自己的功能特性。下麵介紹DRBD幾個非常重要的特 性:
(1)單主模式:
這是使用最頻繁的一種模式,主要用於在高可用集群的數據存儲方面,解決集中數據共用的問題,在這種模式下,集群中只有一個主節點可以對數據 進行讀寫操作,可以用在這種模式下的文件系統有EXT3 EXT4 XFS等;
(2)雙主模式:
這種模式只能在DRBD8.0以後的版本使用,主要用於負載均衡集中,解決數據共用和一致性問題,在這種模式下,集群中存在兩個主節點,由於兩個 主節點都有可能對數據進行併發操作的讀寫操作,因此單一的文件系統就無法滿足需求了,因此需要共用的集群文件系統來解決併發讀寫問題,常用在這 種模式下的文件系統有GFS,OCFS2等,通過集群文件系統的分散式鎖機制就可以解決集群中兩個主節點同時操作數據的問題;
(3)複製模式
DRBD提供了三種不同的複製方式,分別是;
協議A: 只要本地磁碟寫入已經完成,數據包已經在發送隊列中,則認為一個寫操作過程已經完成,這種方式在遠程節點故障或者網路故障時,可能造成 數據丟失,因為要寫入到遠程節點的數據可能還在發送隊列中;
協議B:只要本地磁碟寫入已經完成,並且數據包已經到達遠程節點,則認為一個寫操作過程已經完成,這種方式在遠程節點發生故障時,肯能造成數據丟 失;
協議C: 只有本地和遠程節點的磁碟已經都確認了寫操作完成,則認為一個寫操作過程已經完成,這種方式沒有任何數據丟失,就目前而已應用最多,最廣 泛的就是協議C,旦在此方式下磁碟的I/O的吞吐量依賴於網路帶寬,建議在網路帶寬比較好的情況下使用這種方式。
protocol C; #使用drbd的同步協議
(4)傳輸的完整性校驗
這個特性在DRBD8.20及以後版本中可以使用,DRBD使用MD5、SHA-1,或者CRC 32C等加密演算法對信息進行終端到終端的完整性驗證,利用這個特 性,DRBD對每一個複製到遠程節點數據都生成信息摘要,同時,遠程節點也採用同樣的方式對複製的數據塊進行完整性驗證,如果驗證信息不對,就請求 主節點重新發送,通過這種方式保證鏡像數據的完整性和一致性;
(5)腦裂通知和自動修複。
由於集群節點之間的網路連接臨時故障、集群軟體管理干預或者人為錯誤,導致DRBD兩個節點都切換為主節點而斷開連接,這就是DRBD的腦裂問 題,發生腦裂意味著數據不能同步從主節點複製到備用節點,這樣導致DRBD兩個節點的數據不一致,並且無法合併, 在DRBD8.0以及更高的版本,實現了 腦裂自動修複功能,在DRBD8.2.1之後。又實現了腦裂通知特性,在出現腦裂後,一般建議通過手工方式修複腦裂問題;
2》DRBD安裝
1>環境描述
系統版本:redhat6.4 x64(內核2.6.32)
DRBD版本: DRBD-8.4.3
node1: 10.0.0.201(主機名:master)
node2: 10.0.0.202 (主機名:slave)
(node1)為僅主節點配置 Primary
(node2)為僅從節點配置Secondary
(node1,node2)為主從節點共同配置
2>伺服器時間同步以及關閉防火牆Selinux
#/etc/init.d/iptables stop 關閉防火牆
#setenforce 0 關閉Selinux
# cat /etc/selinux/config
SELINUX=disabled
#ntpdate -u asia.pool.ntp.org 真實環境這樣同步
# date –s “2014-09-24 15:55:33” 測試時間。臨時可以這樣同步,兩台機器都迅速執行此命令
3>修改主機名
#:vim /etc/sysconfig/network 主節點 201
HOSTNAME=master
#:vim /etc/sysconfig/network 從節點202
HOSTNAME=slave
如果使用虛擬機器做測試,還沒有增加硬碟的的話,請關閉虛擬機器,開始增加一塊硬碟,如果原有的虛擬機硬碟還有空間的話。拿出一塊空間,做一個分 區也行;
4>所有節點增加硬碟
在主節點201 和從節點202上。劃分增加的/dev/sdb 硬碟。進行分區
# fdisk /dev/sdb
分一個叫做/dev/sdb1分區出來就可以,註意千萬不要格式化它,劃分出來就行了,不需要格式化;
5>所有的節點安裝
在主節點201和從節點202上同時安裝
# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
# tar zxvf drbd-8.4.3.tar.gz
# cd drbd-8.4.3
# ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat km代表開啟內核模塊
./configure命令中添加--with-heartbeat,安裝完成後會在/usr/local/drbd/etc/ha.d /resource.d生成drbddisk和drbdupper文件,把這兩個文件複製 到/usr/local/heartbeat/etc/ha.d /resource.d目錄,命令cp -R /usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d;
# make KDIR=/usr/src/kernels/2.6.32-279.el6.x86_64/
# make install
# mkdir -p /usr/local/drbd/var/run/drbd
# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
# chkconfig --add drbd
# chkconfig drbd on
載入DRBD模塊:
# modprobe drbd
查看DRBD模塊是否載入到內核:
# lsmod |grep drbd
6>所有節點配置文件
在主節點201和從節點202 配置文件保持一致。
# /usr/local/drbd/etc/drbd.conf
drbd.conf 包含了2個類型的文件。為了方便起見全局配置和資源配置分開了。global_common.conf為固定全局配置文件,*.res 可以包含多個,跟 Nginx虛擬機器一樣*.res 帶包含了所有的資源文件;
(1) 修改全局配置文件:
global {
usage-count yes; #
是否參加drbd的使用者統計,預設此選項為yes
# 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; #
設置主備節點同步時的網路速率
}
}
(2)創建資源配置文件
資源文件需要自己手工創建,目錄是在/usr/local/drbd/etc/drbd.d下麵
#cd /usr/local/drbd/etc/drbd.d
# vim drbd.res
resource r1 { #這個r1是定義資源的名字
on master{ #on開頭,後面是主機名稱
device /dev/drbd0; #drbd設備名稱
disk /dev/sdb1; #drbd0使用的磁碟分區為sdb1
address 10.0.0.201:7789; #設置drbd監聽地址與埠
meta-disk internal;
}
on slave{ #on開頭,後面是主機名稱
device /dev/drbd0; #drbd設備名稱
disk /dev/sdb1; #drbd0使用的磁碟分區為sdb1
address 10.0.0.202:7789; #設置drbd監聽地址與埠
meta-disk internal;
}
}
7>激活節點啟動服務
在主節點201 從節點202 做同樣的操作
(1)激活和創建設備塊
# mknod /dev/drbd0 b 147 0
# drbdadm create-md r1 資源名稱為r1
等待片刻,顯示success表示drbd塊創建成功
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
(2)如果卡主不動了。再次輸入該命令:
# drbdadm create-md r1
成功激活r0
----------------
[need to type 'yes' to confirm] yes
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
(3)準備啟動服務: 啟動DRBD服務:(node1,node2)
註:需要主從共同啟動方能生效
# service drbd start
(4)查看狀態:(node1,node2)
# cat /proc/drbd 或 # service drbd status
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected],
2013-05-27 20:45:19
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:1060184
這裡ro:Secondary/Secondary表示兩台主機的狀態都是備機狀態,ds是磁碟狀態,顯示的狀態內容為“不一致”,這是因為DRBD無法判斷哪一方 為主機,應以哪一方的磁碟數據作為標準;
(5)授權節點201為,主節點
# drbdsetup /dev/drbd0 primary --force
(6)分別查看主從DRBD狀態:
1)(主節點201 node1)
# service drbd status
--------------------
drbd driver loaded OK; device status:
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected],
2017-10-16 20:45:19
m:res cs ro ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C
===============================================================================
.2)(從節點202 node2)
# service drbd status
drbd driver loaded OK; device status:
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected],
2017-10-16 20:49:06
m:res cs ro ds p mounted fstype
0:r0 Connected Secondary/Primary UpToDate/UpToDate C
---------------------
ro在主從伺服器上分別顯示 Primary/Secondary和Secondary/Primaryds顯示UpToDate/UpToDate表示主從配置成功。
8>掛在drbd0設備(主節點201)
從剛纔的狀態上看到mounted和fstype參數為空,所以我們這步開始掛載DRBD到系統目錄
# mkdir /data
# mkfs.ext4 /dev/drbd0
# mount /dev/drbd0 /data
註:Secondary節點上不允許對DRBD設備進行任何操作,包括只讀,所有的讀寫操作只能在Primary節點上進行,只有當Primary節點掛掉時, Secondary節點才能提升為Primary節點繼續工作
9>模擬DRBD1 故障,DRBD2()接管並提升為Primary
1)(節點201 node1) 故障
# cd /data
# touch 1 2 3 4 5
# cd ..
# umount /data
# drbdsetup /dev/drbd0 secondary 故障後。降級為從
註:這裡實際生產環境若DRBD1宕機,在DRBD2狀態信息中ro的值會顯示為Secondary/Unknown,只需要進行DRBD提權操作即可。
# service drbd status
(節點202 node2 提權為主)
# drbdsetup /dev/drbd0 primary 提權為主
# mount /dev/drbd0 /data
# cd /data
# touch 6 7 8 9 10
# ls
1 10 2 3 4 5 6 7 8 9 lost+found
# service drbd status
不過如何保證DRBD主從結構的智能切換,實現高可用,這裡就需要Heartbeat來實現了,Heartbeat會在DRBD主端掛掉的情況下,自動切換從端為主 端並自動掛載/data分區;
總結: 這裡是DRBD官方推薦的手動恢復方案:
假設你把Primary的eth0宕掉,然後直接在Secondary上進行主Primary主機的提升,並且mount上,你可能會發現在 Primary上測試考入的文件確實同 步過來了,之後把Primary的eth0恢復後,看看有沒有自動恢復 主從關係。經過查看,發現DRBD檢測出了Split-Brain的狀況,也就是兩個節點都處於standalone 狀態,故障描述如下:Split- Brain detected,dropping connection! 這就是傳說中的“腦裂” ;
(node2)
# drbdadm secondary r0
# drbdadm disconnect all
# drbdadm --discard-my-data connect r0
(node1)
# drbdadm disconnect all
# drbdadm connect r0
# drbdsetup /dev/drbd0 primary