一、MooseFS
- MooseFS是一個具有容錯性的網絡分佈式文件系統。它把數據分散存放在多個物理服務器上,而呈現給用戶的則是一個統一的資源。
- Moose文件系統(MooseFS)是由Core Technology開發的開源,POSIX兼容的分佈式文件系統。MooseFS旨在爲數據中心提供容錯,高可用,高性能,可擴展的通用網絡分佈式文件系統。最初是專有軟件,它於2008年5月5日作爲開源向公衆發佈。
- 目前有兩個版本的MooseFS:
MooseFS - 根據GPLv2許可發佈,
MooseFS專業版(MooseFS Pro) - 以二進制包形式的專有許可證發佈。 - 官網地址:http://www.moosefs.com/
二、組成
MooseFS遵循與Fossil(文件系統),Google File System,Lustre或Ceph類似的設計原則。文件系統包括三個組件:
- 元數據服務器(Master) - 維護和管理文件的位置(佈局),文件訪問和命名空間層次結構。當前版本的MooseFS支持多個元數據服務器和自動故障轉移。客戶端只與MDS通信以檢索/更新文件的佈局和屬性; 數據本身直接在客戶端和塊服務器之間傳輸。元數據服務器是用戶空間守護程序 ; 元數據保存在內存中,並且懶惰地存儲在本地磁盤上。
- 元數據日誌服務器(Metalogger)- 紀錄數據的改動情況,定期從MDS中提取元數據以存儲它以進行備份。從版本1.6.5開始,這是一個可選功能。
- 塊服務器(Chunk Server) - 存儲數據並可選地在它們之間進行復制。雖然可擴展性限制尚未發佈,但可能有很多。迄今爲止報告的最大集羣包括160臺服務器。[7] Chunk服務器也是一個用戶空間守護程序,它依賴於底層本地文件系統來管理實際存儲。
- 客戶端 - 與Master和ChunkServer交談。MooseFS客戶端通過FUSE將文件系統掛載到用戶空間。
三、原理
MFS讀過程
- 客戶端向Master發送讀請求
- Master去緩存的數據庫(非MySQL)中搜索客戶端所需數據的位置,並告知客戶端(Chunk Server IP、Chunk編號)
- 客戶端去指定Chunk Server的對應Chunk編號讀取數據
- 客戶端通知Master讀取完畢
MFS寫過程
- 客戶端向Master發送寫請求
- Master通知Chunk Server(誰空閒,如空閒新建Chunk編號),找到後將知道的Chunk Server IP和編號告知客戶端
- 客戶端向指定IP和編號存儲數據
- 客戶端告知Master寫入完畢
- Master通知Metalogger有新數據寫入(Matelogger紀錄新增加文件位置和對應Chunk Server),日誌記錄完畢後,連接關閉
四、功能
爲實現高可靠性和高性能,MooseFS提供以下功能:
- 容錯 - MooseFS使用複製,可以跨塊服務器複製數據,每個文件/目錄設置複製比率(N)。如果(N-1)個副本失敗,則數據仍然可用。目前,MooseFS沒有提供任何其他容錯技術。因此,對於非常大的文件的容錯需要大量的空間--N *文件大小而不是文件大小+(N * stripeize),如RAID 4,RAID 5或RAID 6的情況。MooseFS版本4.x PRO將具有RAID6。
- 條帶化 - 大文件分爲塊(最多64 兆字節),可以存儲在不同的塊服務器上,以實現更高的聚合帶寬。
- 負載平衡 - MooseFS嘗試平等地使用存儲資源,當前算法似乎只考慮消耗的空間。
- 安全性 - 除了經典的POSIX文件權限之外,自1.6版本發佈以來,MooseFS提供了一個簡單的,類似NFS的身份驗證 / 授權。
- 相干快照 - 快速,低開銷的快照。
- 透明的“垃圾桶” - 刪除的文件將保留一段可配置的時間。
- 數據分層/存儲類 - 可以“標記”服務器,創建稱爲“存儲類”的標籤定義,並決定數據存儲在哪些類型的服務器上[8]
- “項目”配額支持
- POSIX鎖,flock鎖支持
四、數據存儲方式
- 文件以chunk大小存儲,每chunk最大爲64M。小於64M的,該chunk的大小即爲該文件大小,超過64M的文件將被均分,每一份(chunk)的大小以不超過64M爲原則;文件可以有多份copy,即除原始文件以外,該文件還存儲的份數。當goal爲1時,表示只有一份copy,這份copy會被隨機存到一臺chunkserver上。當goal的數大於1時,每一份copy會被分別保存到其它chunkserver上。goal的大小不要超過chunkserver的數量,否則多出的copy,不會有chunkserver去存,goal設置再多實際上也就沒有意義的。copy的份數,一般設爲大於1份,這樣如果有一臺chunkserver壞掉後,至少還有一份copy,當這臺又被加進來後,會將失去的那份copy補回來,始終保持原有的copy數。而如果goal設爲1,那麼當存儲該copy的chunkserver壞掉,之後又重新加入回來,copy數將始終是0,不會恢復到之前的1個copy
- chunkserver上的剩餘存儲空間要大於1GB,新的數據纔會被允許寫入,否則,你會看到No space left的提示
- 多個chunker並不影響寫的速度,但是能加快讀的速度,在原來的基礎上增加一個chunker時,數據會自動同步到新增的chunker上以達到數據的平衡和均衡
五、部署MFS
環境準備
Role | IP | OS | RPM |
---|---|---|---|
Master | 192.168.0.21 | CentOS6.7_64bit | mfs-1.6.27-5.tar.gz |
MetaLogger | 192.168.0.22 | CentOS6.7_64bit | mfs-1.6.27-5.tar.gz |
Chunk Server 1 | 192.168.0.23 | CentOS6.7_64bit | mfs-1.6.27-5.tar.gz |
Chunk Server 2 | 192.168.0.24 | CentOS6.7_64bit | mfs-1.6.27-5.tar.gz |
Client | 192.168.0.25 | CentOS6.7_64bit | mfs-1.6.27-5.tar.gz fuse-2.9.2.tar.gz |
搭建Master Server
a.安裝環境包並創建用戶
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.21
NETMASK=255.255.255.0
yum -y install zlib-devel //安裝依賴環境
useradd -s /sbin/nologin mfs //創建mfs運行用戶
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27 //解包
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount //配置選項
make && make install //編譯並安裝
cd /usr/local/mfs/
ll //看下安裝完成生成的目錄
drwxr-xr-x 2 root root 4096 Dec 3 11:24 bin //客戶端工具
drwxr-xr-x 3 root root 4096 Dec 3 11:24 etc //服務器的配置文件都放在該目錄中
drwxr-xr-x 2 root root 4096 Dec 3 11:24 sbin //服務端啓動程序。如:元數據服務器端程序 mfsmaster、數據存儲服務器端服務程序mfschunkserver
drwxr-xr-x 4 root root 4096 Dec 3 11:24 share //文檔
drwxr-xr-x 3 root root 4096 Dec 3 11:24 var //元數據目錄(可在配置文件中自定義到其他目錄)
b.複製文件
cd /usr/local/mfs/etc/mfs/
cp mfsmaster.cfg.dist mfsmaster.cfg //Master配置文件
cp mfstopology.cfg.dist mfstopology.cfg //輸出目錄配置文件
cp mfsexports.cfg.dist mfsexports.cfg //元數據日誌
cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
//首次安裝 master 時,會自動生成一個名爲 metadata.mfs.empty 的元數據文件 metadata,該文件是空的。MooseFS master 運必須有文件 metadata.mfs
c.啓動Master Server
master 會打開 9420 端口等待 chunkserver 數據存儲服務器連接
/usr/local/mfs/sbin/mfsmaster start //啓動master服務
ps -ef | grep mfs
ll /usr/local/mfs/var/mfs/ //查看生成的日誌文件
-rw-r----- 1 mfs mfs 95 Dec 24 14:30 metadata.mfs
-rw-r----- 1 mfs mfs 95 Dec 24 14:28 metadata.mfs.back.1
-rw-r--r-- 1 mfs mfs 8 Dec 24 14:13 metadata.mfs.empty
-rw-r----- 1 mfs mfs 10 Dec 24 14:28 sessions.mfs
-rw-r----- 1 mfs mfs 762516 Dec 24 14:30 stats.mfs
/usr/local/mfs/sbin/mfsmaster stop //服務的關閉方法
/usr/local/mfs/sbin/mfscgiserv start //啓動web統計
IE --> 192.168.0.21:9425 //訪問web統計界面
搭建MetaLogger Server
a.安裝環境包並創建用戶
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.22
NETMASK=255.255.255.0
yum -y install zlib-devel
useradd -s /sbin/nologin mfs
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
make && make install
b.複製文件
cd /usr/local/mfs/etc/mfs/
cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
vim mfsmetalogger.cfg
MASTER_HOST = 192.168.0.21
//MASTER_HOST,這個文件中需要修改的是 MASTER_HOST 變量,這個變量的值是 MASTER SERVER 的 IP 地址
c.啓動Metalogger Server
/usr/local/mfs/sbin/mfsmetalogger start
ps -ef | grep mfs
搭建Chunk Server 1
a.安裝環境包並創建用戶
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.23
NETMASK=255.255.255.0
yum -y install zlib-devel
useradd -s /sbin/nologin mfs
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
make && make install
b.複製文件
cd /usr/local/mfs/etc/mfs/
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
vim mfschunkserver.cfg
MASTER_HOST = 192.168.0.21
vim mfshdd.cfg
/data
//數據存放的目錄,一般爲一塊磁盤的掛載目錄
mkdir /data
chown -R mfs:mfs /data
c.啓動Chunk服務
/usr/local/mfs/sbin/mfschunkserver start
ps -ef | grep mfs
搭建Chunk Server2
a.安裝環境包並創建用戶
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.24
NETMASK=255.255.255.0
yum -y install zlib-devel
useradd -s /sbin/nologin mfs
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
make && make install
b.複製文件
cd /usr/local/mfs/etc/mfs/
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
vim mfschunkserver.cfg
MASTER_HOST = 192.168.0.21
vim mfshdd.cfg
/data
mkdir /data && chown mfs:mfs /data
c.啓動Chunk服務
/usr/local/mfs/sbin/mfschunkserver start
ps -ef | grep mfs
client掛載MFS文件系統
a.安裝fuse
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.25
NETMASK=255.255.255.0
tar -zxvf fuse-2.9.2.tar.gz -C /usr/src/ && cd /usr/src/fuse-2.9.2
./configure && make && make install
vim /etc/profile
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
source /etc/profile
b.安裝MFS客戶端
useradd -s /sbin/nologin mfs
tar -zxvf ~/mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --enable-mfsmount
make && make install
c.掛載MFS文件系統
modprobe fuse //加載fuse模塊到內核
vim /etc/rc.local //開機自動加載
modprobe fuse
/usr/local/mfs/bin/mfsmount /media -H 192.168.0.21 //掛載
[root@mfs_client ~]# /usr/local/mfs/bin/mfssetgoal -r 1 -H /media/
//更改隨機copy的次數
[root@mfs_client ~]# /usr/local/mfs/bin/mfsgetgoal -H /media/
//查看當前copy的次數