原文 http://www.tuicool.com/articles/vQvEZ3yjavascript
MooseFS是一款具備冗餘容錯功能的分佈式文件系統。它把數據分散在多臺服務器上,確保一份數據多個備份副本,對外提供統一的結構。php
對於標準的文件操做,MooseFS表現與其餘類Unix文件系統一致。支持的經過文件系統特性:java
Master(元數據服務器)負責各個數據存儲服務器的管理,文件讀寫調度,文件空間回收以及恢復,多節點拷貝。node
Metalogger(元數據日誌服務器)sql
負責備份Master服務器的changelog。文件類型爲 changelog.*.mfs
,以便在Master出問題時接替其工做vim
Chunk(數據存儲服務器)負責鏈接Master,遵從Master調度,提供存儲空間,併爲客戶端提供數據傳輸瀏覽器
Client(客戶端掛載)經過FUSE內核接口掛載遠程管理服務器(master)上所管理的數據存儲服務器,使用起來和本地文件系統同樣安全
CentOS Linux release 7.2.1511 (Core)
chunk上有四塊硬盤,第一塊爲系統,剩下三塊做爲數據存儲,每塊容量爲4TBruby
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
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
client安裝須要fuse支持,fuse能夠從源碼和倉庫中安裝服務器
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --disable-mfscgi --disable-mfscgiserv
// 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
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
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
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
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
命令來證明。
能夠經過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 目錄中的同樣,可是不能有其餘功能的操做。
MooseFS 系統的另外一個特徵是利用mfsmakesnapshot 工具給文件或者是目錄樹作快照
mfsmakesnapshot source ... destination
Mfsmakesnapshot 是在一次執行中整合了一個或是一組文件的拷貝,並且任何修改這些文件的源文件都不會影響到源文件的快照, 就是說任何對源文件的操做,例如寫入源文件,將不會修改副本(或反之亦然)。
也可使用mfsappendchunks:
mfsappendchunks destination-file source-file ...
當有多個源文件時,它們的快照被加入到同一個目標文件中(每一個chunk 的最大量是chunk)。
安全的啓動MooseFS 集羣(避免任何讀或寫的錯誤數據或相似的問題)的方式是按照如下命令步驟:
安全的中止MooseFS 集羣:
若每一個文件的goal(目標)都不小於2,而且沒有under-goal 文件(這些能夠用mfsgetgoal –r和mfsdirinfo 命令來檢查),那麼一個單一的chunkserver 在任什麼時候刻均可能作中止或者是從新啓動。之後每當須要作中止或者是從新啓動另外一個chunkserver 的時候,要肯定以前的chunkserver 被鏈接,並且要沒有under-goal chunks。
一般元數據有兩部分的數據:
主要的元數據文件須要按期備份,備份的頻率取決於取決於多少小時changelogs 儲存。元數據changelogs 實時的自動複製。1.6版本中這個工做都由metalogger完成。
一旦mfsmaster 崩潰(例如由於主機或電源失敗),須要最後一個元數據日誌changelog 併入主要的metadata 中。這個操做時經過 mfsmetarestore
工具作的,最簡單的方法是:
mfsmetarestore -a
若是master 數據被存儲在MooseFS 編譯指定地點外的路徑,則要利用-d 參數指定使用,如:
mfsmetarestore -a -d /opt/mfsmaster
若是mfsmetarestore -a沒法修復,則使用metalogger也可能沒法修復,暫時沒遇到過這種狀況,這裏不暫不考慮。
mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs
或:強制使用metadata.mfs.back建立metadata.mfs,能夠啓動master,但丟失的數據暫沒法肯定。
生產環境使用 MooseFS 時,須要保證 master 節點的高可用。 使用 ucarp
是一種比較成熟的方案,或者 DRBD+[hearbeat|keepalived]
。 ucarp
相似於 keepalived
,經過主備服務器間的健康檢查來發現集羣狀態,並執行相應操做。另外 MooseFS商業版本已經支持雙主配置,解決單點故障。