一、簡介
MooseFS(Moose File System,mfs)是一種分布式檔案系統,它将資料分布在網絡中的不同伺服器上,支援FUSE(使用者空間檔案系統Filesystem in Userspace,簡稱FUSE),用戶端挂載後可以作為一個 普通的Unix 檔案系統使用MooseFS。
MooseFS中共有四種角色:主要伺服器master server、主要備份伺服器metalogger server、存儲塊伺服器chunkserver、用戶端主機client。
主要伺服器負責各個存儲伺服器的管理、檔案讀寫排程、檔案空間回收以及恢複、多節點拷貝。
主要備份伺服器負責備份主要伺服器的中繼資料、變化日志檔案,檔案類型為changelog_ml.*.mfs,以便在主要伺服器出問題的時候可以恢複。
存儲塊伺服器負責提供存儲空間,并為客戶提供資料傳輸。
用戶端則通過fuse挂接主要伺服器上所管理的存儲塊伺服器,可以像操作本地檔案一樣操作MooseFS檔案系統中的檔案。

NFS雖然使用簡單,但當NFS用戶端通路量大時,通過NFS方式共享一個伺服器的存儲空間,使得NFS伺服器不堪重負,并且執行讀寫都比較頻繁的操作會出現意外的錯誤,對于高可靠的叢集部署是有挑戰的。
這種架構除了性能問題外還存在單點故障,一旦這個NFS伺服器發生故障,所有靠共享提供資料的應用就不再可用,盡管用rsync方式同步資料到另外一個伺服器上做nfs服務的備份,但這對提高整個系統的性能毫無幫助。
分布式檔案系統伺服器之間的資料通路不再是一對多的關系(1個NFS伺服器,多個NFS用戶端),而是多對多的關系,這樣一來,性能大幅提升毫無問題。moosefs分布式檔案系統,實施起來簡單、不停止服務擴容、恢複服務容易,因為作為共享存儲伺服器是個不錯的選擇。
MooseFS讀寫流程圖:
上面有詳細的MFS簡介和MooseFS分布式檔案系統安裝向導以及MFS。
先将mfs-1.6.25-1.tar.gz重命名為mfs-1.6.25.tar.gz
#yum install fuse-devel pkgconfig zlib-devel //build源碼包需要的依賴
#rpmbuild -ta mfs-1.6.25.tar.gz
會生成6個rpm二進制安裝包(其中debuginfo調試時使用):
也可以通過tar zxvf mfs-1.6.25-1.tar.gz解壓,使用./configure、make、make install安裝(具體參考安裝向導)。
(1)安裝
#rpm -ivh mfs-master-1.6.25-1.x86_64.rpm //安裝
#rpm -ql mfs-master //查詢安裝的檔案路徑,可以檢視所有的安裝檔案,便于修改
/etc/mfsexports.cfg.dist
/etc/mfsmaster.cfg.dist
/etc/mfstopology.cfg.dist
/usr/sbin/mfsmaster
/usr/sbin/mfsmetadump
/usr/sbin/mfsmetarestore
/usr/share/doc/mfs-master-1.6.25
/usr/share/doc/mfs-master-1.6.25/NEWS
/usr/share/doc/mfs-master-1.6.25/README
/usr/share/doc/mfs-master-1.6.25/UPGRADE
/usr/share/man/man5/mfsexports.cfg.5.gz
/usr/share/man/man5/mfsmaster.cfg.5.gz
/usr/share/man/man5/mfstopology.cfg.5.gz
/usr/share/man/man7/mfs.7.gz
/usr/share/man/man7/moosefs.7.gz
/usr/share/man/man8/mfsmaster.8.gz
/usr/share/man/man8/mfsmetarestore.8.gz
/var/lib/mfs
/var/lib/mfs/metadata.mfs.empty
<a></a>
(2)複制樣例檔案,以得到 master 所需的配置檔案
#cp mfsmaster.cfg.dist mfsmaster.cfg
#cp mfstopology.cfg.dist mfstopology.cfg
#cp mfsexports.cfg.dist mfsexports.cfg
如果我們打算更改這些配置檔案中的某些項目的值,則需要打開特定配置檔案相關文本行前的注釋,然後修改跟随其後的值。因為被注釋掉的行,即是 MooseFS 内置的預設值。
Mfsmaster.cfg 配置檔案包含主要伺服器 master 相關的設定,想檢視該配置檔案更多資訊使用指令 man mfsmaster.cfg。
mfsexports.cfg 指定那些用戶端主機可以遠端挂接 MooseFS 檔案系統,以及授予挂接用戶端什麼樣的通路權限。例如指定隻有 192.168.40.x 網段的主機可以以讀寫模式通路 MooseFS 的整個共享結構資源(/),在配置檔案 mfsexports.cfg 檔案的第二行改為或添加:
(注:可以挂在根/目錄下的子目錄,配置檔案加上192.168.40.0/24 /test rw,alldirs,maproot=0,password=test,注意test目錄是在根目錄已經建立好的子目錄,并且挂載時使用 mfsmount /mnt/client -H mfsmaster -o mfssubfolder=/test -p,否則會出現mfsmaster register error: Permission denied的錯誤。)
# Allow everything but "meta".
#* / rw,alldirs,maproot=0
192.168.40.0/24 / rw,alldirs,maproot=0
192.168.40.0/24 . rw
二進制檔案 metadata 和文本檔案 changelog 将被儲存在目錄/var/lib/mfs,安裝 master 時,會自動生成一個名為 metadata.mfs.empty 的中繼資料檔案 metadata,該檔案是空的。MooseFS master 運必須有檔案 metadata.mfs,這個檔案是從 metadata.mfs.empty 改名而來,運作mfsmaster時該檔案會被命名為metadata.mfs.back。隻要保證日志檔案和中繼資料檔案的安全,即使中繼資料伺服器遭到緻命的破壞,也可以通過備份的中繼資料檔案重新部署一套中繼資料伺服器。
#cd /var/lib/mfs
#cp metadata.mfs.empty metadata.mfs //MooseFS master 運作以後,metadata.mfs 檔案大小将發生變,不會為空檔案。
(3)綁定主機名 mfsmaster 與 ip (每個節點都需綁定)修改/etc/hosts 檔案,以綁定主機名 mfsmaster 與 ip 位址:
192.168.40.125 mfsmaster
(4)安裝CGI
為了監控 MooseFS 目前運作狀态,可以安裝運作 CGI 監控服務用浏覽器檢視整個MooseFS 的運作情況。
#rpm -ivh mfs-cgi-1.6.25-1.x86_64.rpm
#rpm -ql mfs-cgi
(5)啟動
#/usr/sbin/mfsmaster start
會出現問題:
working directory: /var/lib/mfs
can't create lockfile in working directory: EACCES (Permission denied)
主要是沒有設定運作使用者和運作組,添加使用者(安裝完成後配置檔案沒有改動),也可以使用nobody:nobody。
#groupadd mfs //添加 mfs 組
#useradd -g mfs mfs //新增系統使用者mfs
#chown -R mfs.mfs /var/lib/mfs //設定檔案所屬使用者群組(也可以直接指定使用者群組,不需要重新建立)
#vim /etc/mfsmaster.cfg
WORKING_USER = mfs
WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmaster
# LOCK_MEMORY = 0
然後正常啟動!
#/usr/sbin/mfscgiserv start
會打不開網頁,這是因為cgi檔案沒有可執行權限
#chmod +x /usr/share/mfscgi/*.cgi
然後啟動,在浏覽器位址欄輸入 http://192.168.40.125:9425 即可檢視 master 的運作情況(這時不能看見 chunk server 的資料)。
安裝備份伺服器metalogger的主機在性能上應該比 master 強大(至少有更多的記憶體),一旦主要伺服器 master 失效,隻要導入 changelogs 到中繼資料檔案,備份伺服器 metalogger 将能接替發生故障的 master,行使管理伺服器的職能。
若備份伺服器單獨安裝,需要安裝fuse-devel和修改vim /etc/hosts添加192.168.40.125 mfsmaster。添加mfs使用者群組,也可指定到其他使用者,或使用nobody:nobody。
#rpm -ivh mfs-metalogger-1.6.25-1.x86_64.rpm
#rpm -ql mfs-metalogger
#cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
#vimmfsmetalogger.cfg(不修改會出現Permission denied)
WORKING_USER = mfs
WORKING_GROUP = mfs
接着運作備份服務 mfsmetaloger:
#usr/sbin/mfsmetalogger start
在生産環境裡應當設定自動啟動腳本,以便作業系統重新啟動時MooseFSmfsmetalogger 服務也能自動運作。
若在其他主機上單獨安裝chunkserver需要安裝fuse-devel,并添加mfs使用者群組(可指定到其他使用者)
#rpm -ivh mfs-chunkserver-1.6.25-1.x86_64.rpm //安裝
#rpm -ql mfs-chunkserver //查詢安裝的檔案路徑,可以檢視所有的安裝檔案,便于修改
(2)準備 chunk server 服務所需的配置檔案
#cp mfschunkserver.cfg.dist mfschunkserver.cfg
#cp mfshdd.cfg.dist mfshdd.cfg
#vim /etc/mfschunkserver.cfg (想了解配置檔案mfschunkserver.cfg更詳細的資訊,請檢視手冊頁manmfschunkserver.cfg)
(3)建立共享點
在配置檔案 mfshdd.cfg 中,給出了用于用戶端挂接 MooseFS 分布式檔案系統根分區所使用的共享空間位置。建議在 chunk server 上劃分單獨的空間建立一個裝置挂載點作為儲存點專門給 MooseFS 使用,這樣做的好處是便于管理剩餘空間。
此處假定要使用兩個共享點/mnt/mfschunks1 和/mnt/mfschunks2,在 mfshdd.cfg 加入下面的文本行:
# mount points of HDD drives
#
#/mnt/hd1
#/mnt/hd2
#etc.
/mnt/mfschunks1
/mnt/mfschunks2
在啟動 chunk server 前,需確定使用者 mfs 有權限讀寫将要被挂接的分區(因為 chunk server 運作時要在此建立一個.lock 的檔案)。否則出現以下錯誤:
hdd space manager: can't create lock file '/mnt/mfschunks1/.lock': EACCES (Permission denied)
init: hdd space manager failed !!!
#chown -R mfs:mfs /mnt/mfschunks1
#chown -R mfs:mfs /mnt/mfschunks2
(注:若是單獨與master的機器,還需執行chown -R mfs:mfs /var/lib/mfs和修改/etc/hosts添加192.168.40.125mfsmaster。)
(4)開始啟動 chunk server
#/usr/sbin/mfschunkserver start
再通過浏覽器通路 http://192.168.40.125:9425就可以看到 MooseFS 系統的全部資訊,包括主要 master 和存儲服務 chunkserver 。
(5)MooseFS chunk 以獨占方式使用專門磁盤分區
在上述操作過程中不需要這部分的内容,此部分是在實際應用環境下,将chunk server用專門磁盤分區作為裝置挂載點,這樣做是不要的,便于管理剩餘空間,因為MooseFS 并不考慮其剩餘空間能被另作他用。
如果沒有單獨建立檔案系統的條件,可以在檔案中建立一個檔案系統,在此準備兩個 2GB 的檔案(檔案位于目錄/var/lib/mfs/下,也可以放在其他目錄下),并在其上建立檔案系統,把他們格式化為 ext3,分别挂接在/mnt/mfschunks1 和/mnt/mfschunks2。
操作步驟:挂接第一個檔案系統
1、建立鏡像檔案mfschunks1
#dd if=/dev/zero of=/var/lib/mfs/mfschunks1 bs=1024 count=1 seek=$((2*1024*1024-1))
2、建立檔案系統
##mkfs -t ext3 /var/lib/mfs/mfschunks1
3、建立挂接點
#mkdir -p /mnt/mfschunks1
4、挂接檔案系統
#mount -t ext3 -o loop /var/lib/mfs/mfschunks1 /mnt/mfschunks1
挂接第二個檔案系統的步驟與上面相同,#mount -t ext3 -o loop /var/lib/mfs/mfschunks2 /mnt/mfschunks2
在啟動 chunk server 前,需確定使用者 mfs 有權限讀寫将要被挂接的分區(因為 chunk server 運作時要在此建立一個.lock 的檔案):
#chown -R mfs:mfs /mnt/mfschunks1
為了挂接基于 MooseFS 分布式檔案,用戶端主機必須安裝 FUSE 軟體包( fuse 版本号至少
2.6,推薦使用版本号大于 2.7.2 的 fuse),#yum install fuse。
安裝用戶端軟體 mfsmount:
#rpm -ivh mfs-client-1.6.25-1.x86_64.rpm
(用戶端若單獨安裝,需要安裝fuse-devel和修改vim /etc/hosts添加192.168.40.125 mfsmaster。)
#cp /etc/mfsmount.cfg.dist /etc/mfsmount.cfg
假定用戶端的挂接點是/mnt/mfs,将以下面的指令來使用 MooseFS 分布式共享檔案系統:
1、 建立挂接點
#mkdir -p /mnt/mfs
2、開始挂接操作
#/usr/bin/mfsmount /mnt/mfs -H mfsmaster
有時會出現mfsmaster register error: Permission denied:
是因為mfsmaster的配置檔案和挂載目錄 不一緻的原因,vim /etc/mfsexports.cfg
192.168.40.0/24 /test rw,alldirs,maproot=0
master的挂載配置檔案中允許挂載的目錄是/test,若使用者#mfsmount/mnt -H mfsmaster(不加-o mfssubfolder-子檔案夾,預設是挂載/)挂載根/目錄會挂載不上,可以修改mfsexports.cfg配置檔案為/,再進行挂在就沒問題了。
# /usr/sbin/mfsmaster restart
有時挂載目錄有内容,提示error in fuse_mount,可以使用 -o nonempty選項挂載。
# mfsmount /mnt/mfs -H mfsmaster -o nonempty
3、挂載meta檔案系統
首先保證mfsexports.cfg檔案中加入:
# Allow "meta".
* . rw
然後執行:
#mfsmount -m /mnt/mfs -H mfsmaster
可以不挂載MFS META檔案系統,挂載該系統主要是為了恢複被誤删除的檔案。
4、檢視分區
執行指令 df -h | grep mfs 檢查分區情況(或使用mount):
mfsmaster:9421 102G 256K 102G 1% /mnt/mfs
(1)備份
#cd /mnt/mfs
#mkdir dir1
#mkdir dir2
預設mfs将儲存的檔案隻儲存在一個節點上(master選取的)。
設定儲存在儲存塊dir2上的檔案儲存在兩個節點上,做一個備份,系統會自動将資料同步到標明的節點上,這樣達到裡備份的效果。
因master和trunk伺服器在同一台機器上,即便設定了 goal=2 來到達儲存兩個副本但看到的隻是一個副本而已,盡管有兩個trunk挂在點,但它隻是一個 chunk server。
設定檔案副本數量,一般以3份為佳。
#mfssetgoal -r 3 /mnt/mfs
#mfsgetgoal /mnt/mfs/
#/mnt/mfs: 3
(2)設定删除檔案的空間回收時間
#mfsgettrashtime dir2/passwd
dir2/passwd: 86400
#mfssettrashtime 300 /mnt/mfs
擷取删除dir2/passwd後在資源回收筒中儲存的時間,防止使用者誤删,這個數字不能設定的太高也不能太低,一般設定為300(5分鐘)。
(3)檢視目錄資訊
#mfsdirinfo -H /mnt/mfs
(4)資料恢複
二進制檔案 metadata 和文本檔案 changelog 将被儲存在目錄/var/lib/mfs
(5)停止 MooseFS
為了安全停止 MooseFS 叢集,建議執行如下的步驟:
在所有用戶端用 unmount 指令先解除安裝檔案系統(本例将是: umount /mnt/mfs)
停止 chunk server 程序: /usr/sbin/mfschunkserver stop
停止 metalogger 程序: /usr/sbin/mfsmetalogger stop
停止主要 master server 程序: /usr/sbin/mfsmaster stop
(6)簡單使用腳本(配置啟動)
使用者可根據具體使用環境進行修改調試:
#!/bin/bash
if [ $# -ne 1 ] ; then
echo "please input:./moosefs.sh mfsmaster"
exit 1
fi
if [ "$UID" -ne 0 ]; then
echo "you are not root"
exit 2
ALLOW_IP_RANGE="192.168.40.0/24"
MASTERIP="192.168.40.125"
start_mfsmaster()
{
echo "------start_mfsmaster------"
cd /etc
cp mfsmaster.cfg.dist mfsmaster.cfg
cp mfstopology.cfg.dist mfstopology.cfg
cp mfsexports.cfg.dist mfsexports.cfg
chown -R nobody:nobody /var/lib/mfs
cd /var/lib/mfs
cp metadata.mfs.empty metadata.mfs
cat >> /etc/mfsexports.cfg << EOF
$ALLOW_IP_RANGE / rw,alldirs,maproot=0
$ALLOW_IP_RANGE . rw
EOF
echo "$MASTERIP mfsmaster" >> /etc/hosts
#sed -i '$a\192.168.40.125 mfsmaster' /etc/hosts
/usr/sbin/mfsmaster start
/usr/sbin/mfsmaster test &>> start.log
}
start_mfsmetalogger()
echo "------mfsmetalogger------"
cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
grep "mfsmaster" /etc/hosts &> /dev/null
if [ $? -eq 0 ]; then
echo "$MASTERIP mfsmaster" >> /etc/hosts
fi
usr/sbin/mfsmetalogger start
/usr/sbin/mfsmetalogger test &>> start.log
start_mfschunkserver()
echo "------mfschunkserver------"
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
/mnt/mfschunks1
/mnt/mfschunks2
chown -R nobody:nobody /mnt/mfschunks1
chown -R nobody:nobody /mnt/mfschunks2
/usr/sbin/mfschunkserver test &>> start.log
start_mfsclient()
echo "------mfsclient------"
cp /etc/mfsmount.cfg.dist /etc/mfsmount.cfg
mkdir -p /mnt/mfs
/usr/bin/mfsmount /mnt/mfs -H mfsmaster
/usr/bin/mfsmount -m /mnt/mfs -H mfsmaster
mkdir /mnt/mfs/sharedata
mkdir /mnt/mfs/sharefile
/usr/bin/mfssetgoal -r 3 /mnt/mfs
/usr/bin/mfssettrashtime 300 /mnt/mfs
stop_mfs()
result=`df -h | grep mfsmaster | awk -F" " '{print $6}'`
OLD_IFS="$IFS"
IFS="\n"
array=($result)
IFS="$OLD_IFS"
for element in ${arr[@]}
do
umount $element
done
/usr/sbin/mfschunkserver stop
/usr/sbin/mfsmetalogger stop
/usr/sbin/mfsmaster stop
main()
case "$1" in
mfsmaster)
start_mfsmaster;;
mfsmetalogger)
start_mfsmetalogger;;
mfschunkserver)
start_mfschunkserver;;
start_mfsclient)
start_mfsclient;;
*)
echo "please input:./moosefs.sh mfsmaster or mfsmetalogger or mfschunkserver or mfsclient"
esac
main $1
本文轉自yzy121403725 51CTO部落格,原文連結:http://blog.51cto.com/lookingdream/1828407,如需轉載請自行聯系原作者