MFS 分佈式存儲的運行方式
MFS工作原理
MooseFS是一款具有冗餘容錯功能的分佈式文件系統。它把數據分散在多臺服務器上,確保一份數據多個備份副本,對外提供統一的結構。
功能特性
對於標準的文件操作,MooseFS表現與其他類Unix文件系統一致。支持的通過文件系統特性:
· 層次結構(目錄樹)
· 兼容POSIX文件屬性
· 支持特殊文件
· 符號鏈接和硬鏈接
· 基於IP地址和密碼的訪問控制
獨有特性
· 高可靠性(數據的多個副本存儲在不同服務器)
· 容量動態擴展(添加新硬盤或者服務器)
· 可以回收在制定時間內刪除的文件,類似回收站功能
· 可以對整個文件甚至是正在被寫入的文件創建文件快照
MFS整體架構的四種角色
· Master(元數據服務器)負責各個數據存儲服務器的管理,文件讀寫調度,文件空間回收以及恢復,多節點拷貝。存儲着每個文件的元數據(文件的大小、屬性、位置信息,包括所有非常規文件的所有信息,例如目錄、套接字、管道以及設備文件)
· Metalogger(元數據日誌服務器)負責備份Master服務器的changelog。文件類型爲 changelog.*.mfs ,以便在Master出問題時接替其工作
· Chunk(數據存儲服務器)負責連接Master,聽從Master調度,提供存儲空間,併爲客戶端提供數據傳輸
· Client(客戶端掛載)通過FUSE內核接口掛載遠程管理服務器(master)上所管理的數據存儲服務器,使用起來和本地文件系統一樣
## MFS讀處理過程:
1、客戶端向元數據服務器發出讀請求。
2、元數據服務器把所需數據存放的位置(Chunk Server的IP地址和chunk編號)告知客戶端。
3、客戶端向已知的Chunk Server請求發送數據。
4、Chunk Server向客戶端發送數據。
## MFS寫處理過程:
1、客戶端向元數據服務器發送寫入請求。
2、元數據服務器與Chunk Server進行交互(只有當所需的分塊Chunks存在的時候才進行這個交互):
a、元數據服務器只是在某些服務器創建新的分塊chunks。
b、Chunk Servers告知元數據服務器,步驟a已經操作成功。
3、元數據服務器告知客戶端,你可以在哪個Chunk Server的哪些Chunks寫入數據。
4、客戶端向指定的Chunk Server寫入數據
5、Chunk Server與其他Chunk Server進行數據同步。
6、Chunk Server之間同步成功。
7、Chunk Server告知客戶端數據寫入成功。
8、客戶端告知元數據服務器本次寫入完畢。
實驗拓撲
一、搭建master server
1.安裝依賴包
[root@centos1 ~]# yum -y install zlib-devel
2.創建用戶
[root@centos1 ~]# useradd mfs -s /sbin/nologin
3.安裝源碼包
[root@centos1 ~]# tar xf /mnt/mfs-1.6.27-5.tar.gz -C /usr/src
[root@centos1 mfs-1.6.27]# cd /usr/src/mfs-1.6.27/
[root@centos1 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@centos1 mfs-1.6.27]# make&&make install
4.複製文件
[root@centos1 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs
[root@centos1 mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg
[root@centos1 mfs]# cp mfsexports.cfg.dist mfsexports.cfg
[root@centos1 mfs]# cp mfstopology.cfg mfstopology.cfg
[root@centos1 mfs]# cd /usr/local/mfs/var/mfs/
[root@centos1 mfs]# cp metadata.mfs.empty metadata.mfs
5.配置文件(只需瞭解,不用改動)
①// mfsmaster.cfg(主配置文件)/usr/local/mfs/etc/mfs目錄下
# 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 秒);
②mfsexportes.cfg 爲共享mfs文件系統的控制文件,NFS要共享一個目錄時,我們會使用vim /etc/exports命令,編寫共享給誰,所要共享的目錄,共享出去的屬性這些內容,而mfsexports.cfg的作用與其類似其書寫格式如下: 對客戶端的配置
Allow everything but “meta”
* / 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 許掛載任何指定的子目錄
6.啓動服務/usr/local/mfs/sbin/mfsmaster start
[root@centos1 mfs]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 7599/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 7599/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 7599/mfsmaster
tcp 0 0 192.168.1.1:9419 192.168.1.2:37816 ESTABLISHED 7599/mfsmaster
tcp 0 0 192.168.1.1:9420 192.168.1.3:48107 ESTABLISHED 7599/mfsmaster
tcp 0 0 ::1:25 :::* LISTEN 1732/master
7.查看進程
[root@centos1 mfs]# ps -ef|grep mfs
8.停止mfsmaster
[root@centos1 mfs]# /usr/local/mfs/sbin/mfsmaster -s 或stop
二、搭建metalogger server
1.安裝依賴包
[root@centos1 ~]# yum -y install zlib-devel
2.創建用戶
[root@centos1 ~]# useradd mfs -s /sbin/nologin
3.安裝源碼包
[root@centos1 ~]# tar xf /mnt/mfs-1.6.27-5.tar.gz -C /usr/src
[root@centos1 mfs-1.6.27]# cd /usr/src/mfs-1.6.27/
[root@centos1 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@centos1 mfs-1.6.27]# make && make install
4.複製文件
[root@centos1 mfs-1.6.27]# cd /usr/local/mfs/etc
[root@centos2 mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
[root@centos2 mfs]# vim mfsmetalogger.cfg
MASTER_HOST=192.168.1.1 //手工添加MASTER SERVER的ip地址
5.啓動服務
[root@centos2 mfs]# /usr/local/mfs/sbin/mfsmetalogger start
三、搭建chunk server
1.安裝依賴包
[root@centos1 ~]# yum -y install zlib-devel
2.創建用戶
[root@centos1 ~]# useradd mfs -s /sbin/nologin
3.安裝
[root@centos1 ~]# tar xf /mnt/mfs-1.6.27-5.tar.gz -C /usr/src
[root@centos1 mfs-1.6.27]# cd /usr/src/mfs-1.6.27/
[root@centos3 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
[root@centos3 mfs-1.6.27]# make &&make install
4.複製配置文件
[root@centos3 mfs]# cd /usr/local/mfs/etc/mfs/
#cp mfschunkserver.cfg.dist mfschunkserver.cfg
[root@centos3 mfs]# cp mfshdd.cfg mfshdd.cfg
5.修改配置文件
[root@centos3 mfs]# vim mfschunkserver.cfg
MASTER_HOST = 192.168.1.1 //master服務器的ip地址
[root@centos3 mfs]# vim mfshdd.cfg
/data //設置chunkserver存放數據的目錄
4.設置目錄權限,啓動mfschunkserver
[root@centos3 mfs]# mkdir /data //創建/data
[root@centos3 mfs]# chown -R mfs:mfs /data //設置權限
[root@centos3 mfs]# /usr/local/mfs/sbin/mfschunkserver start //啓動服務
四、搭建第二個chunkserver
1.[root@centos3 ~]# useradd mfs -s /sbin/nologin
2.安裝
[root@centos4 mfs-1.6.27]# tar xf /mnt/mfs-1.6.27-5.tar.gz -C /usr/src
[root@centos4 mfs-1.6.27]# cd /usr/src/mfs-1.6.27/
[root@centos4 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
[root@centos4 mfs-1.6.27]# make && make install
3.複製配置文件
[root@centos3 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs
[root@centos4 mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
[root@centos4 mfs]# cp mfshdd.cfg.dist mfshdd.cfg
4.修改配置文件
[root@centos3 mfs]# vim mfschunkserver.cfg
MASTER_HOST = 192.168.1.1 //master服務器的ip地址
[root@centos3 mfs]# vim mfshdd.cfg
/data //存放數據的目錄
5.設置目錄權限,啓動mfschunkserver
#mkdir /data
[root@centos3 mfs]# chown -R mfs:mfs /data
[root@centos3 mfs]# /usr/local/mfs/sbin/mfschunkserver start
五、客戶端配置
1.安裝fuse
fuse的功能簡單概括一下,fuse提供一個文件操作的接口,然後fuse在這個接口上監聽文件操作,並把這些對文件的操作傳給我們自己的相關代碼進行處理。 也就是說,fuse提供一個掛載點,然後他會在這個掛在點上進行監聽,一旦有操作(新建、讀取、修改)發生,他會把控制權交給我們的代碼,這些操作的具體代碼都在mfsmount模塊中實現。
[root@centos1 fuse-2.9.2]# tar xf /mnt/fuse-2.9.2.tar.gz -C /usr/src
[root@centos1 fuse-2.9.2]# cd /usr/src/fuse-2.9.2/
[root@centos1 fuse-2.9.2]# ./configure
[root@centos1 fuse-2.9.2]# make &&make install
2.設置環境變量
[root@centos1 fuse-2.9.2]# vim /etc/profile
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH //環境變量PKG_CONFIG_PATH是用來設置.pc文件的搜索路徑的
[root@centos1 fuse-2.9.2]# source /etc/profile //刷新環境變量
3.安裝mfs客戶端
[root@centos3 ~]# useradd -s /sbin/nologin mfs
[root@centos1 mfs-1.6.27]# tar xf /mnt/mfs-1.6.27-5.tar.gz -C /usr/src
[root@centos1 mfs-1.6.27]# cd /usr/src/mfs-1.6.27/
[root@centos1 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --enable-mfsmount
[root@centos1 mfs-1.6.27]# make&&make install
4.掛載mfs文件系統
#mkdir /test //創建掛載點
[root@centos1 test]# modprobe fuse//加載fuse模塊到內核
[root@centos1 test]# /usr/local/mfs/bin/mfsmount /test -H 192.168.1.1//掛載mfs
查看掛載情況:
5.mfs常用操作
1.設置環境變量
[root@centos1 test]# vim /etc/profile
export PATH=/usr/local/mfs/bin:$PATH
[root@centos1 test]# source /etc/profile
2.查看與設置文件複製的份數
[root@centos1 test]# mfsgetgoal -r /test
3.測試
[root@centos1 test]# dd if=/dev/zero of=/test/111.data bs=200M count=1
查看寫入結果:
[root@centos1 test]# mfssetgoal -r 2 /test 進行冗餘測試
[root@centos1 test]# dd if=/dev/zero of=/test/222.data bs=200M count=1
查看寫入結果是否冗餘:
六、mfs監控
1. [root@centos1 mfs]# /usr/local/mfs/sbin/mfscgiserv //master服務器寫入
2. 通過網站進行監控測試:
七、MFS集羣維護
1.啓動MFS集羣
安全的啓動MooseFS 集羣(避免任何讀或寫的錯誤數據或類似的問題)的方式是按照以下命令步驟:
1. 啓動mfsmaster 進程
2. 啓動所有的mfschunkserver 進程
3. 啓動mfsmetalogger 進程(如果配置了mfsmetalogger)
4. 當所有的chunkservers 連接到MooseFS master 後,任何數目的客戶端可以利用mfsmount 去掛接被export 的文件系統。(可以通過檢查master 的日誌或是CGI 監視器來查看是否所有的chunkserver被連接)。
2.停止MFS集羣
安全的停止MooseFS 集羣:
1. 在所有的客戶端卸載MooseFS 文件系統(用umount 命令或者是其它等效的命令)
2. 用mfschunkserver stop 命令停止chunkserver 進程
3. 用mfsmetalogger stop 命令停止metalogger 進程
4. 用mfsmaster stop 命令停止master 進程
3.MFS元數據備份
通常元數據有兩部分的數據:
· 主要元數據文件metadata.mfs,當mfsmaster 運行的時候會被命名爲metadata.mfs.back
· 元數據改變日誌changelog.*.mfs,存儲了過去的N 小時的文件改變(N 的數值是由BACK_LOGS參數設置的,參數的設置在mfschunkserver.cfg 配置文件中)。