MFS即moosefs,能夠提供容量PB級別的共享存儲,無需昂貴的專業硬件設備,自身擁有冗餘功能及動態擴容功能,保證數據的安全性。分佈式文件系統把數據分散存儲在不一樣的服務器上,讀取數據的時候至關於同時讀取,不像NFS是一對多的關係,而是多對多的關係,這樣可使得性能獲得大幅提高。本篇博客將使用MFS搭建分佈式文件系統,使其具備容錯功能,高可用,可擴展的功能。node
1、工做原理python
1. 分佈式原理web
分佈式文件系統(Distributed File System)就是把一些分散在多臺計算機上的共享文件夾,集合到一個文件夾內(虛擬共享文件夾),用戶要訪問這些共享文件夾的時候,只要打開虛擬共享文件夾,就能夠的看到全部連接到此文件夾內的共享文件夾,用戶感受不到這些共享文件夾是分散於各個計算機上的。分佈式文件系統的好處是集中訪問、簡化操做、數據容災、提升文件夾存取性能vim
2. MFS原理瀏覽器
MFS是一個具備容錯性的網絡分佈式文件系統,它把數據分散存放在多個物理服務器上,而呈現給用戶的則是一個統一的資源。安全
(1)MFS文件系統的組成bash
元數據服務器(Master):在整個體系中負責管理文件系統,維護元數據,目前不支持高可用。服務器
元數據日誌服務器(MetaLogger):備份Master服務器的變化日誌文件,當master服務器損壞,能夠從日誌服務器中取得文件恢復。網絡
數據存儲服務器(Chunk Server):真正存儲數據的服務器,服務器越多,容量就越大,可靠性越高,性能越好。session
客戶端(Client):能夠像掛載NFS同樣 掛載MFS文件系統
(2)MFS讀數據的處理過程
1)客戶端向元數據服務器發出讀請求
2)元數據服務器把所需數據存放的位置(Chunk Server的IP地址和Chunk編號)告知客戶端
3)客戶端向已知的Chunk Server請求發送數據
4)Chunk Server向客戶端發送數據
(3)MFS寫入數據的處理過程
1)客戶端向元數據服務器發送寫入請求
2)元數據服務器與Chunk Server進行交互,但元數據服務器只在某些服務器建立新的分塊Chunks,建立成功後由Chunk Servers告知元數據服務器操做成功
3)元數據服務器告知客戶端,能夠在哪一個Chunk Server的哪些Chunks寫入數據
4)客戶端向指定的Chunk Server寫入數據
5)該Chunk Server與其餘Chunk Server進行數據同步,同步成功後Chunk Server告知客戶端數據寫入成功
6)客戶端告知元數據服務器本次寫入完畢
2、實驗案例
公司以前的存儲服務器採用的是NFS,隨着業務的增長,多臺服務器經過NFS共享一個服務器的存儲空間,使得NFS服務器不堪重負,常常出現超時的問題。且存在着單點故障問題,儘管能夠用rsync同步數據到另一臺服務器上作備份,但性能方便沒有任何提高。基於這一需求,選擇的解決方案是採用MFS分佈式文件系統,服務器間的數據訪問再也不是一對多的關係,而是多對多的關係,這樣可使得性能獲得大幅提高。具體的拓撲圖以下圖所示:
主機 |
IP地址 |
主要軟件 |
Master |
192.168.1.100 |
mfs-1.6.27-5.tar.gz |
MetaLogger |
192.168.1.101 |
mfs-1.6.27-5.tar.gz |
Chunk Server1 |
192.168.1.102 |
mfs-1.6.27-5.tar.gz |
Chunk Server2 |
192.168.1.103 |
mfs-1.6.27-5.tar.gz |
Client |
192.168.1.104 |
mfs-1.6.27-5.tar.gz fuse-2.9.2.tar.gz |
實驗步驟:
1. 搭建Master Server
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# useradd -s /sbin/nologin mfs [root@localhost ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序運行用戶 > --with-default-group=mfs \ //指定程序運行組 > --disable-mfschunkserver \ //禁用Chunk功能 > --disable-mfsmount \ //禁用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@localhost mfs]# ls mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist [root@localhost mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg //主配置文件 [root@localhost mfs]# cp mfsexports.cfg.dist mfsexports.cfg //被掛載目錄及權限配置文件 [root@localhost mfs]# cp mfstopology.cfg.dist mfstopology.cfg [root@localhost mfs]# cd /usr/local/mfs/var/mfs/ [root@localhost mfs]# ls metadata.mfs.empty [root@localhost mfs]# cp metadata.mfs.empty metadata.mfs //存放master的變化信息 [root@localhost mfs]# /usr/local/mfs/sbin/mfsmaster start //啓動mfsmaster服務 loading sessions ... file not found //第一次啓動mfsmaster服務會出現錯誤 [root@localhost mfs]# /usr/local/mfs/sbin/mfsmaster restart //重啓服務就OK了 [root@localhost mfs]# netstat -anpt |grep mfs tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 10204/mfsmaster tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 10204/mfsmaster tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 10204/mfsmaster
2. 搭建Metalogger Server
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# useradd -s /sbin/nologin mfs [root@localhost ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序運行用戶 > --with-default-group=mfs \ //指定程序運行組 > --disable-mfschunkserver \ //禁用Chunk功能 > --disable-mfsmount \ //禁用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@localhost mfs]# ls mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist [root@localhost mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg [root@localhost mfs]# vim mfsmetalogger.cfg //修改配置文件 MASTER_HOST = 192.168.1.100 //去掉註釋,添加master服務器的ip地址 [root@localhost mfs]# /usr/local/mfs/sbin/mfsmetalogger start root@localhost mfs]# netstat -anpt |grep mfs tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 13456/mfsmetalogger
3. 搭建Chunk Server(二臺chunk的搭建步驟相同)
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# useradd -s /sbin/nologin mfs [root@localhost ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序運行用戶 > --with-default-group=mfs \ //指定程序運行組 > --disable-mfsmaster \ //禁用mfsmaster功能 > --disable-mfsmount \ //禁用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@localhost mfs]# ls mfschunkserver.cfg.dist mfshdd.cfg.dist [root@localhost mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg [root@localhost mfs]# cp mfshdd.cfg.dist mfshdd.cfg [root@localhost mfs]# vim mfschunkserver.cfg MASTER_HOST = 192.168.1.100 //去掉註釋,添加master服務器的ip地址 [root@localhost mfs]# vim mfshdd.cfg //添加一行 /data //這是給MFS的分區,生產環境下最好使用獨立的分區或磁盤掛載到此目錄下 [root@localhost mfs]# mkdir /data [root@localhost mfs]# chown -R mfs:mfs /data [root@localhost mfs]# /usr/local/mfs/sbin/mfschunkserver start [root@localhost mfs]# netstat -anpt | grep mfs tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 9668/mfschunkserver tcp 0 0 192.168.1.102:41168 192.168.1.100:9420 ESTABLISHED 9668/mfschunkserver
4. 客戶端配置
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# tar zxf fuse-2.9.2.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/fuse-2.9.2/ //MFS依賴於FUSE [root@localhost fuse-2.9.2]# ./configure && make && make install [root@localhost fuse-2.9.2]# vim /etc/profile //設置環境變量,添加兩行 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export PATH=/usr/local/mfs/bin:$PATH [root@localhost fuse-2.9.2]# source /etc/profile [root@localhost fuse-2.9.2]# useradd -s /sbin/nologin mfs [root@localhost fuse-2.9.2]# tar zxf /root/mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost fuse-2.9.2]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序運行用戶 > --with-default-group=mfs \ //指定程序運行組 > --disable-mfsmaster \ //禁用mfsmaster功能 > --disable-mfschunkserver \ //禁用Chunk功能 > --enable-mfsmount \ //啓用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# mkdir /mnt/mfs //建立掛載點 [root@localhost mfs-1.6.27]# modprobe fuse //加載fuse模塊 [root@localhost mfs-1.6.27]# mfsmount /mnt/mfs/ -H 192.168.1.100 //掛載 mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root [root@localhost mfs-1.6.27]# df -Th //查看掛載狀況 192.168.1.100:9421 fuse.mfs 24G 0 24G 0% /mnt/mfs [root@localhost mfs-1.6.27]# mfsgetgoal -r /mnt/mfs/ //查詢文件被複制的份數 /mnt/mfs/: directories with goal 1 : //生產環境下Chunk Server節點數量應大於2,文件副本數小於Chunk server服務器的數量 //因爲我有二臺Chunk Server 我將副本數量設置爲1 [root@localhost mfs-1.6.27]# mfssetgoal -r 1 /mnt/mfs/ //設置文件被複制的份數 /mnt/mfs/: inodes with goal changed: 1 inodes with goal not changed: 0 inodes with permission denied: 0 [root@localhost mfs-1.6.27]# cd /mnt/mfs/ [root@localhost mfs]# touch test //建立測試文件 [root@localhost mfs]# mfsgetgoal test test: 1
分別打開兩臺chunk查看/data下,都產生了加密的數據
[root@localhost ~]# cd /data/ [root@localhost data]# ls 00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 D2 DC E6 F0 FA 01 0B 15 1F 29 33 3D 47 51 5B 65 6F 79 83 8D 97 A1 AB B5 BF C9 D3 DD E7 F1 FB 02 0C 16 20 2A 34 3E 48 52 5C 66 70 7A 84 8E 98 A2 AC B6 C0 CA D4 DE E8 F2 FC 03 0D 17 21 2B 35 3F 49 53 5D 67 71 7B 85 8F 99 A3 AD B7 C1 CB D5 DF E9 F3 FD 04 0E 18 22 2C 36 40 4A 54 5E 68 72 7C 86 90 9A A4 AE B8 C2 CC D6 E0 EA F4 FE 05 0F 19 23 2D 37 41 4B 55 5F 69 73 7D 87 91 9B A5 AF B9 C3 CD D7 E1 EB F5 FF 06 10 1A 24 2E 38 42 4C 56 60 6A 74 7E 88 92 9C A6 B0 BA C4 CE D8 E2 EC F6 07 11 1B 25 2F 39 43 4D 57 61 6B 75 7F 89 93 9D A7 B1 BB C5 CF D9 E3 ED F7 08 12 1C 26 30 3A 44 4E 58 62 6C 76 80 8A 94 9E A8 B2 BC C6 D0 DA E4 EE F8 09 13 1D 27 31 3B 45 4F 59 63 6D 77 81 8B 95 9F A9 B3 BD C7 D1 DB E5 EF F9
5. mfs監控
mfscgiserv是用python編寫的一個web服務器,其監聽端口是9425,能夠再masster server 上經過 /usr/local/mfs/sbin/mfscgiserv來啓動,用戶利用瀏覽器就能夠徹底監控全部客戶掛接、Chunk server、Master server等。
在Masster Server執行如下命令
[root@localhost ~]# /usr/local/mfs/sbin/mfscgiserv lockfile created and locked starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi) [root@localhost ~]# iptables -I INPUT -p tcp --dport 9425 -j ACCEPT
在一臺客戶端上經過瀏覽器訪問http://192.168.1.100:9425,以下圖所示:
其中各部分含義以下:
Info:顯示了MFS的基本信息
Servers:列出現有的Chunk Server
Disks:列出現有的Chunk Server硬盤信息
Exports:列出了可被掛載的目錄
Mounts:列出了被掛載的目錄
Operations:顯示正在執行的操做
Master charts:顯示了Master Server的操做狀況,讀、寫刪除等操做
Server charts:顯示了Chunk Server的操做狀況、傳輸速率及系統狀態
6. MFS維護及災難恢復
1)MFS集羣的啓動與中止
MFS集羣的啓動順序以下:
(1)啓動mfsmaster進程
(2)啓動全部的mfsChunkserver進程
(3)啓動mfsmetalogger進程
(4)在全部客戶端上掛載NFS文件系統
MFS集羣的中止順序以下:
(1)在全部客戶端卸載MFS掛載
(2)中止Chunkserver進程
(3)中止mfsmetalogger進程
(4)中止mfsmaster進程
2)MFS災難恢復
整個MFS體系中,直接斷電只有master server進程有可能沒法啓動,能夠在master上使用命令/usr/local/mfs/sbin/mfsmetarestore -a修復
咱們將master server 直接斷電,在從新開機,結果以下:
[root@localhost ~]# /usr/local/mfs/sbin/mfsmaster start //啓動失敗 init: file system manager failed !!! error occured during initialization - exiting [root@localhost ~]# /usr/local/mfs/sbin/mfsmetarestore -a //修復 [root@localhost ~]# /usr/local/mfs/sbin/mfsmaster start //啓動成功
MFS元數據一般有兩部分的數據,分別以下:
(1)主要元數據文件metadata.mfs,當mfsmaster運行時會被命名爲metadata.back.mfs。
(2)元數據改變日誌 changelog.*.mfs,存儲了過去N小時的文件變動。
在Master 發生故障時,能夠從MetaLogger中恢復,步驟以下:
(1)安裝一臺mfsmaster,利用一樣的配置來配置這臺mfsmaster,mfsmaster進程先不要啓動
(2)將metalogger上/usr/local/mfs/var/mfs/目錄下全部文件複製到mfsmaster相應的目錄中。
(3)利用mfsmetarestore命令合併數據元changelogs。
[root@localhost ~]# scp root@192.168.1.101:/usr/local/mfs/var/mfs/* /usr/local/mfs/var/mfs/ [root@localhost ~]# /usr/local/mfs/sbin/mfsmetarestore -m metadata_ml.mfs.back -o metadata.mfs changelog_ml.*.mfs [root@localhost ~]# /usr/local/mfs/sbin/mfsmaster start
注意:若是是全新安裝的master,恢復數據後,須要更改metalogger和chunkserver,配置MASTER_HOST的IP地址,客戶端也須要從新掛載mfs目錄。