生產(chǎn)環(huán)境下的高可用NFS文件服務器
原創(chuàng)【51CTO.com獨家特稿】一、DRBD簡介
分布式復制塊設備(DRBD,Distributed Replicated Block Device)是一種基于Linux的軟件組件, 它是由內(nèi)核模塊和相關程序而組成的,通過網(wǎng)絡鏡像促進共享存儲系統(tǒng)的替換。也就是說: 當你將數(shù)據(jù)寫入本地的DRBD設備上的文件系統(tǒng)時,數(shù)據(jù)會同時被發(fā)送到網(wǎng)絡中的另外一臺主機之上,并以完全相同的形式記錄在一個文件系統(tǒng)中(實際上文件系統(tǒng)的創(chuàng)建也是由DRBD的同步來實現(xiàn)的)。本地節(jié)點(主機)與遠程節(jié)點(主機)的數(shù)據(jù)可以保證 實時的同步,并保證IO的一致性。所以當本地節(jié)點的主機出現(xiàn)故障時,遠程節(jié)點的主機上還會保留有一份完全相同的數(shù)據(jù),可以繼續(xù)使用,以達到高可用的目的。
在高可用(HA)解決方案中使用DRBD的功能,可以代替使用一個共享盤陣存儲設備。因為數(shù)據(jù)同時存在于本地主機和遠程主機上,在遇到需要切換的時候,遠程主機只需要使用它上面的那份備份數(shù)據(jù),就可以繼續(xù)提供服務
分布式復制塊設備(DRBD)是在90年代末由Philipp Reisner和Lars Ellenberg設想和開發(fā)的。開發(fā)者是為了創(chuàng)建一個Linux安全標準,以最低成本提供最佳的安全保障。分布式復制塊設備的當前版本可以與Linux 的普通版本一起使用,用于在被動系統(tǒng)和主動系統(tǒng)之間進行存儲數(shù)據(jù)的同步復制。數(shù)據(jù)可以在兩個系統(tǒng)同時讀取和輸入。分布式復制塊設備還支持資源級別防護。分布式復制塊設備(DRBD)工程與一組稱為Heartbeat的管理程序一起使用。它已經(jīng)被收集到Linux的一些發(fā)行版中,目前流行的Linux中只有Centos有預編譯好的安裝包和對應內(nèi)核。
分布式復制塊設備(DRBD)是LINBIT信息技術(shù)有限責任公司的一個注冊商標,總部設在奧地利維也納。該軟件已通過通用公共許可證(GNU GPL)發(fā)布,它可以在許可協(xié)議允許的范圍內(nèi)自由分發(fā)和修改。#p#
二、DRBD的工作原理
理解DRBD其實就是網(wǎng)絡RAID-1,二臺服務器中就算其中的某臺因電源或主板損壞而宕機而對數(shù)據(jù)無任何影響(可以用硬盤RAID-1來理解DRBD),而真正的熱切換可以通過Heartbeat來實現(xiàn),這樣切換過程跟Keepalived類似,是非常短及不需要人為干預的。#p#
三、DRBD的使用
DRBD需要構(gòu)建在底層設備之上,然后構(gòu)建出一個塊設備出來。對于用戶來說,一個DRBD設備,就像是一塊物理的磁盤,可以在商脈內(nèi)創(chuàng)建文件系統(tǒng)。DRBD所支持的底層設備有以下這些類:
(1)一個磁盤,或者是磁盤的某一個分區(qū)
(2)一個soft raid 設備
(3)一個LVM的邏輯卷
(4)一個EVMS(Enterprise Volume Management System,企業(yè)卷管理系統(tǒng))的卷
(5)其他任何的塊設備
我們的線上環(huán)境采取的第一種,即用單獨的磁盤來做的DRBD。#p#
四、DRBD的配置過程
我查閱了網(wǎng)上大量的教程類文間,感覺寫得不算是詳細;今天我登陸到服務器上,發(fā)現(xiàn)我的DRBD+Heartbeat已經(jīng)穩(wěn)定運行了161天(海量圖片文件服務器),相當?shù)姆€(wěn)定和高效。如果沒有線上環(huán)境的同學也不要著急,大家完全可以根據(jù)我的文章用VMware workstation6.0+Centos5.x系統(tǒng)實現(xiàn)這個實驗,達到熟練掌握的目的。需要注意的地方我會重點說明,整個測試過程參考生產(chǎn)服務器。
服務器1:centos1.7788.com,單獨拿一塊硬盤sdb作DRBD
服務器2:centos2.7788.com,單獨拿一塊硬盤sdb作DRBD
網(wǎng)絡拓補很簡單:
centos1.7788.com eth0:192.168.4.191,物理bridge連接,eth1:10.0.0.1,這個可以采用虛擬網(wǎng)段VM5
centos2.7788.com eth0:192.168.4.192,物理bridge連接,eth1:10.0.0.2,這個可以采用虛擬網(wǎng)段VM5
VIP: 192.168.4.194,這個是通過Heartbeat來實現(xiàn)的,原理跟Keepalived類似,它通過在某臺服務器的eth0:0上綁定,如果遇到故障就轉(zhuǎn)移,達到高HA的目的;這個同時也是對外提供服務的IP。
Hosts的配置在二臺機器上一樣,不需要太復雜,只配置心跳部分即可,即:
centos1.7788.com 192.168.4.191 centos1
centos2.7788.com 192.168.4.192 centos2
另外關于時間同步一說,蠻多哥哥說要ntpdate,其實也沒什么必要;不過為了線上環(huán)境的嚴謹,這步就做一下吧,ntpdate ntp.api.bz。#p#
◆DRBD的安裝和配置
DRBD官方網(wǎng)站:http://www.linux-ha.org/DRBD
源碼下載地址: http://oss.linbit.com/drbd
FAQ: http://www.linux-ha.org/DRBD/FAQ
目前流行的Linux中只有Centos有預編譯好的安裝包和對應內(nèi)核.
如果不想用Centos可以選擇從源碼安裝.
DRBD有兩種安裝模式:直接編譯進內(nèi)核 或 作為一個可加載的內(nèi)核模塊編譯.
以下使用的是CentOS 5.2 i386 系統(tǒng)安裝與測試:
1. 安裝依賴庫.
yum install gcc gcc-c++ make glibc flex
2. 在primary和secondary上都使用相同的安裝方法:
- tar zxvf drbd-8.0.6.tar.gz
- cd drbd-8.0.6
- make
- //make KDIR=/usr/src/linux *內(nèi)核所在的位置*, 如果沒有更改內(nèi)核可
- //直接運行make, 軟件會直接到/lib/module里邊去尋找系統(tǒng)環(huán)境,
- //如果是新的內(nèi)核需要對內(nèi)核進行編譯安裝, 否則make時候會錯誤中斷掉.
- make install
3. 安裝完主要生成命令: “drbdsetup”, “drbdadmin”
和配置文件: /etc/drbd.conf
啟動文件: /etc/init.d/drbd
模塊文件: drbd.ko (在編譯好的安裝包目錄下的drbd下可以找到)
- ls /lib/modules/2.6.18-128.el5/kernel/drivers/block/
- cpqarray.ko drbd.ko nbd.ko sx8.ko
所有命令和配置文件都可以在源碼包編譯成功的目錄下面找到.
./scripts/drbd.conf是最原始的配置文件, 當/etc/drbd.conf被破壞, 可以直接拷貝覆蓋掉.#p#
4. drbd采用的是模塊控制的方式, 所以先要加載drbd.ko 模塊.
- modprobe drbd
- 查看drbd模塊是否已經(jīng)加載到內(nèi)核中了:
- lsmod | grep drbd
- drbd 226352 2 //有的話表示加載模塊成功.
5. 先確認兩臺要鏡像的機器是否正常, 之間的網(wǎng)絡是否通暢, 需要加載的硬盤是否處于umount狀態(tài).
6. 在兩臺主機上都創(chuàng)建硬件設備drbd.
- mknod /dev/drbd0 b 147 0
- //mknod /dev/drbd1 b 147 1
- //mknod /dev/drbd2 b 147 2 如需多個drbd設備則依次去創(chuàng)建.
7. 二臺機器將/dev/sdb1互為鏡相(兩臺機器配置相同).
- yum -y install portmap
- yum -y install nfs
- mkdir /d //創(chuàng)建共享目錄.
- vim /etc/exports
- /d 10.1.2.0/255.255.252.0(rw,no_root_squash,no_all_squash,sync)
- /etc/init.d/portmap start
- chkconfig –level 3 portmap on
- chkconfig –level 3 nfs off
- //nfs不需要啟動, 也不需要設置成開機自動運行, 這些都將由后面的heartbeat來完成.
8. 配置drbd.
DRBD運行時,會讀取一個配置文件/etc/drbd.conf.
這個文件里描述了DRBD設備與硬盤分區(qū)的映射關系, 和DRBD的一些配置參數(shù)
- [root@centos1 ~]# cat /etc/drbd.conf
- #創(chuàng)建一個資源,名字叫r0
- resource r0 {
- protocol C;
- #采用C協(xié)議,表示收到遠程主機的寫入確認后,則認為寫入完成。
- startup { wfc-timeout 0; degr-wfc-timeout 120; }
- disk { on-io-error detach; }
- net {
- timeout 60;
- connect-int 10;
- ping-int 10;
- max-buffers 2048;
- max-epoch-size 2048;
- }
- syncer { rate 30M; }
- #設置主備節(jié)點同步時的網(wǎng)絡速率最大值
- on centos1.7788.com {
- device /dev/drbd0;
- disk /dev/sdb;
- address 10.0.0.1:7788;
- meta-disk internal;
- }
- on centos2.7788.com {
- device /dev/drbd0;
- disk /dev/sdb;
- address 10.0.0.2:7788;
- meta-disk internal;
- }
- }
- #每個主機的說明以"on"開頭,分別是各自的主機名,再后面的{}為這個主機的配置;監(jiān)聽端口為7788, meta-disk internal即表示在同一個局域網(wǎng)內(nèi)
#p#
9.drbd的啟動, 激活前面配置的drbd資源 “r0″. (兩個節(jié)點都要執(zhí)行)
在啟動DRBD之前,你需要分別在兩臺主機的hdb1分區(qū)上, 創(chuàng)建供DRBD記錄信息的數(shù)據(jù)塊.
分別在兩臺主機上執(zhí)行:
- [root@centos1 /]# drbdadm create-md r0 //創(chuàng)建r0的資源, r0是我們在drbd.conf里定義的資源名稱.
- [root@centos2 /]# drbdadm create-md r0
現(xiàn)在可以啟動drbd了, 分別在兩臺主機上執(zhí)行.
- [root@centos1 /]# /etc/init.d/drbd start #我喜歡用service drbd start
- [root@centos2 /]# /etc/init.d/drbd start
設置drbd開機自動啟動.
- [root@centos1 /]# chkconfig --add drbd
- [root@centos2 /]# chkconfig --add drbd
現(xiàn)在可以查看drbd當前的狀態(tài), 然后在centos1上執(zhí)行:
- [root@centos1 /]# cat /proc/drbd
- version: 8.0.0 (api:86/proto:86)
- SVN Revision: 2713 build by root@centos1, 2008-06-27 14:07:14
- 1: cs:Connected st: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
- resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
- act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
第一行的’st’表示兩臺主機的狀態(tài),都是”備機”狀態(tài).
‘ds’是磁盤狀態(tài),都是”不一致”狀態(tài).
這是由于,DRBD無法判斷哪一方為主機,以哪一方的磁盤數(shù)據(jù)作為標準數(shù)據(jù).
所以,我們需要初始化一個主機, 那么需要在centos1上執(zhí)行.
10.初始化centos1(這步只要在主節(jié)點上操作)
- [root@centos1 /]# drbdsetup /dev/drbd0 primary -o //定義為主節(jié)點.
- # drbdadm primary r0
第一次設置主節(jié)點時用 drbdadm 命令會失敗, 所以先用drbdsetup 來做, 以后就可以用drbdadm了.
再次查看drbd當前的狀態(tài).
- [root@centos1 ~]# cat /proc/drbd
- version: 8.0.0 (api:86/proto:86)
- SVN Revision: 2713 build by root@centos1, 2008-06-27 14:07:14
- 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—
- ns:18528 nr:0 dw:0 dr:18528 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
- [>...................] sync’ed: 0.3% (8170/8189)M
- finish: 6:46:43 speed: 336 (324) K/sec
- resync: used:0/31 hits:1156 misses:2 starving:0 dirty:0 changed:2
- act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
現(xiàn)在主備機狀態(tài)分別是’主/備’, 主機磁盤狀態(tài)是’實時’, 備機狀態(tài)是’不一致’.
在第3行, 可以看到數(shù)據(jù)正在同步中, 即主機正在將磁盤上的數(shù)據(jù), 傳遞到備機上.
現(xiàn)在的進度是0.3%.
設置完之后的第一次同步耗時比較長, 因為需要把整個分區(qū)的數(shù)據(jù)全部同步一遍.
第一次同步完成之后, 就可以對drbd的設備創(chuàng)建文件系統(tǒng)了:
稍等一段時間, 在數(shù)據(jù)同步完后, 再查看一下兩臺機器的DRBD狀態(tài):
- [root@centos1 ~]# cat /proc/drbd
- SVN Revision: 3048 build by root@centos1.7788.cn, 2010-01-20 06:09:12
- 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
- [root@centos2 ~]# service drbd status
- SVN Revision: 3048 build by root@centos2.7788.cn, 2010-01-20 06:09:02
- 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r—
現(xiàn)在磁盤狀態(tài)都是’實時’, 表示數(shù)據(jù)同步完成了.
#查看drbd的實時狀態(tài),我喜歡用service drbd status
11.drbd的使用.
現(xiàn)在可以把主機上的DRBD設備掛載到一個目錄上進行使用.
備機的DRBD設備無法被掛載, 因為它是用來接收主機數(shù)據(jù)的, 由DRBD負責操作.
在centos1主服務器上執(zhí)行:
- [root@centos1 /]# mkfs.ext3 /dev/drbd0
- [root@centos1 mnt]# mount /dev/drbd0 /d //只要在主節(jié)點上操作
現(xiàn)在, 就可以對 /d 分區(qū)進行讀寫操作了.
注意: secondary節(jié)點上不允許對drbd設備進行任何操作, 包括只讀.
所有的讀寫操作只能在primary節(jié)點上進行.
只有當primary節(jié)點掛掉之后, secondary節(jié)點才能提升成為primary節(jié)點, 繼續(xù)進行讀寫操作.#p#
五、Heartbeat的配置過程
真實的服務器之間的連接用交叉線連接,本著簡單高效的原則,直接購買即可。
1. 安裝, 在兩臺主機都同樣的安裝.
- yum -y install heartbeat
- #奇怪的事,此命令要執(zhí)行二次,不然heartbeat還真安裝不上去,奇怪的問題。
- 其中Heartbeat配置共涉及3個文件.
- /etc/ha.d/ha.cf
- /etc/ha.d/haresources
- /etc/ha.d/authkeys
- /etc/ha.d/resource.d/killnfsd
2. 二個節(jié)的配置的配置文件都是一樣, 文件內(nèi)容如下
- logfile /var/log/ha-log
- #定義HA的日志名字及存放位置
- logfacility local0
- keepalive 2
- #設定心跳(監(jiān)測)時間為2秒
- deadtime 5
- #死亡時間定義為5秒
- ucast eth1 10.0.0.2
- #采用單播方式,IP地址指定為對方IP
- auto_failback off
- #服務器正常后由主服務器接管資源,另一臺服務器放棄該資源
- node centos1.7788.com centos2.7788.com
- #定義節(jié)點
2. 編輯雙機互聯(lián)驗證文件: authkeys
- [root@centos1 ha.d]# vim /etc/ha.d/authkeys
- auth 1
- 1 crc
- //需要將 /etc/ha.d/authkeys設為600的權(quán)限.
- [root@centos1 ha.d]# chmod 600 /etc/ha.d/authkeys
- [root@centos2 ha.d]# chmod 600 /etc/ha.d/authkeys
3. 編輯集群資源文件: haresources
- [root@centos1 ha.d]# vim /etc/ha.d/haresources
- centos1.7788.com IPaddr::192.168.4.194/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/d::ext3 killnfsd
- #此文件二臺機器上配置一樣,千萬不要自做聰明在另一臺機器上配置成centos2.7788.com
4.編輯腳本文件killnfsd,目的其實就是為了重啟nfs服務。這是因為NFS服務切換后,必須重新mount一下nfs共享出來的目錄,否則會出現(xiàn)stale NFS file handle的錯誤。
- #[root@centos1 ha.d]# vim /etc/ha.d/resource.d/killnfsd
- #killall -9 nfsd; /etc/init.d/nfs restart; exit 0
- #[root@centos1 ha.d]# chmod 755 /etc/ha.d/resource.d/killnfsd
5. 在二個節(jié)點啟動Heartbeat即可,先在主節(jié)點啟動
- [root@centos1 /]# service heartbeat start
- [root@centos2 /]# service heartbeat start
- #這時就可以在另外的機器上面,正常掛載192.168.4.194:/d到自己的/mnt/data下進行正常的讀寫了,client會認為這個就是一個提供NFS的機器。
#p#
六、測試
由于我的線上環(huán)境已經(jīng)很穩(wěn)定了,這個測試結(jié)果是讓大家進行的,讓大家熟悉DRBD+Heartbeat;我建議做完此步后再做測試,看Heartbeat是否能做到真正的熱切換。
測試一、在另一臺FreeBSD8下掛載192.168.4.194:/d,向里面寫數(shù)據(jù)時,忽然重新啟動主DRBD,看此時寫數(shù)據(jù)有影響不,發(fā)現(xiàn)DRBD+Heartbeat正常切換還是需要些時間的;
測試二、正常狀態(tài)下關機Primary機,然后看數(shù)據(jù)有無問題,觀察DRBD的status;然后等主機啟動后,再觀察變化,然后再關機secondary,然后再啟動,觀察DRBD變化及Heartbeat起作用了沒。
測試三、假設此時把primary的eth0 給ifdown了, 然后直接在secondary上進行主的提升,并也給mount了, 發(fā)現(xiàn)在primary上測試拷入的文件確實同步過來了。之后把primary的 eth0 恢復后, 發(fā)現(xiàn)沒有自動恢復主從關系, 經(jīng)過支持查詢,發(fā)現(xiàn)出現(xiàn)了drbd檢測出現(xiàn)了Split-Brain 的狀況, 兩個節(jié)點各自都standalone了,故障描術(shù)如下:Split-Brain detected, dropping connection!這個即時傳說中的腦裂了,DRBD官方推薦手動恢復(生產(chǎn)環(huán)境下出現(xiàn)這個機率的機會很低的,誰會去故障觸動生產(chǎn)中的服務器)
以下手動恢復Split-Brain狀況:
i. 在secondary上:
- drbdadm secondary r0
- drbdadm disconnect all
- drbdadmin -- --discard-my-data connect r0
ii.在primary上:
- drbdadm disconnect all
- drbdadm connect r0
測試四、假設Primary因硬件損壞了,需要將Secondary提生成Primay主機,如何處理,方法如下:
在primaty主機上,先要卸載掉DRBD設備.
[root@centos1 /]# umount /d
將主機降級為”備機”
- [root@centos1 /]# drbdadm secondary r0
- [root@centos1 /]# cat /proc/drbd
- 1: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r—
現(xiàn)在,兩臺主機都是”備機”.
在備機centos2上, 將它升級為”主機”.
- [root@centos2 /]# drbdadm primary r0
- [root@centos2 /]# cat /proc/drbd
- 1: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
現(xiàn)在centos2成為主機了.
至此,整個實驗結(jié)束了;建議大家多做測試和總結(jié),幾十遍后就會完全掌握其用法,祝大家Happy先了。
【51CTO.com獨家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請注明原文出處及作者?!?/p>