MooseFS技術詳解


原文 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 集群(避免任何讀或寫的錯誤數據或類似的問題)的方式是按照以下命令步驟:

  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商業版本已經支持雙主配置,解決單點故障。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM