MFS分佈式文件系統

    MFS即moosefs,可以提供容量PB級別的共享存儲,無需昂貴的專業硬件設備,自身擁有冗餘功能及動態擴容功能,保證數據的安全性。分佈式文件系統把數據分散存儲在不同的服務器上,讀取數據的時候相當於同時讀取,不像NFS是一對多的關係,而是多對多的關係,這樣可以使得性能得到大幅提升。本篇博客將使用MFS搭建分佈式文件系統,使其具有容錯功能,高可用,可擴展的功能。


一、工作原理

1. 分佈式原理

    分佈式文件系統(Distributed File System)就是把一些分散在多臺計算機上的共享文件夾,集合到一個文件夾內(虛擬共享文件夾),用戶要訪問這些共享文件夾的時候,只要打開虛擬共享文件夾,就可以的看到所有鏈接到此文件夾內的共享文件夾,用戶感覺不到這些共享文件夾是分散於各個計算機上的。分佈式文件系統的好處是集中訪問、簡化操作、數據容災、提高文件夾存取性能


2. MFS原理

    MFS是一個具有容錯性的網絡分佈式文件系統,它把數據分散存放在多個物理服務器上,而呈現給用戶的則是一個統一的資源。

(1)MFS文件系統的組成

楊書凡00.png

元數據服務器(Master):在整個體系中負責管理文件系統,維護元數據,目前不支持高可用。

元數據日誌服務器(MetaLogger):備份Master服務器的變化日誌文件,當master服務器損壞,可以從日誌服務器中取得文件恢復。

數據存儲服務器(Chunk Server):真正存儲數據的服務器,服務器越多,容量就越大,可靠性越高,性能越好。

客戶端(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)客戶端告知元數據服務器本次寫入完畢

 

二、實驗案例

   公司之前的存儲服務器採用的是NFS,隨着業務的增加,多臺服務器通過NFS共享一個服務器的存儲空間,使得NFS服務器不堪重負,經常出現超時的問題。且存在着單點故障問題,儘管可以用rsync同步數據到另外一臺服務器上做備份,但性能方便沒有任何提升。基於這一需求,選擇的解決方案是採用MFS分佈式文件系統,服務器間的數據訪問不再是一對多的關係,而是多對多的關係,這樣可以使得性能得到大幅提升。具體的拓撲圖如下圖所示:


楊書凡01.png 

主機

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,如下圖所示:

楊書凡03.png

其中各部分含義如下:

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 [email protected]:/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目錄。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章