原文 http://www.tuicool.com/articles/vQvEZ3y
MooseFS是一款具有冗余容錯功能的分布式文件系統。它把數據分散在多台服務器上,確保一份數據多個備份副本,對外提供統一的結構。
功能特性
對於標准的文件操作,MooseFS表現與其他類Unix文件系統一致。支持的通過文件系統特性:
- 層次結構(目錄樹)
- 兼容POSIX文件屬性
- 支持特殊文件
- 符號鏈接和硬鏈接
- 基於IP地址和密碼的訪問控制
獨有特性
- 高可靠性(數據的多個副本存儲在不同服務器)
- 容量動態擴展(添加新硬盤或者服務器)
- 可以回收在制定時間內刪除的文件,類似回收站功能
- 可以對整個文件甚至是正在被寫入的文件創建文件快照
MFS整體架構的四種角色
-
Master(元數據服務器)負責各個數據存儲服務器的管理,文件讀寫調度,文件空間回收以及恢復,多節點拷貝。
-
Metalogger(元數據日志服務器)
負責備份Master服務器的changelog。文件類型為
changelog.*.mfs,以便在Master出問題時接替其工作 -
Chunk(數據存儲服務器)負責連接Master,聽從Master調度,提供存儲空間,並為客戶端提供數據傳輸
-
Client(客戶端掛載)通過FUSE內核接口掛載遠程管理服務器(master)上所管理的數據存儲服務器,使用起來和本地文件系統一樣
MFS工作圖解
- 網絡架構

- 工作原理


- 集群拓撲

安裝配置MFS
系統環境介紹
- OS:
CentOS Linux release 7.2.1511 (Core) - 軟件版本:2.0.81-1
- 節點配置
| ip地址 | 角色 |
| ————- | ———- |
| 172.16.18.137 | master |
| 172.16.18.134 | metalogger |
| 172.16.18.183 | chunk |
| 172.16.18.184 | chunk |
| 172.16.18.185 | chunk |
| 172.16.18.186 | chunk |
| 172.16.18.187 | chunk |
chunk上有四塊硬盤,第一塊為系統,剩下三塊作為數據存儲,每塊容量為4TB
軟件安裝
從官方軟件庫安裝MFS
- 添加yum key
curl "http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
- 下載軟件庫配置文件
//For EL7 family:
curl "http://ppa.moosefs.com/MooseFS-stable-el7.repo" > /etc/yum.repos.d/MooseFS.repo //For EL6 family: curl "http://ppa.moosefs.com/MooseFS-stable-el6.repo" > /etc/yum.repos.d/MooseFS.repo For EL5 family: Due to GPGv4 incompatibility with CentOS 5, CentOS 5 is deprecated. If you really need CentOS 5 packages, please contact support@moosefs.com.
- 安裝軟件包
// For Master Server:
yum install moosefs-master moosefs-cli moosefs-cgi moosefs-cgiserv
// For Chunkservers: yum install moosefs-chunkserver //For Metaloggers: yum install moosefs-metalogger For Clients: //yum install moosefs-client
- 啟動服務
//To start process manually: mfsmaster start mfschunkserver start //For systemd OS family - EL7: systemctl start moosefs-master.service systemctl start moosefs-chunkserver.service //For SysV OS family - EL6: service moosefs-master start service moosefs-chunkserver start
從源碼安裝MFS
- 下載軟件包
wget http://ppa.moosefs.com/src/moosefs-2.0.88-1.tar.gz
- 添加用戶和組
useradd -s /sbin/nologin -M mfs
- 安裝軟件包
tar-zxf moosefs-2.0.88-1.tar.gz cd moosefs-2.0.88 // For master ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount // For metalogger ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount // For chunk ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount --disable-mfscgi --disable-mfscgiserv
- 安裝MFS client
client安裝需要fuse支持,fuse可以從源碼和倉庫中安裝
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --disable-mfscgi --disable-mfscgiserv
配置MFS
Master
- 配置文件
// mfsmaster.cfg
# WORKING_USER = mfs 運行 master server 的用戶 # WORKING_GROUP = mfs 運行 master server 的組 # SYSLOG_IDENT = mfsmaster master server 在 syslog中的標識,說明是由 master serve 產生的 # LOCK_MEMORY = 0 是否執行 mlockall()以避免 mfsmaster 進程溢出(默認為 0) # NICE_LEVEL = -19 運行的優先級(如果可以默認是 -19; 注意: 進程必須是用 root啟動) # EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg 被掛接目錄及其權限控制文件的存放位置 # TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfs/mfstopology.cfg # DATA_PATH = /usr/local/mfs/var/mfs 數據存放路徑,此目錄下大致有三類文件,changelog,sessions和 stats; # BACK_LOGS = 50 metadata 的改變 log 文件數目(默認是 50); # BACK_META_KEEP_PREVIOUS = 1 # REPLICATIONS_DELAY_INIT = 300 延遲復制的時間(默認是 300s); # REPLICATIONS_DELAY_DISCONNECT = 3600 chunkserver 斷開的復制延遲(默認是 3600); # MATOML_LISTEN_HOST = * metalogger 監聽的 IP 地址(默認是*,代表任何 IP); # MATOML_LISTEN_PORT = 9419 metalogger 監聽的端口地址(默認是 9419); # MATOML_LOG_PRESERVE_SECONDS = 600 # MATOCS_LISTEN_HOST = * 用於 chunkserver 連接的 IP 地址(默認是*,代表任何 IP); # MATOCS_LISTEN_PORT = 9420 用於 chunkserver 連接的端口地址(默認是 9420); # MATOCU_LISTEN_HOST = * 用於客戶端掛接連接的 IP 地址(默認是*,代表任何 IP); # MATOCU_LISTEN_PORT = 9421 用於客戶端掛接連接的端口地址(默認是 9421); # CHUNKS_LOOP_MAX_CPS = 100000 # CHUNKS_LOOP_MIN_TIME = 300 chunks 的回環頻率(默認是:300 秒); 注:原文為Chunks loop frequency in seconds (default is 300) # CHUNKS_SOFT_DEL_LIMIT = 10 # CHUNKS_HARD_DEL_LIMIT = 25 # CHUNKS_WRITE_REP_LIMIT = 2 # CHUNKS_READ_REP_LIMIT = 10 # ACCEPTABLE_DIFFERENCE = 0.1 # SESSION_SUSTAIN_TIME = 86400 # REJECT_OLD_CLIENTS = 0 彈出低於 1.6.0 的客戶端掛接(0 或 1,默認是 0)注意mfsexports 訪問控制對於那些老客戶是沒用的 # deprecated: # CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead # LOCK_FILE - lock system has been changed, and this option is used only to search for old lockfile \\ mfsexport.cfg #* / ro #192.168.1.0/24 / rw #192.168.1.0/24 / rw,alldirs,maproot=0,password=passcode #10.0.0.0-10.0.0.5 /test rw,maproot=nobody,password=test * . rw #* / rw,alldirs,maproot=0 172.16.18.221 . rw \\ 回收站 172.16.18.221 / rw,alldirs,maproot=0 172.16.18.134 / rw,alldirs,maproot=0
- 修改配置文件
cd /usr/local/mfs/etc/
mv mfsmaster.cfg.dist mfsmaster.cfg
mv mfsexports.cfg.dist mfsexports.cfg
mfsmaster.cfg : master的主配置文件,配置文件中所有的選項都是用#注釋掉的,這代表的是將會使用的選項的默認參數,如果要修改只需取消注釋修改其值為你所要使用的值即可;
mfsexportes.cfg 為共享mfs文件系統的控制文件,NFS要共享一個目錄時,我們會使用vim /etc/exports命令,編寫共享給誰,所要共享的目錄,共享出去的屬性這些內容,而mfsexports.cfg的作用與其類似其書寫格式如下:
client Directory Property * / rw,alldirs,maproot=0 client支持格式:ip、ip/netmask、ip/位數掩碼、ip-ip、*
該文件每一個條目分為三部分:
第一部分:客戶端的ip 地址
第二部分:被掛接的目錄
第三部分:客戶端擁有的權限
//地址可以指定的幾種表現形式:
* 所有的ip 地址
n.n.n.n 單個ip 地址
n.n.n.n/b IP 網絡地址/位數掩碼
n.n.n.n/m.m.m.m IP 網絡地址/子網掩碼
f.f.f.f-t.t.t.t IP 段
//目錄部分需要注意兩點: / 標識MooseFS 根; . 表示MFSMETA 文件系統 //權限部分: ro 只讀模式共享 rw 讀寫的方式共享 alldirs 許掛載任何指定的子目錄
- 啟動服務
/usr/local/mfs/sbin/mfsmaster start //為了監控moosefs的當前運行狀態,我們可以運行cgi服務,這樣就可以用瀏覽器查看整個moosefs的運行情況 /usr/local/mfs/sbin/mfscgiserv
Metalogger
- 修改配置文件
mv mfsmetalogger.cfg.dist mfsmetalogger.cfg META_DOWNLOAD_FREQ = 24 \\元數據備份下載請求頻率,設置為1小時 MASTER_HOST = 172.16.18.137 \\修改MASTER_HOST的值,為MASTER_HOST的ip地址
- 啟動服務
/usr/local/mfs/sbin/mfsmetalogger start
ChunkServer
- 配置分區
parted -s /dev/sdb 'mklabel gpt';parted -s /dev/sdc 'mklabel gpt';parted -s /dev/sdd 'mklabel gpt' parted -s /dev/sdb 'mkpart primary 0 -1'; parted -s /dev/sdc 'mkpart primary 0 -1'; parted -s /dev/sdd 'mkpart primary 0 -1' mkfs.ext4 -q -T largefile /dev/sdb1;mkfs.ext4 -q -T largefile /dev/sdc1;mkfs.ext4 -q -T largefile /dev/sdd1 mkdir /MFS_data{1,2,3} mount /dev/sdb1 /MFS_data1; mount /dev/sdc1 /MFS_data2; mount /dev/sdd1 /MFS_data3 chown mfs:mfs /MFS_data*
- 修改配置文件
mv mfschunkserver.cfg.dist mfschunkserver.cfg 修改MASTER_HOST的值,為MASTER_HOST的ip地址: MASTER_HOST = 172.16.18.137 mv mfshdd.cfg.dist mfshdd.cfg 增加掛載目錄信息 /MFS_data1 /MFS_data2 /MFS_data3
- 啟動服務
/usr/local/mfs/sbin/mfschunkserver start
Client
- 掛載MFS
mkdir /MFS_data
/usr/local/mfs/bin/mfsmount /MFS_data -H 172.16.18.137 mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
特別需要注意的是,所有的MFS 都是掛接同一個元數據服務器master 的IP,而不是其他數據存儲服務器chunkserver 的IP
使用MFS
MFS文件系統使用
Client通過MFS軟件提供的工具來管理MFS文件系統,下面是工具介紹
/usr/local/mfs/bin/mfstools -h
mfs multi tool
usage:
mfstools create - create symlinks (mfs<toolname> -> /usr/local/mfs/bin/mfstools)
tools:
mfsgetgoal // 設定副本數 mfssetgoal // 獲取副本數 mfsgettrashtime // 設定回收站時間 mfssettrashtime // 設定回收站時間 mfscheckfile // 檢查文件 mfsfileinfo // 文件信息 mfsappendchunks mfsdirinfo // 目錄信息 mfsfilerepair // 文件修復 mfsmakesnapshot // 快照 mfsgeteattr // 設置權限 mfsseteattr mfsdeleattr deprecated tools: // 遞歸設置 mfsrgetgoal = mfsgetgoal -r mfsrsetgoal = mfssetgoal -r mfsrgettrashtime = mfsgettreshtime -r mfsrsettrashtime = mfssettreshtime -r
掛載文件系統
MooseFS 文件系統利用下面的命令:
mfsmount mountpoint [-d][-f] [-s][-m] [-n][-p] [-HMASTER][-PPORT] [-S PATH][-o OPT[,OPT...]]
-H MASTER:是管理服務器(master server)的ip 地址
-P PORT: 是管理服務器( master server)的端口號,要按照mfsmaster.cfg 配置文件中的變量 MATOCU_LISTEN_POR 的之填寫。如果master serve 使用的是默認端口號則不用指出。 -S PATH:指出被掛接mfs 目錄的子目錄,默認是/目錄,就是掛載整個mfs 目錄。
Mountpoint:是指先前創建的用來掛接mfs 的目錄。
在開始mfsmount 進程時,用一個-m 或-o mfsmeta 的選項,這樣可以掛接一個輔助的文件系統
MFSMETA,這么做的目的是對於意外的從MooseFS 卷上刪除文件或者是為了釋放磁盤空間而移動的
文件而又此文件又過去了垃圾文件存放期的恢復,例如:
/usr/local/mfs/bin/mfsmount -m /MFS_meta/ -H 172.16.18.137
設定副本數量
目標(goal),是指文件被拷貝副本的份數,設定了拷貝的份數后是可以通過mfsgetgoal 命令來證實的,也可以通過mfsrsetgoal 來改變設定。
mfssetgoal 3 /MFS_data/test/ mfssetgoal 3 /MFS_data/test/
用 mfsgetgoal –r 和 mfssetgoal –r 同樣的操作可以對整個樹形目錄遞歸操作,其等效於 mfsrsetgoal 命令。實際的拷貝份數可以通過 mfscheckfile 和 mfsfile info 命令來證實。
注意以下幾種特殊情況:
- 一個不包含數據的零長度的文件,盡管沒有設置為非零的目標(the non-zero “goal”),但用mfscheckfile 命令查詢將返回一個空的結果;將文件填充內容后,其會根據設置的goal創建副本;這時再將文件清空,其副本依然作為空文件存在。
- 假如改變一個已經存在的文件的拷貝個數,那么文件的拷貝份數將會被擴大或者被刪除,這個過程會有延時。可以通過mfscheckfile 命令來證實。
- 對一個目錄設定“目標”,此目錄下的新創建文件和子目錄均會繼承此目錄的設定,但不會改變已經存在的文件及目錄的拷貝份數。
可以通過mfsdirinfo來查看整個目錄樹的信息摘要。
垃圾回收站
一個被刪除文件能夠存放在一個“ 垃圾箱”的時間就是一個隔離時間, 這個時間可以用 mfsgettrashtime 命令來驗證,也可以使用`mfssettrashtime 命令來設置。
mfssettrashtime 64800 /MFS_data/test/test1 mfsgettrashtime /MFS_data/test/test1
時間的單位是秒(有用的值有:1 小時是3600 秒,24 - 86400 秒,1天 - 604800 秒)。就像文件被存儲的份數一樣, 為一個目錄設定存放時間是要被新創建的文件和目錄所繼承的。數字0 意味着一個文件被刪除后, 將立即被徹底刪除,在想回收是不可能的。
刪除文件可以通過一個單獨安裝MFSMETA 文件系統。特別是它包含目錄/ trash (包含任然可以被還原的被刪除文件的信息)和/ trash/undel (用於獲取文件)。只有管理員有權限訪問MFSMETA(用戶的uid 0,通常是root)。
/usr/local/mfs/bin/mfsmount -m /MFS_meta/ -H 172.16.18.137
被刪文件的文件名在“垃圾箱”目錄里還可見,文件名由一個八位十六進制的數i-node 和被刪文件的文件名組成,在文件名和i-node 之間不是用“/”,而是用了“|”替代。如果一個文件名的長度超過操作系統的限制(通常是255 個字符),那么部分將被刪除。通過從掛載點起全路徑的文件名被刪除的文件任然可以被讀寫。
移動這個文件到trash/undel 子目錄下,將會使原始的文件恢復到正確的MooseFS 文件系統上路徑下(如果路徑沒有改變)。如果在同一路徑下有個新的同名文件,那么恢復不會成功。
從“垃圾箱”中刪除文件結果是釋放之前被它站用的空間(刪除有延遲,數據被異步刪除)。
在MFSMETA中還有另一個目錄reserved,該目錄內的是被刪除但依然打開的文件。在用戶關閉了這些被打開的文件后,reserved 目錄中的文件將被刪除,文件的數據也將被立即刪除。在reserved 目錄中文件的命名方法同trash 目錄中的一樣,但是不能有其他功能的操作。
快照snapshot
MooseFS 系統的另一個特征是利用mfsmakesnapshot 工具給文件或者是目錄樹做快照
mfsmakesnapshot source ... destination
Mfsmakesnapshot 是在一次執行中整合了一個或是一組文件的拷貝,而且任何修改這些文件的源文件都不會影響到源文件的快照, 就是說任何對源文件的操作,例如寫入源文件,將不會修改副本(或反之亦然)。
也可以使用mfsappendchunks:
mfsappendchunks destination-file source-file ...
當有多個源文件時,它們的快照被加入到同一個目標文件中(每個chunk 的最大量是chunk)。
MFS集群維護
啟動MFS集群
安全的啟動MooseFS 集群(避免任何讀或寫的錯誤數據或類似的問題)的方式是按照以下命令步驟:
- 啟動mfsmaster 進程
- 啟動所有的mfschunkserver 進程
- 啟動mfsmetalogger 進程(如果配置了mfsmetalogger)
- 當所有的chunkservers 連接到MooseFS master 后,任何數目的客戶端可以利用mfsmount 去掛接被export 的文件系統。(可以通過檢查master 的日志或是CGI 監視器來查看是否所有的chunkserver被連接)。
停止MFS集群
安全的停止MooseFS 集群:
- 在所有的客戶端卸載MooseFS 文件系統(用umount 命令或者是其它等效的命令)
- 用mfschunkserver stop 命令停止chunkserver 進程
- 用mfsmetalogger stop 命令停止metalogger 進程
- 用mfsmaster stop 命令停止master 進程
Chunkservers 的維護
若每個文件的goal(目標)都不小於2,並且沒有under-goal 文件(這些可以用mfsgetgoal –r和mfsdirinfo 命令來檢查),那么一個單一的chunkserver 在任何時刻都可能做停止或者是重新啟動。以后每當需要做停止或者是重新啟動另一個chunkserver 的時候,要確定之前的chunkserver 被連接,而且要沒有under-goal chunks。
MFS元數據備份
通常元數據有兩部分的數據:
- 主要元數據文件metadata.mfs,當mfsmaster 運行的時候會被命名為metadata.mfs.back
- 元數據改變日志changelog.*.mfs,存儲了過去的N 小時的文件改變(N 的數值是由BACK_LOGS參數設置的,參數的設置在mfschunkserver.cfg 配置文件中)。
主要的元數據文件需要定期備份,備份的頻率取決於取決於多少小時changelogs 儲存。元數據changelogs 實時的自動復制。1.6版本中這個工作都由metalogger完成。
MFS Master的恢復
一旦mfsmaster 崩潰(例如因為主機或電源失敗),需要最后一個元數據日志changelog 並入主要的metadata 中。這個操作時通過 mfsmetarestore 工具做的,最簡單的方法是:
mfsmetarestore -a
如果master 數據被存儲在MooseFS 編譯指定地點外的路徑,則要利用-d 參數指定使用,如:
mfsmetarestore -a -d /opt/mfsmaster
從MetaLogger中恢復Master
如果mfsmetarestore -a無法修復,則使用metalogger也可能無法修復,暫時沒遇到過這種情況,這里不暫不考慮。
- 找回metadata.mfs.back 文件,可以從備份中找,也可以中metalogger 主機中找(如果啟動了metalogger 服務),然后把metadata.mfs.back 放入data 目錄,一般為{prefix}/var/mfs
- 從在master 宕掉之前的任何運行metalogger 服務的服務器上拷貝最后metadata 文件,然后放入mfsmaster 的數據目錄。
- 利用mfsmetarestore 命令合並元數據changelogs,可以用自動恢復模式mfsmetarestore –a,也可以利用非自動化恢復模式
mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs
或:強制使用metadata.mfs.back創建metadata.mfs,可以啟動master,但丟失的數據暫無法確定。
Automated Failover
生產環境使用 MooseFS 時,需要保證 master 節點的高可用。 使用 ucarp 是一種比較成熟的方案,或者 DRBD+[hearbeat|keepalived] 。 ucarp 類似於 keepalived ,通過主備服務器間的健康檢查來發現集群狀態,並執行相應操作。另外 MooseFS商業版本已經支持雙主配置,解決單點故障。
