基於MFS高可用的分散式儲存架構

安全劍客發表於2019-08-25
MFS是一個具有容錯性的網路分散式檔案系統,它把資料分散存放在多個物理伺服器上,而呈現給使用者的則是一個統一的資源;分散式檔案系統就是把一些分散在多臺計算機上的共享資料夾,集合到一個共享資料夾內,使用者要訪問這些資料夾的時候,只要開啟一個資料夾,就可以的看到所有連結到此資料夾內的共享資料夾。
MFS分散式儲存系統中角色分類及規劃

管理伺服器:負責各個資料儲存伺服器的管理,檔案讀寫排程,檔案空間回收以及恢復.多節點拷貝;

後設資料日誌伺服器:負責備份master 伺服器的變化日誌檔案,檔案型別為changelog_ml.*.mfs ,以便於在master server 出問題的時候接替其進行工作;

資料儲存伺服器:負責連線管理伺服器,聽從管理伺服器排程,提供儲存空間,併為客戶提供資料傳輸.儲存的是資料塊或則碎片;

客戶機:通過fuse 核心介面掛接遠端管理伺服器上所管理的資料儲存伺服器,.看起來共享的檔案系統和本地unix 檔案系統使用一樣的效果。

本次實驗架構及相關準備資訊(備註:所有系統環境均為 centos7.4,請按圖表配置好IP與主機名)

基於MFS高可用的分散式儲存架構基於MFS高可用的分散式儲存架構

MFS體系工作涉及流程分析
MFS的讀資料過程

1:client當需要一個資料時,首先向master server發起查詢請求;

2:管理伺服器檢索自己的資料,獲取到資料所在的可用資料伺服器位置ip|port|chunkid;

3:管理伺服器將資料伺服器的地址傳送給客戶端;

4:客戶端向具體的資料伺服器發起資料獲取請求;

5:資料伺服器將資料傳送給客戶端;

MFS的寫資料過程

1:當客戶端有資料寫需求時,首先向管理伺服器提供檔案後設資料資訊請求儲存地址(後設資料資訊如:檔名|大小|份數等);

2:管理伺服器根據寫檔案的後設資料資訊,到資料伺服器建立新的資料塊;

3:資料伺服器返回建立成功的訊息;

4:管理伺服器將資料伺服器的地址返回給客戶端(chunkIP|port|chunkid);

5:客戶端向資料伺服器寫資料;

6:資料伺服器返回給客戶端寫成功的訊息;

7:客戶端將此次寫完成結束訊號和一些資訊傳送到管理伺服器來更新檔案的長度和最後修改時間

MFS的刪除檔案過程

1:客戶端有刪除操作時,首先向Master傳送刪除資訊;

2:Master定位到相應後設資料資訊進行刪除,並將chunk server上塊的刪除操作加入佇列非同步清理;

3:響應客戶端刪除成功的訊號

MFS修改檔案內容的過程

1:客戶端有修改檔案內容時,首先向Master傳送操作資訊;

2:Master申請新的塊給.swp檔案,

3:客戶端關閉檔案後,會向Master傳送關閉資訊;

4:Master會檢測內容是否有更新,若有,則申請新的塊存放更改後的檔案,刪除原有塊和.swp檔案塊;

5:若無,則直接刪除.swp檔案塊。

MFS重新命名檔案的過程

1:客戶端重新命名檔案時,會向Master傳送操作資訊;

2:Master直接修改後設資料資訊中的檔名;返回重新命名完成資訊;

MFS遍歷檔案的過程

1:遍歷檔案不需要訪問chunk server,當有客戶端遍歷請求時,向Master傳送操作資訊;

2:Master返回相應後設資料資訊;

3:客戶端接收到資訊後顯示

注意:

1:Master記錄著管理資訊,比如:檔案路徑|大小|儲存的位置(ip,port,chunkid)|份數|時間等,後設資料資訊存在於記憶體中,會定期寫入metadata.mfs.back檔案中,定期同步到metalogger,操作實時寫入changelog.*.mfs,實時同步到metalogger中。master啟動將metadata.mfs載入記憶體,重新命名為metadata.mfs.back檔案。

2:檔案以chunk大小儲存,每chunk最大為64M,小於64M的,該chunk的大小即為該檔案大小(驗證實際chunk檔案略大於實際檔案),超過64M的檔案將被切分,以每一份(chunk)的大小不超過64M為原則;塊的生成遵循規則:目錄迴圈寫入(00-FF 256個目錄迴圈,step為2)、chunk檔案遞增生成、大檔案切分目錄連續。

3:Chunkserver上的剩餘儲存空間要大於1GB(Reference Guide有提到),新的資料才會被允許寫入,否則,你會看到No space left on device的提示,實際中,測試發現當磁碟使用率達到95%左右的時候,就已經不行寫入了,當時可用空間為1.9GB。

4:檔案可以有多份copy,當goal為1時,檔案會被隨機存到一臺chunkserver上,當goal的數大於1時,copy會由master排程儲存到不同的chunkserver上,goal的大小不要超過chunkserver的數量,否則多出的copy,不會有chunkserver去存。

5:Chunkserver上的剩餘儲存空間要大於1GB(Reference Guide有提到),新的資料才會被允許寫入,否則,你會看到No space left on device的提示,實際中,測試發現當磁碟使用率達到95%左右的時候,就已經不行寫入了,當時可用空間為1.9GB

整個MFS高可用架構內,各服務依賴流程

1:keepalived決定了,VIP在那臺機器上,

2:有VIP的機器視為drbd的(主)primay角色,需要將/dev/drbd0 掛載到指定位置 /var/lib/mfs,

3:然後啟動,mfsmaster服務,並且啟用mfscgiser監控服務(web形式提供)

4:(注意:啟動mfsmaster時,需要目錄裡有meta.mfs,不然無法啟動,通常其會被改成meta.mfs.back,需要手動改回來,才能啟動mfsmaster)

第一階段:軟體部署

在所有主機上新增mfs的官方源

salt "*" cmd.run " yum install epel* bash-c* wget tree -y && yum update -y "
salt "*" cmd.run 'curl "http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS'
salt "*" cmd.run 'curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo'

在master和slave上安裝masterserver服務

salt -L "Master62,Slave63" cmd.run 'yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y'

在chunk上

salt  "chunk6[5-7]" cmd.run 'yum install moosefs-chunkserver -y'

在logger上

salt  "logger64" cmd.run 'yum install moosefs-metalogger -y'

在client上

salt  "client68" cmd.run 'yum install moosefs-client -y'
第二階段:在master和slave進行drbd資源建立階段
在master和slave上安裝drbd服務
salt  -L "Master62,Slave63" cmd.run 'rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org'
salt  -L "Master62,Slave63" cmd.run 'rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm'
salt  -L "Master62,Slave63" cmd.run 'yum install kmod-drbd84 drbd84-utils -y'
salt  -L "Master62,Slave63" cmd.run "chmod +x /etc/rc.d/rc.local"
salt  -L "Master62,Slave63" cmd.run  'echo "modprobe drbd" >> /etc/rc.local'
salt  -L "Master62,Slave63" cmd.run  'modprobe drbd'
salt  -L "Master62,Slave63" cmd.run "lsmod | grep drbd"
在master和slave上檢視sdb的容量,以便如何分割槽(先不格式化磁碟)
salt  -L "Master62,Slave63" cmd.run "fdisk -l |grep sdb"
salt  -L "Master62,Slave63" cmd.run "parted /dev/sdb mklabel gpt "
#fdisk非互動式分割槽,分15G的分割槽出來
salt  -L "Master62,Slave63" cmd.run 'echo -e "n\np\n1\n\n+15G\nw\n" |fdisk /dev/sdb '
salt  -L "Master62,Slave63" cmd.run "parted /dev/sdb p"
salt  -L "Master62,Slave63" cmd.run "fdisk -l |grep sdb"
在master和slave上配置drbd並啟動它(兩臺配置相同)
#在主和從上分別建立drbd資源配置檔案
salt  -L "Master62,Slave63" cmd.run "touch /etc/drbd.d/mfs-meta.res"
#drbd資源配置檔案內容如下
vi /etc/drbd.d/mfs-meta.res
resource mfs_meta0 {
	protocol 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;
	}
	meta-disk internal;
	device    /dev/drbd0;
	syncer {
		verify-alg sha1;
	}
	on Master62 {
		disk /dev/sdb1;
		address 192.168.1.62:7789;
	}
	on Slave63 {
		disk /dev/sdb1;
		address 192.168.1.63:7789;
	}
 }
#啟動drbd(建議將drbd服務加入到開機自啟裡)
salt  -L "Master62,Slave63" cmd.run "systemctl start drbd.service"
salt  -L "Master62,Slave63" cmd.run "systemctl enable drbd.service"  #開機後會啟動所有drbd資源
在master和slave上初始化DRBD
salt  -L "Master62,Slave63" cmd.run "drbdadm create-md mfs_meta0"
salt  -L "Master62,Slave63" cmd.run "drbdadm up mfs_meta0"
salt  -L "Master62,Slave63" cmd.run "cat /proc/drbd "	#正常狀態應該是Secondary/Secondary
#將其中一個節點置主(這裡在主節點,Master62)
salt  "Master62" cmd.run "drbdadm primary mfs_meta0 --force"
#檢視狀態,(一主一叢是正常狀態)
[root@client68 ~]# salt  -L "Master62,Slave63" cmd.run "cat /proc/drbd "
Slave63:
    version: 8.4.10-1 (api:1/proto:86-101)
    GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
     0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
        ns:0 nr:1380352 dw:1371760 dr:0 al:8 bm:0 lo:30 pe:1 ua:29 ap:0 ep:1 wo:f oos:14356364
    	[>...................] sync'ed:  8.8% (14016/15356)M
    	finish: 0:11:27 speed: 20,880 (18,048) want: 24,720 K/sec
Master62:
    version: 8.4.10-1 (api:1/proto:86-101)
    GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
     0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
        ns:1381112 nr:0 dw:0 dr:1383240 al:0 bm:0 lo:0 pe:30 ua:0 ap:0 ep:1 wo:f oos:14356364
    	[>...................] sync'ed:  8.8% (14016/15356)M
    	finish: 0:11:27 speed: 20,880 (18,048) K/sec
#只需在(主)Primary上執行格式化
salt  "Master62" cmd.run "mkfs.xfs -b 4096 /dev/drbd0"
第三階段:配置並啟動mfsmaster和mfscgiser,web監控服務
在master和slave上配置並啟動metaserver服務
#metaserver的配置檔案/etc/mfs/mfsmaster.cfg 完全可以不用修改
#在drbd的主上進行掛載/dev/drbd0裝置(/var/lib/mfs是管理機儲存後設資料的地方)
salt  "Master62" cmd.run "mount /dev/drbd0 /var/lib/mfs "
#不修改為mfsmaster程式的使用者mfs可能無法建立檔案,導致無法啟動mfsmaster
salt  -L "Master62,Slave63" cmd.run "chown mfs:mfs /var/lib/mfs/ -R"
salt  -L "Master62,Slave63" cmd.run "systemctl start moosefs-master.service "
#配置本地hosts解析(因為web監控會呼叫mfsmaster解析到ip,當然每次手動輸入也可以)
salt  -L "Master62,Slave63" cmd.run 'echo "192.168.1.61	 mfsmaster" >> /etc/hosts '
#在主上啟用監控(會監控9425埠,用瀏覽器可以檢視 http://192.168.1.61:9425)
salt  "Master62" cmd.run "systemctl start moosefs-cgiserv.service"
第四階段:安裝並配置keepalived
在master和slave上安裝keepalived服務
salt  -L "Master62,Slave63" cmd.run "yum install keepalived -y"
在master和slave上配置keepalived(參看每行註釋,back的配置只有兩點"state,priority"不一樣)
[root@Master62 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     root@wsfnk.com		#設定郵件報警地址,可以設定多個,每行一個
   }
   notification_email_from 123@wsfnk.com #設定郵件的傳送地址
   smtp_server 192.168.200.1		 #設定smtp server
   smtp_connect_timeout 30		 #設定連線smtp server的超時時間
   router_id LVS_DEVEL			 #表示執行keepalived伺服器的一個標示,傳送郵件時顯示在郵件主題中的資訊
   vrrp_skip_check_adv_addr
   #vrrp_strict				 #注意:當你發現無法ping通虛擬VIP時,建議將此行註釋掉
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#定義一個檢查mfsmaster的指令碼vrrp_script chk_mfsmaster {
	script "/etc/keepalived/keepalived_drbd_mfs.sh check"
	#這個指令碼,若是發現不執行,可以檢查他的許可權,777是不可以的,日誌提示不安全,可以直接chmod +x /etc/keepalived/keepalived_drbd_mfs.sh 就行
	#script "shutdown -r now"	#或者,直接用命令進行除錯
	interval 2
	weight 2
}
#vrrp例項定義部分
vrrp_instance VI_1 {
    state MASTER	#指定角色為主MASTER,備為BACKUP
    interface ens192	#指定HA監測網路的介面,介面名字要與系統一致(建議監測口獨立)
    virtual_router_id 51  #虛擬路由標示,這個標示是一個數字,同一個vrrp例項使用唯一的標示
    priority 100	#主權值必須設得比 back 高,數字越大越高
    advert_int 1	#設定keepalived-master與備節點的心跳間隔時間,單位是秒
    authentication {	#設定驗證型別和密碼
        auth_type PASS	#設定驗證型別,由PASS與HA兩種
        auth_pass 1111	#設定驗證密碼,同一vrrp例項下,keepalived-master與backup節點必須使用相同的密碼才能正常通訊
    }
    virtual_ipaddress {	#設定虛擬ip,可以設定多個虛擬的vip,每行一個
        192.168.1.61/24 dev ens192
    }
    track_script {	#呼叫上面定義檢查mfsmaster的指令碼
        chk_mfsmaster
    }
    notify_master "/etc/keepalived/keepalived_drbd_mfs.sh master"  #表示當切換到master狀態時,要執行的指令碼
    notify_backup "/etc/keepalived/keepalived_drbd_mfs.sh backup"  #表示當切換到backup狀態時,要執行的指令碼
    notify_fault "/etc/keepalived/keepalived_drbd_mfs.sh fault"	#表示切換出現故障時要執行的指令碼
    notify_stop "/etc/keepalived/keepalived_drbd_mfs.sh fault"	#停止前,執行的
}
在master和slave上啟動keepalived服務
salt  -L "Master62,Slave63" cmd.run "systemctl start keepalived "
第五階段:配置(metalogger)後設資料日誌伺服器(這個角色可以在任何機器上執行,可以遠端備份)
配置(metalogger)後設資料日誌伺服器(這個角色可以在任何機器上執行,可以遠端備份)(可以後來才新增,也能保持後設資料一致性)
#修改目錄許可權
salt  "metalogger64" cmd.run "chown mfs:mfs /var/lib/mfs -R "
#很簡單,只需要,修改到mfsmaster的ip地址就可以了
vi mfsmetalogger.cfg
MASTER_HOST = 192.168.1.64	#指定mfsmaster的主機地址
#啟動,並開機啟動metalogger服務
salt  "metalogger64" cmd.run "systemctl start moosefs-metalogger"
salt  "metalogger64" cmd.run "systemctl enable moosefs-metalogger"
#檢視同步過來的檔案/var/lib/mfs/metadata_ml.mfs.back是否與mfsmaster上的/var/lib/mfs/metadata.mfs.back相同(結果相同)
第六階段:配置並啟動後端儲存伺服器chunk
配置chunk伺服器
#建立資料存放目錄並修改目錄所有者(mfs使用者,在用yum 安裝mfs套件時已經自動建立)
salt  -L "chunk65,chunk66,chunk67" cmd.run "mkdir /data"
salt  -L "chunk65,chunk66,chunk67" cmd.run "chown mfs:mfs /data"
vi /etc/mfs/mfschunkserver.cfg
MASTER_HOST = 192.168.1.61		#master的ip地址
HDD_CONF_FILENAME = /etc/mfs/mfshdd.cfg
CSSERV_LISTEN_PORT = 9422		#這個埠用於與其他chunk伺服器進行連線,通常是資料複製
vi /etc/mfs/mfshdd.cfg
/data		#指定資料碎片儲存的真實路徑(可以是目錄,磁碟等)
#啟動
salt  -L "chunk65,chunk66,chunk67" cmd.run "systemctl enable moosefs-chunkserver.service"
salt  -L "chunk65,chunk66,chunk67" cmd.run "systemctl start moosefs-chunkserver.service"	
#驗證:會在chunk的/data目錄裡建立00-FF個目錄用於存放碎片檔案
salt  -L "chunk65,chunk66,chunk67" cmd.run "tree /data"
第七階段:配置客戶端
#確保客戶端機器核心有fuse模組(若是沒有:用 modprobe fuse 進行載入)
#當然:我發現若是之前沒有載入fuse模組時,執行下面的掛載命令,該模組會被自動載入(此步驟可忽略)
lsmod | grep fuse
#建立一個掛載點(這個掛載點,或則目錄裡不能有任何檔案,否在會掛載失敗)
mkdir /data
#執行掛載(進入目錄 cd /data 後,就可以像操作本地資料一樣進行操作了)
mfsmount -H 192.168.1.61 /data
(附)第八階段:編寫keepalived控制drbd和mfs的監控指令碼
#這是我寫的監控指令碼,(這裡的指令碼,只能實現,在master和slave上的drbd開機自啟動後,master上啟動keepalived後能自動完成各種監測,併成功啟動mfsmaster,但是slave上無法實現檢查,當master故障後slave自動切換會失敗)有待完善
wget https://qiniu.wsfnk.com/keepalived_drbd_mfs.sh
mv keepalived_drbd_mfs.sh /etc/keepalived/
chmod +x /etc/keepalived/keepalived_drbd_mfs.sh
(附)問題一:多client掛載,會有資料不一致的情況發生麼

答:不會,原因:參看MFS的工作原理流程分析

(附)問題二:假比chunk有三臺,掛了一臺,新加入一臺,原本的資料副本數為2,那麼必然部分資料的副本數會降為1,請問如何恢復降低副本數的副本份數,以保障資料的可靠性
(附)問題三:整個架構,啟動與停止順序
正常啟動順序:matser >> chunk >> metalogger >> client
正常關閉順序:client >> chunk >> metalogger >> master
master主機上:drbd資源啟動 >> drbd資源置主 >> 掛載drbd到指定目錄 >> 啟動mfsmaster和mfscgiser >> 啟動keepalived掌管VIP
slave備機上:drbd資源啟動 >> drbd資源置從 >> 啟動keepalived監測master主機是否故障
(附)問題四:drbd腦裂情況及其處理方法(注意:只有當狀態為Primary的一方,才可以掛載磁碟)
正常狀態:
1:role=Primary/Secondary	cstate=Connected  UpToDate/UpToDate	#這是正常工作狀態,一主一叢,連線狀態,資料最新
2:role=Secondary/Secondary   cstate=Connected  UpToDate/UpToDate	#這是drbd資源剛剛啟動階段,預設都是為從,只需將一端手動置主即可
故障狀態分類
#故障原因:可能是由於主drbd伺服器,網路出現故障(如網路卡down了等),備伺服器處於正常狀態
3:(主上)role=Primary/Unknown	cstate=StandAlone  UpToDate/DUnkown	#表示網路配置不可用,資源還沒有被連線或者是被管理斷開
3:(備上)role=Secondary/Unknown  cstate=WFConnection  UpToDate/DUnkown	#等待對端節點恢復.
#解決辦法:將主drbd的網路故障排除後,在主上執行連線命令 drbdadm connect mfs_meta0 (或則,將備drbd置主,下線主)
#故障原因:可能是由於備drbd伺服器,網路出現故障,主處於正常
4:(主上)role=Primary/Unknown	cstate=WFConnection  UpToDate/DUnkown	#等待對端節點恢復.
4:(備上)role=Secondary/Unknown  cstate=StandAlone  UpToDate/DUnkown	#表示網路配置不可用,資源還沒有被連線或者是被管理斷開
#解決辦法:
(1)可以不做處理,因為主是正常的,
(2)當然也可以在排除備機網路故障後,在備上重新連線 drbdadm connect mfs_meta0;(放棄本地資料進行連線)drbdadm connect --discard-my-data mfs_meta0
#故障原因:原因不明,主備都出現故障
5:(主上)role=Primary/Unknown	cstate=StandAlone  UpToDate/DUnkown	#表示網路配置不可用,資源還沒有被連線或者是被管理斷開
5:(備上)role=Secondary/Unknown  cstate=StandAlone  UpToDate/DUnkown	#表示網路配置不可用,資源還沒有被連線或者是被管理斷開
解決辦法:
A:先要排除主備機器的網路故障
B:在備上
drbdadm disconnect mfs_meta0
drbdadm secondary mfs_meta0
drbdadm connect --discard-my-data mfs_meta0	#放棄本地資料進行連線
C:在主上
drbdadm connect mfs_meta0
D:驗證是否正常
(附)問題五:如何修復因斷電導致的master可能無法啟動的情況
#需要最後一個後設資料日誌changelog 併入主要的metadata 中。這個操作時通過 mfsmetarestore 工具做的
#先修復(幾次測試發現:如果mfsmetarestore -a無法修復,則使用metalogger也無法修復)
mfsmetarestore -a
#如果master 資料被儲存在MooseFS 編譯指定地點外的路徑,則要利用-d 引數指定使用,如:
mfsmetarestore -a -d /opt/mfsmaster
#再啟動(才能成功)
#強制使用metadata.mfs.back建立metadata.mfs,可以啟動master,但應該會丟失1小時的資料。
#明確表示會丟失故障點到上一個整點之間的資料。和之前我猜測的一致。因為對mfs的操作日誌都記錄到changelog.0.mfs裡面。changelog.0.mfs每小時合併一次到metadata.mfs中,如果突然斷電,則changelog.0.mfs裡面的資訊就沒有合併到metadata中,強制使用metadata.mfs.back建立metadata.mfs,就會導致丟失changelog.0.mfs裡的資料。

轉載來源:https://www.linuxprobe.com/mfs.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2654884/,如需轉載,請註明出處,否則將追究法律責任。

相關文章