mfs詳解與部署
一、MFS詳解
分佈式原理:
分佈式文件系統(Distributed File Systemm)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連。簡單來說,就是把一些分散的(分佈在局域網內各個計算機上)共享文件夾,集合到一個文件夾內(虛擬共享文件夾)。對於用戶來說,要訪問這些共享文件夾時,只要打開這個虛擬共享文件夾,就可以看到所有鏈接到虛擬共享文件夾內的共享文件夾,用戶感覺不到這些共享文件是分散在各個計算機上的。分佈式文件系統的好處是集中訪問、簡化操作、數據容災,以及提高文件的存取性能。
MFS原理:
MFS是一個具有容錯性的網絡分佈式文件系統,它把數據分散存放在多個物理服務器上,而呈現給用戶的則是一個統一的資源。
MFS文件系統的組成
-
元數據服務器(Master)
:在整個體系中負責管理文件系統,維護元數據。 -
元數據日誌服務器(MetaLogger)
:備份Master服務器的變化日誌文件,文件類型爲changelog_ml.*.mfs
。當Master服務器數據丟失或者損壞時,可以從日誌服務器中取得文件,進行修復。 -
數據存儲服務器(Chunk Server)
:真正存儲數據的服務器。存儲文件時,會把文件分塊保存,在數據服務器之間進行復制。數據服務器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。 -
客戶端(Client)
:可以像掛載NFS一樣掛載MFS文件系統,其操作是相同的。
MFS讀取數據的處理過程:
- 客戶端向元數據服務器發出讀請求
- 元數據服務器把所需數據存放的位置(Chunk Server的IP地址和Chunk編號)告知客戶端
- 客戶端向已知的Chunk Server請求發送數據
- Chunk Server向客戶端發送數據
MFS寫入數據的處理過程:
- 客戶端向元數據服務器發送寫入請求
- 元數據服務器與Chunk Server進行交互(只有當所需的分塊Chunks存在的時候才進行交互),但元數據服務器只在某些服務器創建新的分塊Chunks,創建成功後由元數據服務器告知客戶端,可以在哪個Chunk Server的哪些Chunks寫入數據。
- 客戶端向指定的Chunk Server寫入數據
- 該Chunk Server與其他Chunk Server進行數據同步,同步成功後Chunk Server告知客戶端數據寫入成功
- 客戶端告知元數據服務器本次寫入完畢
MFS的刪除文件過程
- 客戶端有刪除操作時,首先向Master發送刪除信息;
- Master定位到相應元數據信息進行刪除,並將chunk server上塊的刪除操作加入隊列異步清理;
- 響應客戶端刪除成功的信號
MFS修改文件內容的過程
- 客戶端有修改文件內容時,首先向Master發送操作信息;
- Master申請新的塊給
.swp
文件, - 客戶端關閉文件後,會向Master發送關閉信息;
- Master會檢測內容是否有更新,若有,則申請新的塊存放更改後的文件,刪除原有塊和
.swp
文件塊; - 若無,則直接刪除
.swp
文件塊。
MFS重命名文件的過程
- 客戶端重命名文件時,會向Master發送操作信息;
- Master直接修改元數據信息中的文件名;返回重命名完成信息;
MFS遍歷文件的過程
- 遍歷文件不需要訪問chunk server,當有客戶端遍歷請求時,向Master發送操作信息;
- Master返回相應元數據信息;
- 客戶端接收到信息後顯示
二、MFS的部署
部署可以參考官網:https://moosefs.com/download/#current
主機準備
主機 | ip | 作用 |
---|---|---|
server1 | 172.25.1.1 | master |
server2 | 172.25.1.2 | chunk server |
server3 | 172.25.1.3 | chunk server |
foundation1 | 172.25.1.250 | master |
主機版本:rhel7.6
所有主機的selinux和防火牆均屬於關閉狀態。
yum源
對所有節點,yum源是相同的
可以通過以下命令獲取:
curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
如果時el6或者el8直接將el7更改即可。
下載完repo文件後將gpgcheck關閉
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# ls
MooseFS.repo redhat.repo rhel.repo
[root@server1 yum.repos.d]# vim MooseFS.repo
[root@server1 yum.repos.d]# cat MooseFS.repo
[MooseFS]
name=MooseFS $releasever - $basearch
baseurl=http://ppa.moosefs.com/moosefs-3/yum/el7
gpgcheck=0 #改爲0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
enabled=1
同時在所有節點
作master的解析:
# vim /etc/hosts
# cat /etc/hosts
172.25.1.1 server1 mfsmaster
master配置
安裝:
[root@server1 ~]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
其主配置文件是/etc/mfs/mfsmaster.cfg
啓動服務和cgi-server:
[root@server1 ~]# systemctl enable --now moosefs-master
[root@server1 ~]# systemctl enable --now moosefs-cgiserv.service
啓動後查看端口:
[root@server1 ~]# netstat -antlp
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 3821/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 3821/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 3821/mfsmaster
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 3852/python2
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3097/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3300/master
tcp 0 0 172.25.1.1:22 172.25.1.250:53068 ESTABLISHED 3315/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 3097/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3300/master
可以看到開啓服務後打開了9419,9420,9421,9425幾個端口,其中,9421
爲監聽客戶端連接的端口,9419
爲用於監聽metalogger(冷備)、masters和supervisors連接的端口,9420
爲chunkserver連接的偵聽端口,9425爲cgi-server的端口,可以在瀏覽器訪問172.25.1.1:9425
:
可以看出的當前就只有一個master。
chunk server配置
以下以server2爲例,server3的操作和server2類似,首先安裝:
[root@server2 ~]# yum install moosefs-chunkserver -y
在chunk server中,/etc/mfs/mfshdd.cfg
用來指定其存儲路徑
創建存儲路徑:
[root@server2 mfs]# mkdir /mnt/chunk1
[root@server2 mfs]# chown mfs.mfs /mnt/chunk1/ #更改所有者和所有組
制定存儲路徑:
[root@server2 mfs]# vim mfshdd.cfg
[root@server2 mfs]# tail -1 mfshdd.cfg
/mnt/chunk1
配置後啓動服務:
[root@server2 mfs]# systemctl enable --now moosefs-chunkserver
服務啓動後查看開啓的端口:
[root@server2 mfs]# netstat -antlp
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:9422 0.0.0.0:* LISTEN 3874/mfschunkserver
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3087/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3309/master
tcp 0 0 172.25.1.2:45240 172.25.1.1:9420 ESTABLISHED 3874/mfschunkserver
tcp 0 0 172.25.1.2:22 172.25.1.250:49848 ESTABLISHED 3632/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 3087/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3309/master
可以看出開啓了一個9422端口,並且打開了一個隨即端口45240和master的9420端口進行通信。啓動後查看網頁端:
可以看到server2已經加入了集羣。
在server3中將chunk1改爲chunk2即可。啓動後查看網頁端:
可以看出看出兩個chunk server已經加入集羣。
client客戶端配置
安裝客戶端:
[root@foundation1 ~]# yum install moosefs-client -y
三、初步使用mfs
新建mfs目錄:
[root@foundation1 ~]# cd /mnt/
[root@foundation1 mnt]# mkdir mfs
掛載該目錄:
[root@foundation1 mfs]# mfsmount /mnt/mfs/
查看掛載情況:
[root@foundation1 mfs]# mount
mfsmaster:9421 on /mnt/mfs type fuse.mfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
可以看到掛載的是mfsmaster(server1)的9421端口。
創建測試文件目錄:
[root@foundation1 mfs]# mkdir data1
[root@foundation1 mfs]# mkdir data2
[root@foundation1 mfs]# mfsgetgoal data1/ #若報錯可以退出這個目錄重新進,然後再新建
data1/: 2
[root@foundation1 mfs]# mfsgetgoal data2/
data2/: 2
以上結果表示兩個目錄都保存了2份。
可以使用以下命令將備份數改爲1份:
[root@foundation1 mfs]# mfssetgoal -r 1 data1/
data1/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@foundation1 mfs]#
[root@foundation1 mfs]# mfsgetgoal data1/
data1/: 1
[root@foundation1 mfs]# mfsgetgoal data2/
data2/: 2
可以看到data1已經保存爲1份.拷貝測試文件:
[root@foundation1 mfs]# cp /etc/passwd data1/
[root@foundation1 mfs]# cp /etc/fstab data2/
查看拷貝文件的信息:
[root@foundation1 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.1.3:9422 (status:VALID)
[root@foundation1 mfs]#
[root@foundation1 mfs]# mfsfileinfo data2/fstab
data2/fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.1.2:9422 (status:VALID)
copy 2: 172.25.1.3:9422 (status:VALID)
可以看到再data1中的文件只有一個備份保存在server3,而在data2中的文件有兩個備份,保存在server2和server3各一份。
當我們把server3的mfs服務關閉後:
[root@server3 ~]# systemctl stop moosefs-chunkserver
查看data2中的文件:
[root@foundation1 mfs]# cat data2/fstab
#
# /etc/fstab
# Created by anaconda on Thu May 2 18:01:16 2019
#
。。。。。。
可以正常查看,查看data1中的文件:
[root@foundation1 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
可以看出沒有可用拷貝,訪問文件會卡住。
現在恢復server3:
[root@server3 ~]# systemctl start moosefs-chunkserver
恢復後查看data1中的文件就可以正常查看:
[root@foundation1 mfs]# cat data1/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......
接下來進行切分的實驗,默認chunk的大小爲64M,當文件大於64M時會進行切分:
在data1中新建一個100M的文件:
[root@foundation1 data1]# dd if=/dev/zero of=bigfile bs=1M count=100
查看這個文件的信息:
[root@foundation1 data1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.1.3:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.1.2:9422 (status:VALID)
可以看出被切分成兩個chunk,這樣就可以保證寫入和讀取的速度,這也就是分佈式文件系統的意義。