MooseFS及其高可用部署

MooseFS及其高可用部署

MooseFS的工作原理分析

MooseFS(下面統一稱為MFS)由波蘭公司Gemius
SA於2008年5月30日正式推出的一款Linux下的開源儲存系統,是OpenStack開源雲端計算專案的子專案之一,被稱為物件儲存,提供了強大的擴充套件性、高可靠性和永續性。它能夠將檔案分佈儲存於不同的物理機器上,對外卻提供的是一個透明的介面的儲存資源池。它還具有線上擴充套件、檔案切塊儲存、節點無單點故障、讀寫效率高等特點。

MFS分散式檔案系統由後設資料伺服器(Master Server)、後設資料日誌伺服器(Metalogger Server)、資料儲存伺服器(Chunk
Server)、客戶端(Client)組成。

MFS檔案系統結構圖

(1)後設資料伺服器:MFS系統中的核心組成部分,儲存每個檔案的後設資料,負責檔案的讀寫排程、空間回收和在多個chunk
server之間的資料拷貝等。目前MFS僅支援一個後設資料伺服器,因此可能會出現單點故障。針對此問題我們需要用一臺效能很穩定的伺服器來作為我們的後設資料伺服器,這樣可以降低出現單點故障的概率。

(2) 後設資料日誌伺服器:後設資料伺服器的備份節點,按照指定的週期從後設資料伺服器上將儲存後設資料、更新日誌和會話資訊的檔案下載到本地目錄下。當後設資料伺服器出現故障時,我們可以從該伺服器的檔案中拿到相關的必要的資訊對整個系統進行恢復。

此外,利用後設資料進行備份是一種常規的日誌備份手段,這種方法在某些情況下並不能完美的接管業務,還是會造成資料丟失。此次將採用通過iSCSI共享磁碟對後設資料節點做雙機熱備。

(3) 資料儲存伺服器:負責連線後設資料管理伺服器,聽從後設資料伺服器的排程,提供儲存空間,併為客戶端提供資料傳輸,MooseFS提供一個手動指定每個目錄的備份個數。假設個數為n,那麼我們在向系統寫入檔案時,系統會將切分好的檔案塊在不同的chunk
server上覆制n份。備份數的增加不會影響系統的寫效能,但是可以提高系統的讀效能和可用性,這可以說是一種以儲存容量換取寫效能和可用性的策略。

(4) 客戶端:使用mfsmount的方式通過FUSE核心介面掛接遠端管理伺服器上管理的資料儲存伺服器到本地目錄上,然後就可以像使用本地檔案一樣來使用我們的MFS檔案系統了。

MFS讀寫原理

1.MFS讀資料過程

MFS讀過程

MFS讀檔案工作步驟:

① MFS客戶端向系統的後設資料管理伺服器提交讀取檔案的任務請求;

② 後設資料伺服器檢索自己的資料並把資料所存放的位置發給客戶端;

③ 客戶端接收到後設資料管理伺服器返回的資訊後,向已知的資料儲存伺服器傳送資料請求。

2.MFS寫資料過程

 

MFS寫過程

MFS寫檔案工作步驟:

① MFS的客戶端有資料寫需求時,首先向後設資料管理伺服器提交些檔案的任務請求;

② 後設資料管理伺服器接收到客戶端請求後在資料伺服器建立新的Chunk檔案塊;

③ 資料伺服器將建立成功的訊息返回給後設資料管理伺服器;

④ 後設資料管理伺服器將資料伺服器的地址返回給客戶端;

⑤ 客戶端直接向已知的資料伺服器寫資料;

⑥ 資料伺服器將寫檔案成功的訊息返回給客戶端;

⑦ 客戶端將此次寫完成的訊號傳送給後設資料管理伺服器。

MFS 部署

主機環境:RHEL6.5 selinux and iptables disabled

Master:172.25.10.2 (HA) 172.25.10.3 (HA)

VIP 172.25.10.100

##Metalogger: 192.168.0.77

Chunkserver: 172.25.10.6 172.25.10.7 172.25.10.8

Client: 172.25.10.4

172.25.10.5 (iSCSI)

 

生成 rpm,便於部署:

# yum install gcc make rpm-build fuse-devel zlib-devel -y

# rpmbuild -tb mfs-1.6.27.tar.gz

# ls ~/rpmbuild/RPMS/x86_64

mfs-cgi-1.6.27-4.x86_64.rpm

mfs-master-1.6.27-4.x86_64.rpm

mfs-chunkserver-1.6.27-4.x86_64.rpm 

後設資料伺服器
Master server 安裝

yum install -y mfs-cgi-1.6.27-4.x86_64.rpm mfs-cgiserv-1.6.27-4.x86_64.rpm mfs-master-1.6.27-4.x86_64.rpm

# cd /etc/mfs/

# cp mfsmaster.cfg.dist mfsmaster.cfg

# cp mfsexports.cfg.dist mfsexports.cfg

# vi mfsexports.cfg

         172.25.10.0/24    /          rw,alldirs,maproot=0 

該檔案每一個條目分為三部分:

    第一部分:客戶端的ip地址

         第二部分:被掛接的目錄

         第三部分:客戶端擁有的許可權

# cd /var/lib/mfs

# cp metadata.mfs.empty metadata.mfs

# chown -R nobody /var/lib/mfs

 

修改/etc/hosts檔案,增加下面的行:

172.25.10.2 mfsmaster

# mfsmaster start 啟動
master server

 

# mfscgiserv #啟動
CGI 監控服務

lockfile created and locked

starting simple cgi server (host: any , port: 9425 , rootpath: /usr/share/mfscgi)

# cd /usr/share/mfscgi/

# chmod x chart.cgi mfs.cgi

在瀏覽器位址列輸入
http://172.25.10.2:9425 即可檢視 master的執行情況

儲存伺服器
Chunk servers 安裝

# yum localinstall -y mfs-chunkserver-1.6.27-4.x86_64.rpm

# cd /etc/mfs

# cp mfschunkserver.cfg.dist mfschunkserver.cfg

# cp mfshdd.cfg.dist mfshdd.cfg

# vi mfshdd.cfg 定義
mfs 共享點

/mnt/mfschunks1

# chown -R nobody:nobody /mnt/mfschunks1

修改/etc/hosts
檔案,增加下面的行:

172.25.10.2 mfsmaster

 

mkdir /var/lib/mfs

chown nobody /var/lib/mfs

 

現在再通過瀏覽器訪問
http://172.25.10.2:9425/ 應該可以看見這個 MFS系統的全部資訊,包括後設資料管理master和儲存服務chunkserver。

客戶端 client安裝

# yum localinstall -y mfs-client-1.6.27-4.x86_64.rpm

# cd /etc/mfs

# cp mfsmount.cfg.dist mfsmount.cfg

# vi mfsmount.cfg 定義客戶端預設掛載

mfsmaster=mfsmaster

/mnt/mfs

 

# mfsmount

# df -h

mfsmaster:9421 2729728 0 2729728 0% /mnt/mfs

MFS 測試

在 MFS
掛載點下建立兩個目錄,並設定其檔案儲存份數:

# cd /mnt/mfs

# mkdir dir1 dir2

# mfssetgoal -r 2 dir2/ 設定在
dir2 中檔案儲存份數為兩個,預設是一個

dir2/:

inodes with goal changed: 1

inodes with goal not changed: 0

inodes with permission denied: 0

對一個目錄設定“goal”,此目錄下的新建立檔案和子目錄均會繼承此目錄的設定,但不會改變已經存在的檔案及目錄的copy份數。但使用-r選項可以更改已經存在的copy份數。

拷貝同一個檔案到兩個目錄

# cp /etc/passwd dir1 # cp /etc/passwd dir2

檢視檔案資訊

# mfsfileinfo dir1/passwd

dir1/passwd:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

copy 1: 172.25.10.6:9422

# mfsfileinfo dir2/passwd

dir2/passwd:

chunk 0: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 172.25.10.6:9422

copy 2: 172.25.10.7:9422

 

關閉 mfschunkserver2
後再檢視檔案資訊

# mfsfileinfo dir1/passwd

dir1/passwd:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

no valid copies !!!

# mfsfileinfo dir2/passwd

dir2/passwd:

chunk 0: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 172.25.10.7:9422

啟動 mfschunkserver2
後,檔案回覆正常。

恢復誤刪檔案

# rm -f dir1/passwd

# mfsgettrashtime dir1/

dir1/: 86400

檔案刪除後存放在“
垃圾箱”中的時間稱為隔離時間,這個時間可以用mfsgettrashtime命令來檢視,用mfssettrashtime命令來設定,單位為秒,預設為86400秒。

# mkdir /mnt/mfsmeta

# mfsmount -m /mnt/mfsmeta/ -H mfsmaster

掛載 MFSMETA
檔案系統,它包含目錄trash (包含仍然可以被還原的刪除檔案的資訊)和

trash/undel (用於獲取檔案)。把刪除的檔案,移到/
trash/undel 下,就可以恢復此檔案。

# cd /mnt/mfsmeta/trash

# mv 00000004\|dir1\|passwd undel/

到 dir1
目錄中可以看到passwd檔案恢復

在 MFSMETA
的目錄裡,除了trash和trash/undel兩個目錄,還有第三個目錄reserved,該目錄內有已經刪除的檔案,但卻被其他使用者一直開啟著。在使用者關閉了這些被開啟的檔案後,reserved目錄中的檔案將被刪除,檔案的資料也將被立即刪除。此目錄不能進行操作。

MFS高可用部署

iSCSI 配置

增加一塊虛擬磁碟,無需格式化(vdb)

yum install scsi-target-utils.x86_64 -y

vim /etc/tgt/targets.conf

#<target iqn.2016-03.com.example:server.target9>

#    backing-store /dev/vdb1

# initiator-address 172.25.10.2

# initiator-address 172.25.10.3

#</target>

/etc/init.d/tgtd start && chkconfig tgtd on

在master(172.25.10.2 172.25.10.3)端下載安裝 iscsi-initiator-utils.x86_64

iscsiadm -m discovery -t st -p 172.25.10.5

iscsiadm -m node -l

將磁碟格式化為ext4格式

fdisk -cu /dev/sda

mkfs.ext4 /dev/sda1

將/var/lib/mfs/*
所有資料移到網路磁碟/dev/sda1中去,然後將其掛載到/var/lib/mfs

mount /dev/sda1 /mnt/

cp -p /var/lib/mfs/* /mnt/

mfsmaster start 

Pacemaker安裝(172.25.10.2;3)

配yum源

預設yum源只有基礎包Server,yum源包裡有

ResilientStorage/

HighAvailability/

LoadBalancer/

Packages/

images/

Packages/

所需安裝包pacemaker在HighAvailability包裡

yum install pacemaker -y

使用pacemaker配置時需要安裝pacemaker的介面,程式介面為crmshell,早期裝上pacemaker自帶有crmshell介面,新版本已被獨立出來,不再是pacemaker組成部分。而crmshell又依賴於pssh相關包,因此得安裝這兩個元件。

# yum install crmsh-1.2.6-0.rc2.2.1.x86_64.rpm pssh-2.3.1-2.1.x86_64.rpm

使用yum install安裝pacemaker時會安裝其大量相關性依賴包,包括corosync,所以corosync不再安裝,直接修改其配置檔案/etc/corosync/corosync.conf。

cd /etc/corosync/

#cp corosync.conf.example corosync.conf

vim corosync.conf

#bindnetaddr: 172.25.10.0

#mcastaddr: 226.94.1.1

#

#service {

# name: pacemaker

# ver: 0

#}

/etc/init.d/corosync start && chkconfig corosync on

fence安裝(1229)

本次部署採用外部fence ,fence是C/S架構,在fence服務端節點需要安裝如下三個軟體包。

fence-virtd.x86_64

fence-virtd-libvirt.x86_64

fence-virtd-multicast.x86_64

安裝好之後使用命令fence_virtd -c進入互動式介面配置fence檔案,在配置時需要注意的是選擇介面(interface)時選主機之間通訊的網絡卡。

mkdir /etc/cluster #預設不存在cluster;

服務端和客戶端之間通過key檔案進行通訊,key檔案預設不存在,需要手動生成並拷貝到所有客戶端節點。節點預設沒有/etc/cluster目錄,需自己建立

# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key

# for i in {2,3} ;do scp /etc/cluster/fence_xvm.key
master$i.example.com:/etc/cluster ; done

systemctl start fence_virtd.service

systemctl enable fence_virtd.service 

在客戶端(172.25.10.2,3)需安裝fence-virt工具

# yum install fence-virt.x86_64 -y 

後設資料高可用性高可用實現

之前安裝好的crmshell介面提供一個命令列互動介面對pacemaker叢集進行管理,具有非常強大且易用的管理功能,所做的配置會同步到各個叢集節點上。下面將後設資料伺服器上各個服務交由叢集管理。

a. 首先將fence服務交由叢集。由於外部fence只能識別domain,所以需要將domain與hostname繫結,並每隔60s監控一次。

# crm(live)configure# primitive vmfence stonith:fence_xvm parms pcmk_host_map=”master1.example.com:vm2;master2.example.com:vm3″ op monitor interval=60s

b. 在將MFS系統服務交由叢集接管之前,需建立一個虛擬IP(VIP),VIP對外為master節點,當叢集裡某個master節點資源宕機,則服務通過VIP將資源遷移到另一個master節點,對client來說,絲毫沒有感覺。

# crm(live)configure# primitive vip ocf:hearbeat:IPaddr2 params ip=”172.25.10.100″ cidr_netmask=”24″ op monitor interval=”30s”

c. 將MFS系統服務交由叢集管理器管理。

# crm(live)configure# property no-quorum-policy=”ignore” #
預設結點數若只有一個,表示叢集不存在,忽視

# crm(live)configure# primitive mfsdata ocf:heartbeat:Filesystem params device=”/dev/sda1″ directory=”/var/lib/mfs” fstype=”ext4″ op monitor interval=”60s”

# crm(live)configure# primitive mfs lsb:mfs op monitor interval=”60s”

# crm(live)configure# group mfsgroup vip mfs mfsdata

# crm(live)configure# order mfs-after-mfstdata inf: mfsdata mfs

在chunk 和client端加入hosts解析

172.25.10.100 mfsmaster

此時,整個叢集服務搭建完畢,MooseFS叢集架構如下所示