一、簡介:
近年來研發的軟件級別的文件共享設備,簡單說就是講兩臺主機的磁盤塊設備(大小相同),做成一個跨主機的raid1磁盤(磁盤鏡像),文件間的複製通過tcp/ip協議進行。
分佈式複製塊設備,就是實現跨主機間的不同硬盤通過鏡像連接起來,實現類似raid1的功能,數據的複製是在塊級別上,而非文件級別.
DRBD就是通過在不同主機上使用相同的磁盤分區,然後啓動一個drbd的內核模塊,就可以實現drbd的功能,分佈式文件系統的關鍵還是如何應對在多個用戶針對同一個文件進行寫操作時,應該如何保證文件不會崩潰。DRBD並不是真正意義上的狹義的分佈式文件管理系統。
因此對於drbd模式,其工作方式是主從模式的,當有多個節點工作時,只能有一個節點處於主動狀態,可以有寫操作。
縱觀數據和存儲的發展,我們可以看到,最初的結合就是一臺主機內通過ide線纜連接一個或多個磁盤,後來發展了不同的接口比如scsi、sata、sas等接口。後來由於磁盤的廉價和主機機箱空間的限制,出現的DAS的存儲方式,實質上就是延長了ide線纜,這時通常使用專用的線纜連接。然後爲了保證傳輸速率的提升、減少內核負載出現了光纖SAN設備,既提升了速度,減少了cpu負載又保證了磁盤的冗餘,應爲這時可以使用各種raid來對磁盤進行組合。但是光纖SAN 價格昂貴,又出現ipSAN ,減低成本,最廉價的應該就是DRBD了,實現的同樣是存儲的“分佈式數據複製“功能。
以上說的都是物理形式的改變,對於邏輯上,是這樣變化的。最初一個主機使用一個磁盤(獨佔),所以他的磁盤文件系統就是ext3、ntfs等單機文件系統。同樣是隨着磁盤的廉價,大量磁盤組建陣列,出現了多個主機共享一個存儲空間的情況,最開始要求每個主機掛載的分區都不能相同,否則會造成多主機同時寫入同一個文件會操作混亂和崩潰。於是產生了文件鎖機制,這種鎖是在主機的內核中管理的,目的就是可以多主機共享一個磁盤分區,並保證一個人寫其他人不能同時寫的情況,這種就是集羣文件系統。
集羣文件系統和高可用結合的原因,是因爲分佈式文件系統需要一個鎖機制,這個鎖機制默認是在節點的內核中完成的,爲了降低節點的負擔,出現了分佈式鎖管理器(DLM),專門用來管理”鎖“,並將這種鎖設定爲資源,通過類似的crm進行管理,這個是管理鎖的軟件要求,並非全部,同時也要求磁盤分區的文件系統也要採用集羣文件系統或者分佈式文件系統。
二、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協議將影響流量,從而影響網絡時延。爲了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議
五、前提條件說明
(1)節點之間需要傳遞事務信息,節點之間識別節點是通過節點名稱實現,所以需要DNS解析,將相應IP對應節點名稱,但是如果依賴DNS服務器時,高可用集羣服務又增大了風險,爲了避免DNS服務器存在的隱患,配置解析時直接使用本地/etc/hosts配置文件定義
(2)節點名稱必須要與‘uname–n’命令顯示的名稱一致
(3)高可用集羣節點的管理,比如停止某一節點時,是不能在自身這個節點停止其服務,需要在一個運行正常的節點上停止其他節點;所以,提供ssh互信通信(配置每個節點基於密鑰的方式與節點進行通信)
(4)時間需要同步
(5)兩個節點上各有一個相同大小的磁盤或者分區(未格式化),並在內核中啓用drbd功能。
集羣文件系統(分佈式文件系統)
GFS2:global file system
OCFS2:oracle file system
六、配置文件
global:全局配置屬性
common:用於存放多個“組”中,屬性相同的內容
drbd resource:每個組特有的資源屬性,存放在/etc/drbd.d/目錄下。
三、安裝drbd,默認情況下就已經集成安裝了heartbeat,pacemake資源管理工具,如果要使用rgmanager,需要使用--with-rgmanager參數。
rhel5,centos5:
用戶層:drbd
內核層:kmod-drbd
rhel6,centos6:
用戶層工具:drbd
內核層工具:drbd-kmdl
查看drbd狀態信息:
cat /proc/drbd
Drbd-overview
對drbd資源進行升級和降級操作:
drbdadm primary resourcename
drbdadm secondaryresourcename
drbd的三種協議類型:
A:異步協議
B:半同步協議
C:默認協議,同步協議
1下載安裝drbd-8.4,需要預裝gcc、make,flex,glibc等組件
[[email protected] /etc/yum.repos.d]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz
--2017-04-17 11:37:47-- http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz
正在解析主機 oss.linbit.com... 212.69.161.111
正在連接 oss.linbit.com|212.69.161.111|:80... 已連接。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:650733 (635K) [application/x-gzip]
2、編譯安裝,如果要啓用內核模塊加載方式,需要安裝kernel-devel然後在make的時候添加KDIR=‘/usr/src/kernels/‘這樣的參數,這裏我用得是8.4.4.4版本,之前的8.4版本安裝不上去,暈。
[[email protected] ~/drbd-8.4.4/drbd]# yum -y install gcc flex wget make kernel-devel kernel-headers Git libxslt rpm-build automake autoconf
[[email protected] ~/drbd-8.4.4]# ./configure --prefix=/usr/local/drbd --sysconfdir=/etc/drbd --with-km
[[email protected] ~/drbd-8.4.4]# make KDIR="/usr/src/kernels/`uname -r`/"
[[email protected] ~/drbd-8.4.4]#make install
[[email protected] ~/drbd-8.4.4]# cd drbd //進入drbd子目錄
[[email protected] ~/drbd-8.4.4/drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/ //複製drbd.ko 到內核模塊目錄。
[[email protected] ~/drbd-8.4.4/drbd]# depmod //創建模塊依賴關係列表
[[email protected] ~/drbd-8.4.4/drbd]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/ //複製啓動腳本到init.d目錄
[[email protected] ~/drbd-8.4.4/drbd]# modprobe drbd //加載drbd模塊到內核
[[email protected] ~/drbd-8.4.4/drbd]# lsmod |grep drbd //查看加載的內核
drbd 327018 0
libcrc32c 1246 2 drbd,ip_vs
3、指定drbd要使用的磁盤資源,我這裏是掛載一個磁盤,然後給他們創建相同的分區即可。
4、配置global_common.conf文件。
[[email protected] /etc/drbd/drbd.d]# vi global_common.conf
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; 數據同步寫入方式。
handlers { ##腦裂處理機制,通過腳本進行處理,效果有待商榷。
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
wfc-timeout 120;
degr-wfc-timeout 120;
}
options { ##設定CPU的
# cpu-mask on-no-data-accessible
}
disk { ##磁盤相關的全局配置
# 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
on-io-error detach;
}
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
cram-hmac-alg “sha1”;
shared-secret “mypasswd”;
}
syncer {
rate 1000M;
}
}
~
5、定義一個資源,首先要在/etc/drbd.d/目錄下創建一個.res結尾的文件。
[[email protected] /etc/drbd/drbd.d]# vi web.res
resource web {
on node5.dtedu.com {
device /dev/drbd0; 定義DRBD虛擬塊設備,這個設備不要事先不要格式化
disk /dev/sdb1; 定義存儲磁盤爲/dev/sda6,該分區創建完成之後就行了,不要進行格式化操作
address 10.40.0.225:7789; 定義DRBD監聽的地址和端口,以便和對端進行通信
meta-disk internal;}
on node6.dtedu.com {
device /dev/drbd0;
disk /dev/sdb1;
address 10.40.0.226:7789;
meta-disk internal;}
}
6、複製配置文件到其他節點上。
[[email protected] /etc/drbd/drbd.d]# scp ./* node6:/etc/drbd/drbd.d/
global_common.conf 100% 1816 1.8KB/s 00:00
web.res 100% 243 0.2KB/s 00:00
7、初始化資源,分別在兩個節點上執行。資源名就是web.res中寫道的web名稱。
[[email protected] /etc/drbd/drbd.d]# drbdadm create-md web
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 6948th user to install this version
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
8、啓動服務,並查看啓動狀態
[[email protected] ~/drbd-8.4.4]# service drbd start
Starting DRBD resources: [
create res: web/usr/local/drbd/var/run/drbd: No such file or directory
prepare disk: web/usr/local/drbd/var/run/drbd: No such file or directory
adjust disk: web
adjust net: web
]
outdated-wfc-timeout has to be shorter than degr-wfc-timeout
outdated-wfc-timeout implicitly set to degr-wfc-timeout (120s)
.....
.....
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 120 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 120 seconds. [wfc-timeout]
(These values are for resource 'web'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 11]: To abort waiting enter 'yes' [ -- ]:
.
[[email protected] ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by [email protected], 2017-04-17 16:24: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:104392
可以看到 ro:Secondary/Secondary都是secondary,需要設置一個爲主的節點,並且ds:Inconsistent/Inconsistent數據狀態也是未同步的。
9、在需要設置爲主節點的服務器上運行以下命令,如果要將從節點變爲主節點,需要先降級主節點,再升級從節點。(分別在各個節點上運行)
[[email protected] ~/drbd-8.4.4]# drbdadm primary --force web
[[email protected] ~/drbd-8.4.4]# watch -n 1 'cat /proc/drbd'
Every 1.0s: cat /proc/drbd Wed Apr 19 02:59:01 2017
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by [email protected], 2017-04-19 01:44:43
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:104392 nr:0 dw:0 dr:105064 al:0 bm:7 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[[email protected] ~/drbd-8.4.4]# drbdadm secondary web
[[email protected] ~/drbd-8.4.4]# drbd-overview
0:web/0 Connected Secondary/Primary UpToDate/UpToDate C r-----
[[email protected] ~]# drbd-overview
0:web/0 Connected Primary/Secondary UpToDate/UpToDate C r-----
[[email protected] ~]#
10、格式化主節點的分區,並掛載,這個格式化只在主節點進行即可,不用對從節點磁盤進行格式化,因爲這個會自動進行。
[[email protected] ~/drbd-8.4.4]# mkfs.ext3 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
文件系統標籤=
操作系統:Linux
塊大小=1024 (log=0)
分塊大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
26104 inodes, 104392 blocks
5219 blocks (5.00%) reserved for the super user
第一個數據塊=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
正在寫入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
注意:drbd掛載上主磁盤的時候,如果主磁盤故障或者需要更改被磁盤到主磁盤狀態,需要先umount磁盤,才能修改主從關係並重新掛載。這也就是說如果掛載的磁盤壞了,需要人工干預。
改變主從關係時出現以下錯誤,也是因爲沒有卸載磁盤。
0: State change failed: (-12) Device is held open by someone
drbd實現雙主模型的條件:
1、使用高可用集羣工具
2、資源使用集羣文件系統
高可用集羣一般配置規律:
1、關閉開機啓動功能
2、實現高可用前確定單個服務(資源)啓動、關閉正常,及手動切換正常。
3、關閉stonith,stonith-enabled=false()
4、關閉quorum no-quorum-policy=ignore
drbd+pacemaker實現高可用:
1、關閉stonith和quorum,關閉drbd服務,及關閉開機啓動drbd服務。
crm configure property stonith-enabled=false
Crm configure property no-quorum-policy=ignore
[[email protected] ~]# service drbd stop
Stopping all DRBD resources: .
[[email protected] ~]# chkconfig drbd off
[[email protected] ~]#
2、定義drbd資源,可使用ocf:linbit(ocf:heartbeat已經過期),查看使用方法
[[email protected] ~]# pcs resource describe ocf:linbit:drbd
[[email protected] ~]# crm ra meta ocf:linbit:drbd
3、定義資源,需要首先在dbrd配置文件中創建資源,/etc/drbd/drbd.d/目錄下。(需要在兩個節點上都進行設置)
[[email protected] ~]# crm
crm(live)# configure
crm(live)configure# primitive mysql_drbd ocf:linbit:drbd params drbd_resource=web op monitor role=Master interval= timeout= op monitor role=Slave interval= timeout= op start timeout=240 op stop timeout=100
crm(live)configure# verify
crm(live)configure# commit
參數詳解:
role=指明監控對象,通常是master、salve
interval=監控時間間隔,當只設置了參數沒有給具體數值的時候,按照默認值設定。
timeout=監控聯繫超時時間
4、定義主從資源,並將內容提交。
crm(live)configure# master ms_mysql_drbd mysql_drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
crm(live)configure# verify
WARNING: web-store: specified timeout 30s for monitor is smaller than the advised 40
crm(live)configure# commit
crm(live)configure#
難點:通常只有主資源纔可以定義主從模式。
master-max:定義可以提升爲主狀態(活動/master)的資源最大有幾個,對於drbd來說是1個。
master-node-max:在單個物理節點上可以運行的最大主資源(master)數量。
clone-max:最大允許運行的副本數量(clone),這裏需要說明一下,前面創建的primitive是不會實際運行的,運行的是它產生的副本,所以需要兩個副本,一個master一個salve。
clone-node-max:一個物理節點最多運行多少個副本
notify:通知狀態信息。
globally-unique:資源要求全局唯一。
5、查看資源狀態
故障處理:
狀態:
[[email protected] ~]# crm status
Stack: classic openais (with plugin)
Current DC: node5.dtedu.com (version 1.1.15-5.el6-e174ec8) - partition WITHOUT quorum
Last updated: Wed May 10 11:02:45 2017 Last change: Wed May 10 11:02:34 2017 by root via cibadmin on node5.dtedu.com
, 2 expected votes
2 nodes and 2 resources configured
Node node5.dtedu.com: standby
OFFLINE: [ node6.dtedu.com ]
Full list of resources:
Master/Slave Set: ms_mysql_drbd [mysql_drbd]
mysql_drbd (ocf::linbit:drbd): FAILED node5.dtedu.com (blocked)
Stopped: [ node6.dtedu.com ]
Failed Actions:
* mysql_drbd_stop_0 on node5.dtedu.com 'not configured' (6): call=6, status=complete, exitreason='none',
last-rc-change='Wed May 10 09:07:45 2017', queued=0ms, exec=24ms
1、
Node node5.dtedu.com: standby
OFFLINE: [ node6.dtedu.com ]
此類故障通常是說明兩個節點之間沒有進行連接通信,可以堅持iptables、getenforce、ntpdate、ssh互信、bindnetaddr(corosync配置文件的監聽地址)。