您好,登錄后才能下訂單哦!
MFS是一個具有容錯性的網絡分布式文件系統,它把數據分散存放在多個物理服務器上,而呈現給用戶的則是一個統一的資源;分布式文件系統就是把一些分散在多臺計算機上的共享文件夾,集合到一個共享文件夾內,用戶要訪問這些文件夾的時候,只要打開一個文件夾,就可以的看到所有鏈接到此文件夾內的共享文件夾。 |
管理服務器:負責各個數據存儲服務器的管理,文件讀寫調度,文件空間回收以及恢復.多節點拷貝;
元數據日志服務器:負責備份master 服務器的變化日志文件,文件類型為changelog_ml.*.mfs ,以便于在master server 出問題的時候接替其進行工作;
數據存儲服務器:負責連接管理服務器,聽從管理服務器調度,提供存儲空間,并為客戶提供數據傳輸.存儲的是數據塊或則碎片;
客戶機:通過fuse 內核接口掛接遠程管理服務器上所管理的數據存儲服務器,.看起來共享的文件系統和本地unix 文件系統使用一樣的效果。
本次實驗架構及相關準備信息(備注:所有系統環境均為 centos7.4,請按圖表配置好IP與主機名)
1:client當需要一個數據時,首先向master server發起查詢請求;
2:管理服務器檢索自己的數據,獲取到數據所在的可用數據服務器位置ip|port|chunkid;
3:管理服務器將數據服務器的地址發送給客戶端;
4:客戶端向具體的數據服務器發起數據獲取請求;
5:數據服務器將數據發送給客戶端;
1:當客戶端有數據寫需求時,首先向管理服務器提供文件元數據信息請求存儲地址(元數據信息如:文件名|大小|份數等);
2:管理服務器根據寫文件的元數據信息,到數據服務器創建新的數據塊;
3:數據服務器返回創建成功的消息;
4:管理服務器將數據服務器的地址返回給客戶端(chunkIP|port|chunkid);
5:客戶端向數據服務器寫數據;
6:數據服務器返回給客戶端寫成功的消息;
7:客戶端將此次寫完成結束信號和一些信息發送到管理服務器來更新文件的長度和最后修改時間
1:客戶端有刪除操作時,首先向Master發送刪除信息;
2:Master定位到相應元數據信息進行刪除,并將chunk server上塊的刪除操作加入隊列異步清理;
3:響應客戶端刪除成功的信號
1:客戶端有修改文件內容時,首先向Master發送操作信息;
2:Master申請新的塊給.swp文件,
3:客戶端關閉文件后,會向Master發送關閉信息;
4:Master會檢測內容是否有更新,若有,則申請新的塊存放更改后的文件,刪除原有塊和.swp文件塊;
5:若無,則直接刪除.swp文件塊。
1:客戶端重命名文件時,會向Master發送操作信息;
2:Master直接修改元數據信息中的文件名;返回重命名完成信息;
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
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服務 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"
在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"
在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)元數據日志服務器(這個角色可以在任何機器上運行,可以遠程備份)(可以后來才添加,也能保持元數據一致性) #修改目錄權限 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服務器 #創建數據存放目錄并修改目錄所有者(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
#這是我寫的監控腳本,(這里的腳本,只能實現,在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
答:不會,原因:參看MFS的工作原理流程分析
正常啟動順序:matser >> chunk >> metalogger >> client 正常關閉順序:client >> chunk >> metalogger >> master
master主機上:drbd資源啟動 >> drbd資源置主 >> 掛載drbd到指定目錄 >> 啟動mfsmaster和mfscgiser >> 啟動keepalived掌管VIP slave備機上:drbd資源啟動 >> drbd資源置從 >> 啟動keepalived監測master主機是否故障
正常狀態: 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:驗證是否正常
#需要最后一個元數據日志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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。