MooseFS是一個分布式存儲的框架,其具有如下特性:
1.Free(GPL)
2.通用文件系統,不需要修改上層應用就可以使用
3.可以在線擴容,體系架構可伸縮性極強。
4.部署簡單。
5.高可用,可設置任意的文件冗余程度
6.可回收在指定時間內刪除的文件
7.提供netapp,emc,ibm等商業存儲的snapshot特性。
8.google filesystem的一個c實現。
9.提供web gui監控接口。
10.提高隨機讀或寫的效率。
11.提高海量小文件的讀寫效率。
MFS 工作原理和設計架構


官方的網絡示意圖是這樣的:


讀寫原理:



192.168.122.10 node1.uplooking.com master server
192.168.122.20 node2.uplooking.com metalogger server
192.168.122.30 node3.uplooking.com chunk server
192.168.122.40 node4.uplooking.com chunk server
192.168.122.50 node5.uplooking.com chunk server
192.168.122.60 node6.uplooking.com mfs client
master server
[root@node1 ~]# useradd mfs -s /sbin/nologin
[root@node1 ~]# cd /tmp/
[root@node1 tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@node1 tmp]# cd mfs-1.6.20-2
[root@node1 mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@node1 mfs-1.6.20-2]# make
[root@node1 mfs-1.6.20-2]# make install
[root@node1 mfs-1.6.20-2]# cd /usr/local/mfs/etc/
主配置文件
[root@node1 etc]# cp mfsmaster.cfg.dist mfsmaster.cfg
被掛接目錄及權限配置
[root@node1 etc]# cp mfsexports.cfg.dist mfsexports.cfg
[root@node1 etc]# cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
[root@node1 etc]# /usr/local/mfs/sbin/mfsmaster start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
loading sessions ... ok
sessions file has been loaded
exports file has been loaded
loading metadata ...
create new empty filesystemmetadata file has been loaded
no charts data file - initializing empty charts
master <-> metaloggers module: listen on *:9419
master <-> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly
啟動WEB監控服務
[root@node1 etc]# /usr/local/mfs/sbin/mfscgiserv
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi)
[root@node1 etc]# firefox http://192.168.122.10:9425


chunk server
[root@node3 ~]# useradd mfs -s /sbin/nologin
[root@node3 ~]# cd /tmp/
[root@node3 tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@node3 tmp]# cd mfs-1.6.20-2
[root@node3 mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
[root@node3 mfs-1.6.20-2]# make
[root@node3 mfs-1.6.20-2]# make install
[root@node3 mfs-1.6.20-2]# cd /usr/local/mfs/etc/
[root@node3 etc]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
mfs使用空間配置
[root@node3 etc]# cp mfshdd.cfg.dist mfshdd.cfg
[root@node3 etc]# vim /usr/local/mfs/etc/mfschunkserver.cfg
MASTER_HOST = 192.168.122.10
[root@node3 etc]# mkdir /data
[root@node3 etc]# mount /dev/hda1 /data
[root@node3 etc]# chown -R mfs:mfs /data
[root@node3 etc]# vim mfshdd.cfg
/data
[root@node3 etc]# /usr/local/mfs/sbin/mfschunkserver start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfschunkserver modules ...
hdd space manager: scanning folder /data/ ...
hdd space manager: scanning complete
hdd space manager: /data/: 0 chunks found
hdd space manager: scanning complete
main server module: listen on *:9422
no charts data file - initializing empty charts
mfschunkserver daemon initialized properly


metalogger server
[root@node2 ~]# useradd mfs -s /sbin/nologin
[root@node2 ~]# cd /tmp/
[root@node2 tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@node2 tmp]# cd mfs-1.6.20-2
[root@node2 mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@node2 mfs-1.6.20-2]# make
[root@node2 mfs-1.6.20-2]# make install
[root@node2 mfs-1.6.20-2]# cd /usr/local/mfs/etc/
[root@node2 etc]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
[root@node2 etc]# vim mfsmetalogger.cfg
MASTER_HOST = 192.168.122.10
[root@node2 etc]# /usr/local/mfs/sbin/mfsmetalogger start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly


mfs client
[root@node6 ~]# yum install fuse fuse-libs fuse-devel
[root@node6 ~]# useradd mfs -s /sbin/nologin
[root@node6 ~]# cd /tmp/
[root@node6 tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@node6 tmp]# cd mfs-1.6.20-2
[root@node6 mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver
[root@node6 mfs-1.6.20-2]# make
[root@node6 mfs-1.6.20-2]# make install
[root@node6 mfs-1.6.20-2]# /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.122.10
mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
[root@node6 mfs-1.6.20-2]# /usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta -H 192.168.122.10
mfsmaster accepted connection with parameters: read-write,restricted_ip
可能報錯
# /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.122.10
mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
fuse: device not found, try 'modprobe fuse' first
error in fuse_mount
解決辦法
# modprobe fuse
再次掛載
# /usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta -H 192.168.122.10
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@node6 mfs-1.6.20-2]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 8.6G 2.6G 5.6G 32% /
/dev/vda1 99M 12M 82M 13% /boot
tmpfs 252M 0 252M 0% /dev/shm
mfs#192.168.122.10:9421 22G 0 22G 0% /mnt/mfs


MFS的高級特性
1.冗余goal設置
目標(goal),是指文件被拷貝的份數,設定了拷貝的份數后是可以通過mfsgetgoal 命令來證實的,也可以通過mfsrsetgoal 來改變設定。
/usr/local/mfs/bin/mfssetgoal 3 /mnt/mfs/test1
/usr/local/mfs/bin/mfsgetgoal /mnt/mfs/test1
/mnt/mfs/test1: 3
用mfsgetgoal –r 和mfssetgoal –r 同樣的操作可以對整個樹形目錄遞歸操作,其等效於mfsrsetgoal命令。實際的拷貝份數可以通過mfscheckfile 和mfsfile info 命令來證實。
注意以下幾種特殊情況:
◾一個不包含數據的零長度的文件,盡管沒有設置為非零的目標(the non-zero “goal”),但用mfscheckfile 命令查詢將返回一個空的結果;將文件填充內容后,其會根據設置的goal創建副本;這時再將文件清空,其副本依然作為空文件存在。
◾假如改變一個已經存在的文件的拷貝個數,那么文件的拷貝份數將會被擴大或者被刪除,這個過程會有延時。可以通過mfscheckfile 命令來證實。
◾對一個目錄設定“目標”,此目錄下的新創建文件和子目錄均會繼承此目錄的設定,但不會改變已經存在的文件及目錄的拷貝份數。
可以通過mfsdirinfo來查看整個目錄樹的信息摘要。
2.垃圾回收站
一個刪除文件能夠存放在一個“ 垃圾箱”的時間就是一個隔離時間, 這個時間可以用mfsgettrashtime 命令來驗證,也可以用mfssettrashtime 命令來設置。如:
/usr/local/mfs/bin/mfssettrashtime 64800 /mnt/mfs/test1
/usr/local/mfs/bin/mfsgettrashtime /mnt/mfs/test1
/mnt/mfs/test1: 64800
時間的單位是秒(有用的值有:1 小時是3600 秒,24 – 86400 秒,1天 – 604800 秒)。就像文件被存儲的份數一樣, 為一個目錄設定存放時間是要被新創建的文件和目錄所繼承的。數字0 意味着一個文件被刪除后, 將立即被徹底刪除,在想回收是不可能的。
刪除文件可以通過一個單獨安裝MFSMETA 文件系統。特別是它包含目錄/ trash (包含任然可以被還原的被刪除文件的信息)和/ trash/undel (用於獲取文件)。只有管理員有權限訪問MFSMETA(用戶的uid 0,通常是root)。
/usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta -H 192.168.0.1
被刪文件的文件名在“垃圾箱”目錄里還可見,文件名由一個八位十六進制的數i-node 和被刪文件的文件名組成,在文件名和i-node 之間不是用“/”,而是用了“|”替代。如果一個文件名的長度超過操作系統的限制(通常是255 個字符),那么部分將被刪除。通過從掛載點起全路徑的文件名被刪除的文件任然可以被讀寫。
移動這個文件到trash/undel 子目錄下,將會使原始的文件恢復到正確的MooseFS 文件系統上路徑下(如果路徑沒有改變)。如果在同一路徑下有個新的同名文件,那么恢復不會成功。
從“垃圾箱”中刪除文件結果是釋放之前被它站用的空間(刪除有延遲,數據被異步刪除)。
在MFSMETA中還有另一個目錄reserved,該目錄內的是被刪除但依然打開的文件。在用戶關閉了這些被打開的文件后,reserved 目錄中的文件將被刪除,文件的數據也將被立即刪除。在reserved 目錄中文件的命名方法同trash 目錄中的一樣,但是不能有其他功能的操作。
3.快照snapshot
MooseFS 系統的另一個特征是利用mfsmakesnapshot 工具給文件或者是目錄樹做快照。
/usr/local/mfs/bin/mfsmakesnapshot source ... destination
Mfsmakesnapshot 是在一次執行中整合了一個或是一組文件的拷貝,而且任何修改這些文件的源文件都不會影響到源文件的快照, 就是說任何對源文件的操作,例如寫入源文件,將不會修改副本(或反之亦然)。
也可以使用mfsappendchunks:
/usr/local/mfs/bin/mfsappendchunks destination-file source-file ...
當有多個源文件時,它們的快照被加入到同一個目標文件中(每個chunk 的最大量是chunk)。