生產環境下的高可用NFS文件服務器
原創【51CTO.com獨家特稿】一、DRBD簡介
分布式復制塊設備(DRBD,Distributed Replicated Block Device)是一種基于Linux的軟件組件, 它是由內核模塊和相關程序而組成的,通過網絡鏡像促進共享存儲系統的替換。也就是說: 當你將數據寫入本地的DRBD設備上的文件系統時,數據會同時被發送到網絡中的另外一臺主機之上,并以完全相同的形式記錄在一個文件系統中(實際上文件系統的創建也是由DRBD的同步來實現的)。本地節點(主機)與遠程節點(主機)的數據可以保證 實時的同步,并保證IO的一致性。所以當本地節點的主機出現故障時,遠程節點的主機上還會保留有一份完全相同的數據,可以繼續使用,以達到高可用的目的。
在高可用(HA)解決方案中使用DRBD的功能,可以代替使用一個共享盤陣存儲設備。因為數據同時存在于本地主機和遠程主機上,在遇到需要切換的時候,遠程主機只需要使用它上面的那份備份數據,就可以繼續提供服務
分布式復制塊設備(DRBD)是在90年代末由Philipp Reisner和Lars Ellenberg設想和開發的。開發者是為了創建一個Linux安全標準,以最低成本提供最佳的安全保障。分布式復制塊設備的當前版本可以與Linux 的普通版本一起使用,用于在被動系統和主動系統之間進行存儲數據的同步復制。數據可以在兩個系統同時讀取和輸入。分布式復制塊設備還支持資源級別防護。分布式復制塊設備(DRBD)工程與一組稱為Heartbeat的管理程序一起使用。它已經被收集到Linux的一些發行版中,目前流行的Linux中只有Centos有預編譯好的安裝包和對應內核。
分布式復制塊設備(DRBD)是LINBIT信息技術有限責任公司的一個注冊商標,總部設在奧地利維也納。該軟件已通過通用公共許可證(GNU GPL)發布,它可以在許可協議允許的范圍內自由分發和修改。#p#
二、DRBD的工作原理
理解DRBD其實就是網絡RAID-1,二臺服務器中就算其中的某臺因電源或主板損壞而宕機而對數據無任何影響(可以用硬盤RAID-1來理解DRBD),而真正的熱切換可以通過Heartbeat來實現,這樣切換過程跟Keepalived類似,是非常短及不需要人為干預的。#p#
三、DRBD的使用
DRBD需要構建在底層設備之上,然后構建出一個塊設備出來。對于用戶來說,一個DRBD設備,就像是一塊物理的磁盤,可以在商脈內創建文件系統。DRBD所支持的底層設備有以下這些類:
(1)一個磁盤,或者是磁盤的某一個分區
(2)一個soft raid 設備
(3)一個LVM的邏輯卷
(4)一個EVMS(Enterprise Volume Management System,企業卷管理系統)的卷
(5)其他任何的塊設備
我們的線上環境采取的第一種,即用單獨的磁盤來做的DRBD。#p#
四、DRBD的配置過程
我查閱了網上大量的教程類文間,感覺寫得不算是詳細;今天我登陸到服務器上,發現我的DRBD+Heartbeat已經穩定運行了161天(海量圖片文件服務器),相當的穩定和高效。如果沒有線上環境的同學也不要著急,大家完全可以根據我的文章用VMware workstation6.0+Centos5.x系統實現這個實驗,達到熟練掌握的目的。需要注意的地方我會重點說明,整個測試過程參考生產服務器。
服務器1:centos1.7788.com,單獨拿一塊硬盤sdb作DRBD
服務器2:centos2.7788.com,單獨拿一塊硬盤sdb作DRBD
網絡拓補很簡單:
centos1.7788.com eth0:192.168.4.191,物理bridge連接,eth1:10.0.0.1,這個可以采用虛擬網段VM5
centos2.7788.com eth0:192.168.4.192,物理bridge連接,eth1:10.0.0.2,這個可以采用虛擬網段VM5
VIP: 192.168.4.194,這個是通過Heartbeat來實現的,原理跟Keepalived類似,它通過在某臺服務器的eth0:0上綁定,如果遇到故障就轉移,達到高HA的目的;這個同時也是對外提供服務的IP。
Hosts的配置在二臺機器上一樣,不需要太復雜,只配置心跳部分即可,即:
centos1.7788.com 192.168.4.191 centos1
centos2.7788.com 192.168.4.192 centos2
另外關于時間同步一說,蠻多哥哥說要ntpdate,其實也沒什么必要;不過為了線上環境的嚴謹,這步就做一下吧,ntpdate ntp.api.bz。#p#
◆DRBD的安裝和配置
DRBD官方網站:http://www.linux-ha.org/DRBD
源碼下載地址: http://oss.linbit.com/drbd
FAQ: http://www.linux-ha.org/DRBD/FAQ
目前流行的Linux中只有Centos有預編譯好的安裝包和對應內核.
如果不想用Centos可以選擇從源碼安裝.
DRBD有兩種安裝模式:直接編譯進內核 或 作為一個可加載的內核模塊編譯.
以下使用的是CentOS 5.2 i386 系統安裝與測試:
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 *內核所在的位置*, 如果沒有更改內核可
- //直接運行make, 軟件會直接到/lib/module里邊去尋找系統環境,
- //如果是新的內核需要對內核進行編譯安裝, 否則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模塊是否已經加載到內核中了:
- lsmod | grep drbd
- drbd 226352 2 //有的話表示加載模塊成功.
5. 先確認兩臺要鏡像的機器是否正常, 之間的網絡是否通暢, 需要加載的硬盤是否處于umount狀態.
6. 在兩臺主機上都創建硬件設備drbd.
- mknod /dev/drbd0 b 147 0
- //mknod /dev/drbd1 b 147 1
- //mknod /dev/drbd2 b 147 2 如需多個drbd設備則依次去創建.
7. 二臺機器將/dev/sdb1互為鏡相(兩臺機器配置相同).
- yum -y install portmap
- yum -y install nfs
- mkdir /d //創建共享目錄.
- 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設備與硬盤分區的映射關系, 和DRBD的一些配置參數
- [root@centos1 ~]# cat /etc/drbd.conf
- #創建一個資源,名字叫r0
- resource r0 {
- protocol C;
- #采用C協議,表示收到遠程主機的寫入確認后,則認為寫入完成。
- 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; }
- #設置主備節點同步時的網絡速率最大值
- 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"開頭,分別是各自的主機名,再后面的{}為這個主機的配置;監聽端口為7788, meta-disk internal即表示在同一個局域網內
#p#
9.drbd的啟動, 激活前面配置的drbd資源 “r0″. (兩個節點都要執行)
在啟動DRBD之前,你需要分別在兩臺主機的hdb1分區上, 創建供DRBD記錄信息的數據塊.
分別在兩臺主機上執行:
- [root@centos1 /]# drbdadm create-md r0 //創建r0的資源, r0是我們在drbd.conf里定義的資源名稱.
- [root@centos2 /]# drbdadm create-md r0
現在可以啟動drbd了, 分別在兩臺主機上執行.
- [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
現在可以查看drbd當前的狀態, 然后在centos1上執行:
- [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’表示兩臺主機的狀態,都是”備機”狀態.
‘ds’是磁盤狀態,都是”不一致”狀態.
這是由于,DRBD無法判斷哪一方為主機,以哪一方的磁盤數據作為標準數據.
所以,我們需要初始化一個主機, 那么需要在centos1上執行.
10.初始化centos1(這步只要在主節點上操作)
- [root@centos1 /]# drbdsetup /dev/drbd0 primary -o //定義為主節點.
- # drbdadm primary r0
第一次設置主節點時用 drbdadm 命令會失敗, 所以先用drbdsetup 來做, 以后就可以用drbdadm了.
再次查看drbd當前的狀態.
- [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
現在主備機狀態分別是’主/備’, 主機磁盤狀態是’實時’, 備機狀態是’不一致’.
在第3行, 可以看到數據正在同步中, 即主機正在將磁盤上的數據, 傳遞到備機上.
現在的進度是0.3%.
設置完之后的第一次同步耗時比較長, 因為需要把整個分區的數據全部同步一遍.
第一次同步完成之后, 就可以對drbd的設備創建文件系統了:
稍等一段時間, 在數據同步完后, 再查看一下兩臺機器的DRBD狀態:
- [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—
現在磁盤狀態都是’實時’, 表示數據同步完成了.
#查看drbd的實時狀態,我喜歡用service drbd status
11.drbd的使用.
現在可以把主機上的DRBD設備掛載到一個目錄上進行使用.
備機的DRBD設備無法被掛載, 因為它是用來接收主機數據的, 由DRBD負責操作.
在centos1主服務器上執行:
- [root@centos1 /]# mkfs.ext3 /dev/drbd0
- [root@centos1 mnt]# mount /dev/drbd0 /d //只要在主節點上操作
現在, 就可以對 /d 分區進行讀寫操作了.
注意: secondary節點上不允許對drbd設備進行任何操作, 包括只讀.
所有的讀寫操作只能在primary節點上進行.
只有當primary節點掛掉之后, secondary節點才能提升成為primary節點, 繼續進行讀寫操作.#p#
五、Heartbeat的配置過程
真實的服務器之間的連接用交叉線連接,本著簡單高效的原則,直接購買即可。
1. 安裝, 在兩臺主機都同樣的安裝.
- yum -y install heartbeat
- #奇怪的事,此命令要執行二次,不然heartbeat還真安裝不上去,奇怪的問題。
- 其中Heartbeat配置共涉及3個文件.
- /etc/ha.d/ha.cf
- /etc/ha.d/haresources
- /etc/ha.d/authkeys
- /etc/ha.d/resource.d/killnfsd
2. 二個節的配置的配置文件都是一樣, 文件內容如下
- logfile /var/log/ha-log
- #定義HA的日志名字及存放位置
- logfacility local0
- keepalive 2
- #設定心跳(監測)時間為2秒
- deadtime 5
- #死亡時間定義為5秒
- ucast eth1 10.0.0.2
- #采用單播方式,IP地址指定為對方IP
- auto_failback off
- #服務器正常后由主服務器接管資源,另一臺服務器放棄該資源
- node centos1.7788.com centos2.7788.com
- #定義節點
2. 編輯雙機互聯驗證文件: authkeys
- [root@centos1 ha.d]# vim /etc/ha.d/authkeys
- auth 1
- 1 crc
- //需要將 /etc/ha.d/authkeys設為600的權限.
- [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共享出來的目錄,否則會出現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. 在二個節點啟動Heartbeat即可,先在主節點啟動
- [root@centos1 /]# service heartbeat start
- [root@centos2 /]# service heartbeat start
- #這時就可以在另外的機器上面,正常掛載192.168.4.194:/d到自己的/mnt/data下進行正常的讀寫了,client會認為這個就是一個提供NFS的機器。
#p#
六、測試
由于我的線上環境已經很穩定了,這個測試結果是讓大家進行的,讓大家熟悉DRBD+Heartbeat;我建議做完此步后再做測試,看Heartbeat是否能做到真正的熱切換。
測試一、在另一臺FreeBSD8下掛載192.168.4.194:/d,向里面寫數據時,忽然重新啟動主DRBD,看此時寫數據有影響不,發現DRBD+Heartbeat正常切換還是需要些時間的;
測試二、正常狀態下關機Primary機,然后看數據有無問題,觀察DRBD的status;然后等主機啟動后,再觀察變化,然后再關機secondary,然后再啟動,觀察DRBD變化及Heartbeat起作用了沒。
測試三、假設此時把primary的eth0 給ifdown了, 然后直接在secondary上進行主的提升,并也給mount了, 發現在primary上測試拷入的文件確實同步過來了。之后把primary的 eth0 恢復后, 發現沒有自動恢復主從關系, 經過支持查詢,發現出現了drbd檢測出現了Split-Brain 的狀況, 兩個節點各自都standalone了,故障描術如下:Split-Brain detected, dropping connection!這個即時傳說中的腦裂了,DRBD官方推薦手動恢復(生產環境下出現這個機率的機會很低的,誰會去故障觸動生產中的服務器)
以下手動恢復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—
現在,兩臺主機都是”備機”.
在備機centos2上, 將它升級為”主機”.
- [root@centos2 /]# drbdadm primary r0
- [root@centos2 /]# cat /proc/drbd
- 1: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
現在centos2成為主機了.
至此,整個實驗結束了;建議大家多做測試和總結,幾十遍后就會完全掌握其用法,祝大家Happy先了。
【51CTO.com獨家特稿,非經授權謝絕轉載!合作媒體轉載請注明原文出處及作者。】