MooseFS技術詳解

原文 http://www.tuicool.com/articles/vQvEZ3yjavascript

MooseFS是一款具備冗餘容錯功能的分佈式文件系統。它把數據分散在多臺服務器上,確保一份數據多個備份副本,對外提供統一的結構。php

功能特性

對於標準的文件操做,MooseFS表現與其餘類Unix文件系統一致。支持的經過文件系統特性:java

  • 層次結構(目錄樹)
  • 兼容POSIX文件屬性
  • 支持特殊文件
  • 符號連接和硬連接
  • 基於IP地址和密碼的訪問控制

獨有特性

  • 高可靠性(數據的多個副本存儲在不一樣服務器)
  • 容量動態擴展(添加新硬盤或者服務器)
  • 能夠回收在制定時間內刪除的文件,相似回收站功能
  • 能夠對整個文件甚至是正在被寫入的文件建立文件快照

MFS總體架構的四種角色

  • Master(元數據服務器)負責各個數據存儲服務器的管理,文件讀寫調度,文件空間回收以及恢復,多節點拷貝。node

  • Metalogger(元數據日誌服務器)sql

    負責備份Master服務器的changelog。文件類型爲 changelog.*.mfs ,以便在Master出問題時接替其工做vim

  • 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上有四塊硬盤,第一塊爲系統,剩下三塊做爲數據存儲,每塊容量爲4TBruby

軟件安裝

從官方軟件庫安裝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 集羣(避免任何讀或寫的錯誤數據或相似的問題)的方式是按照如下命令步驟:

  1. 啓動mfsmaster 進程
  2. 啓動全部的mfschunkserver 進程
  3. 啓動mfsmetalogger 進程(若是配置了mfsmetalogger)
  4. 當全部的chunkservers 鏈接到MooseFS master 後,任何數目的客戶端能夠利用mfsmount 去掛接被export 的文件系統。(能夠經過檢查master 的日誌或是CGI 監視器來查看是否全部的chunkserver被鏈接)。

中止MFS集羣

安全的中止MooseFS 集羣:

  1. 在全部的客戶端卸載MooseFS 文件系統(用umount 命令或者是其它等效的命令)
  2. 用mfschunkserver stop 命令中止chunkserver 進程
  3. 用mfsmetalogger stop 命令中止metalogger 進程
  4. 用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也可能沒法修復,暫時沒遇到過這種狀況,這裏不暫不考慮。

  1. 找回metadata.mfs.back 文件,能夠從備份中找,也能夠中metalogger 主機中找(若是啓動了metalogger 服務),而後把metadata.mfs.back 放入data 目錄,通常爲{prefix}/var/mfs
  2. 從在master 宕掉以前的任何運行metalogger 服務的服務器上拷貝最後metadata 文件,而後放入mfsmaster 的數據目錄。
  3. 利用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商業版本已經支持雙主配置,解決單點故障。

相關文章
相關標籤/搜索