實驗環境:
server1 172.25.254.1 做master主機 管理服務器
server2 172.25.254.2 chunk服務器
server3 172.25.254.3 chunk服務器
server4 172.25.254.4
server5 172.25.254.5
server6 172.25.254.6 客戶端
每臺主機都做好解析:
vim /etc/hosts
簡介
MooseFS是一個容錯的分佈式文件系統。它將數據分散到多個物理位置(服務器),用戶可以將這些位置(服務器)看作一個資源。
比如用戶要上傳10G的資源,對於用戶本身和服務器來說都是不友好的,所以可以把它分成10個1G的資源,這樣就方便快捷多了,但實際還是一個資源。系統將這些資源的鏈接集成到一個共享文件夾內,這樣用戶就可以在一個文件夾內看到所有的資源了。
對於標準文件操作,MooseFS充當任何其他類似unix的文件系統:
- 層次結構(目錄樹)
- 存儲POSIX文件屬性(權限、最後訪問和修改時間)
- 支持特殊文件(塊和字符設備、管道和套接字)
- 符號鏈接(指向目標文件的文件名,不一定在MooseFS中)和硬鏈接鏈接(引用MooseFS上相同數據的文件的不同名稱)
- 基於IP地址和/或密碼,可以限制對文件系統的訪問
MooseFS的顯著特徵是:
- 高可靠性(數據的多個副本可以存儲在單獨的物理機器上)
- 容量可以通過添加新的計算機或磁盤實現容量的動態擴展
- 已刪除的文件將保留一段可配置的時間(文件系統級別的“垃圾桶”)
- 文件的一致快照,即使文件正在被寫入/訪問
MooseFS由四個部分組成:
- 管理服務器(master server)——在MooseFS one機器中,在MooseFS Pro any中
管理整個文件系統、爲每個文件存儲元數據(infor-)的機器的數量關於文件大小、屬性和文件位置的信息,包括所有不定期的信息文件,即目錄、套接字、管道和設備)。
- 元數據服務器(chunk server)——存儲文件數據並在它們之間進行同步的任意數量的普通服務器(如果某個文件應該存在於多個ecopy中)。
- 元數據備份服務器(metalogger服務器)——任意數量的服務器,所有這些服務器都存儲元數據更改日誌並定期下載主元數據文件。當master損壞是,可以從日誌服務器中取得文件進行恢復。
在MooseFS(非pro)中,如果主主機發生故障,則帶有金屬記錄器的機器可以很容易地設置爲主機。
- 客戶端——使用mfsmount進程與管理服務器通信(接收和修改文件元數據)的任意數量的計算機,以及與chunkservers通信(交換實際的文件數據)的計算機。可以像掛載 nfs 一樣掛載 mfs
工作原理
讀:
寫:
安裝配置
server1上;
yum install moosefs-cgi-3.0.113-1.rhsystemd.x86_64.rpm \
moosefs-cgiserv-3.0.113-1.rhsystemd.x86_64.rpm \
moosefs-cli-3.0.113-1.rhsystemd.x86_64.rpm \
moosefs-master-3.0.113-1.rhsystemd.x86_64.rpm -y
會自動生成mfs用戶:
三臺主機都做好本地解析;
啓動mfs:
systemctl start moosefs-master.service
systemctl start moosefs-cgiserv.service
master會開啓三個端口:
19端口用於備份日誌的監聽端口,20是chunk server的監聽端口,21是和客戶端連接的地址
cgi會開啓圖形界面的端口:9425
測試訪問:
此時沒有chunk servers,
我們現在添加server2和server3進去:
再server2 和3 上安裝:
yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
也會生成mfs用戶,他們的uid 和gid都相同。
我們給server2新加一塊10G的硬盤,作爲共享硬盤。
給它分區,10G都給它: fdisk /dev/sdb
格式化:
[root@server2 ~]# mkfs.xfs /dev/sdb1 -f
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621184, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
創建掛載點:
[root@server2 ~]# mkdir /mnt/chunk1
[root@server2 ~]# mount /dev/sdb1 /mnt/chunk1/ 掛載
[root@server2 ~]# chown mfs.mfs /mnt/chunk1/ 修改權限
再配置文件中更改掛載點:
[root@server2 ~]# vim /etc/mfs/mfshdd.cfg
啓動chunkserver。
[root@server2 ~]# systemctl start moosefs-chunkserver
[root@server2 ~]# netstat -tnlp
Active Internet connections (only servers)
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 3619/mfschunkserver
可見打開了9422端口
此時再web端我們可以看見:
server2已經加入到集羣裏面去了。
server3中:
/分區下的空間還很大。所以這裏使用根分區。
[root@server3 ~]# mkdir /mnt/chunk2
[root@server3 ~]# vim /etc/mfs/mfshdd.cfg 裏面設置爲 /mnt/chunk2
[root@server3 ~]# chown mfs.mfs /mnt/chunk2/
[root@server3 ~]# systemctl start moosefs-chunkserver
server3就加進去了。
讀寫
我們在server6上安裝客戶端:
[root@server6 ~]# yum install moosefs-client-3.0.113-1.rhsystemd.x86_64.rpm -y
[root@server6 ~]# vim /etc/hosts 添加server1 mfsmaster的解析
[root@server6 ~]# mkdir /mnt/mfs 建立目錄 mfs的掛載目錄
[root@server6 ~]# vim /etc/mfs/mfsmount.cfg
[root@server6 ~]# mfsmount 掛載
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@server6 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 1163924 16647532 7% /
devtmpfs 495420 0 495420 0% /dev
tmpfs 507512 0 507512 0% /dev/shm
tmpfs 507512 13168 494344 3% /run
tmpfs 507512 0 507512 0% /sys/fs/cgroup
/dev/sda1 1038336 135224 903112 14% /boot
tmpfs 101504 0 101504 0% /run/user/0
mfsmaster:9421 28285952 1723392 26562560 7% /mnt/mfs
[root@server6 ~]# cd /mnt/mfs/
[root@server6 mfs]# mkdir dir1 # 建立兩個子目錄
[root@server6 mfs]# mkdir dir2
[root@server6 mfs]# ls
dir1 dir2
[root@server6 mfs]# mfsgetgoal dir1/ 獲取備份數目,因爲有server2 和3 兩臺chunk服務器,所以爲2
dir1/: 2
[root@server6 mfs]# mfsgetgoal dir2/
dir2/: 2
[root@server6 mfs]# mfssetgoal -r 1 dir1 可以更改數目 -r 1 是減1
dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@server6 mfs]# mfsgetgoal dir1/
dir1/: 1
我們現在拷貝一份文件進去(寫):
[root@server6 mfs]# cp /etc/passwd dir1
[root@server6 mfs]# cp /etc/group dir2
[root@server6 mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) 只有一個備份在server3上
copy 1: 172.25.254.3:9422 (status:VALID)
[root@server6 mfs]# mfsfileinfo dir2/group
dir2/group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1) 兩個備份
copy 1: 172.25.254.2:9422 (status:VALID)
copy 2: 172.25.254.3:9422 (status:VALID)
我們掛掉server3:
[root@server3 ~]# systemctl stop moosefs-chunkserver
在server6查看:
[root@server6 mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) ## 看不了了,因爲數據存放在server3
no valid copies !!!
[root@server6 mfs]# mfsfileinfo dir2/group
dir2/group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.254.2:9422 (status:VALID) ## 還有server2的一份數據可以查看
[root@server6 mfs]# cat dir1/passwd
^C ## 查看的時候就會卡到這裏
[root@server6 mfs]# cat dir2/group ## 可以正常查看
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
### 我們只需要再次打開server3上的chunk服務就可以看到了
[root@server3 ~]# systemctl start moosefs-chunkserver
[root@server6 mfs]# cat dir1/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin ## 可以看到了
daemon:x:2:2:daemon:/sbin:/sbin/nologin
存儲類
我們先刪掉上面的dir1 和dir2.方便下面的實驗。
存儲類裏面由兩個重要的概念:
storage class
label
存儲類是允許您指定應該在哪個Chunkservers上存儲文件的副本。存儲類是使用標籤表達式定義的。
即存放文件在哪個標籤的chunkservers上。
創建標籤
標籤的要求: 只能使用 a-z 這二十六個字母來設置 ,每個 chunkserver 可以由多個標籤。
打開server4 和server5,做和server2 和3 一樣的配置:
server4:
[root@server4 mnt]# yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
[root@server4 mnt]# mkdir /mnt/chunk3
[root@server4 mnt]# chown mfs.mfs /mnt/chunk3/
[root@server4 mnt]# vim /etc/mfs/mfshdd.cfg
# 最後一行加上 /mnt/chunk3
[root@server4 mnt]# systemctl start moosefs-chunkserver
server5:
[root@server5 mnt]# yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
[root@server5 mnt]# mkdir /mnt/chunk4
[root@server5 mnt]# chown mfs.mfs /mnt/chunk4/
[root@server5 mnt]# vim /etc/mfs/mfshdd.cfg
# 最後一行加上 /mnt/chunk4
[root@server5 mnt]# systemctl start moosefs-chunkserver
此時web界面:
打標籤需要先修改配置文件:
( 類型:LABLES = ABC | A B C| A,B,C )
vim /etc/mfs/mfschunkserver.cfg
找到LABELS那一行,打開。
server2:
LABELS = A S A機房 固態硬盤
server3:
LABELS = B S B機房 固態硬盤
server4:
LABELS = A H A機房 機械硬盤
server5:
LABELS = B H B機房 機械硬盤
systemctl reload moosefs-chunkserver.service 全部重啓服務
就可以看到標籤了:
p
存儲類:
A,B 代表存儲在A標籤和B標籤的chunk上
A,* 代表存儲在A標籤和任意一個標籤的chunk上
*,* 代表存儲在任意兩個chunk服務器上
AB,C+D 代表存儲在具有AB兩個標籤的chunk上和具有C或者D標籤的服務器上
設置四種存儲類: 必須在工作目錄中進行
在客戶端
[root@server6 mfs]# mfsscadmin create 2A class2A 兩個都存在A上
storage class make class2A: ok
[root@server6 mfs]# mfsscadmin create 2B class2B 兩個都存在B上
storage class make class2B: ok
[root@server6 mfs]# mfsscadmin create A,B classAB 存在A和B 上
storage class make classAB: ok
[root@server6 mfs]# mfsscadmin create AS,BH classASBH 存在A和S標籤 和 B和H標籤 的chunk上。
storage class make classASBH: ok
[root@server6 mfs]# mfsscadmin list
1
2
3
4
5
6
7
8
9
class2A
class2B
classAB
classASBH
[root@server6 mfs]# mkdir dir1 dir2
[root@server6 mfs]# ls
dir1 dir2
[root@server6 mfs]# touch dir1/file1 ## 在裏面隨便輸入一點數據。
[root@server6 mfs]# touch dir2/file1
[root@server6 mfs]# mfsgetgoal dir1/file1
dir1/file1: 2 ## 默認存儲兩個
[root@server6 mfs]# mfsgetgoal dir2/file1
dir2/file1: 2
[root@server6 mfs]# mfssetsclass -r class2A dir1 將dir1下的存儲到A上
dir1:
inodes with storage class changed: 2
inodes with storage class not changed: 0
inodes with permission denied: 0
[root@server6 mfs]# mfssetsclass -r class2B dir2 dir2下的存儲到B上
dir2:
inodes with storage class changed: 2
inodes with storage class not changed: 0
inodes with permission denied: 0
[root@server6 mfs]# mfsfileinfo dir{1..2}/*
dir1/file1:
chunk 0: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.254.2:9422 (status:VALID) # server2
copy 2: 172.25.254.4:9422 (status:VALID) # server4
dir2/file1:
chunk 0: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.254.3:9422 (status:VALID) # server3
copy 2: 172.25.254.5:9422 (status:VALID) # server5
server2:
LABELS = A S A機房 固態硬盤
server3:
LABELS = B S B機房 固態硬盤
server4:
LABELS = A H A機房 機械硬盤
server5:
LABELS = B H B機房 機械硬盤
dir1/file1確實存放到了帶有A標籤的chunk服務器上。 默認是兩個副本。
dir2/file1確實存放到了帶有B標籤的chunk服務器上。
更改一下:
[root@server6 mfs]# mfsxchgsclass -r class2B classAB dir2 更改類。
dir2:
inodes with storage class changed: 2
inodes with storage class not changed: 0
inodes with permission denied: 0
[root@server6 mfs]# mfsfileinfo dir{1..2}/*
dir1/file1:
chunk 0: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.254.2:9422 (status:VALID)
copy 2: 172.25.254.4:9422 (status:VALID)
dir2/file1:
chunk 0: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.254.2:9422 (status:VALID) # 隨即一個A
copy 2: 172.25.254.3:9422 (status:VALID) # 隨即一個B
存儲類的設定
比如創建文件的時候可以進行設定,參數:
- create 設定文件創建的存儲
- keep 文件保存的存儲設定
- archive 指定時間後,文件打包存儲的設定
[root@server6 mfs]# mfsscadmin create -C 2A -K AS,BS -A AH,BH -d 7 important
-C create -K keep -A archive -d 天數 important文件名
表示在創建文件時在A機房的任意兩臺服務器上,保存文件副本的時候,保存在A和B機房的S服務器上,打包存儲時在A和B的各一臺H服務器上
可以看到我們的設定
處理異常
異常關閉後無法開啓
我們先在server6取消掛礙client的客戶端,不然對這個實驗產生影響。
umount /mnt/mfs
我們在打開mfs-master時,會產生一個文件:
[root@server1 3.0.113]# cd /var/lib/mfs/
[root@server1 mfs]# ls
changelog.0.mfs changelog.3.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs changelog.4.mfs metadata.mfs.back metadata.mfs.empty
就是這個.back 結尾的文件。
我們正常關閉時:
[root@server1 mfs]# systemctl stop moosefs-master.service
[root@server1 mfs]# ls
changelog.0.mfs changelog.3.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs changelog.4.mfs metadata.mfs metadata.mfs.empty
它就變成了 matadata.mfs 這個文件,去掉了back的結尾
當我們不正常關閉時:
[root@server1 mfs]# ps ax |grep mfsmaster
13929 ? S< 0:00 /usr/sbin/mfsmaster start
13930 ? S< 0:00 mfsmaster (data writer)
13932 pts/0 S+ 0:00 grep --color=auto mfsmaster
[root@server1 mfs]# kill -9 13929
[root@server1 mfs]# ps ax |grep mfsmaster
13936 pts/0 S+ 0:00 grep --color=auto mfsmaster
[root@server1 mfs]# ls
changelog.0.mfs changelog.3.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs changelog.4.mfs metadata.mfs.back metadata.mfs.empty
它還是以.back結尾的文件,這時我們再次啓動mfs-master:
[root@server1 mfs]# systemctl start moosefs-master
Job for moosefs-master.service failed because the control process exited with error code. See "systemctl status moosefs-master.service" and "journalctl -xe" for details.
就報錯了。我們查看日誌,它讓我們加上-a參數:
[root@server1 mfs]# mfsmaster start -a
[root@server1 mfs]# systemctl status moosefs-master.service
● moosefs-master.service - MooseFS Master server
Loaded: loaded (/usr/lib/systemd/system/moosefs-master.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2020-05-20 14:58:36 CST; 6min ago
[root@server1 mfs]# ls
changelog.0.mfs changelog.3.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs changelog.4.mfs metadata.mfs.back metadata.mfs.empty
這個文件還在,於是我們去啓動腳本中更改:
[root@server1 mfs]# vim /usr/lib/systemd/system/moosefs-master.service;
ExecStart=/usr/sbin/mfsmaster start -a # 給這一行加上-a 參數
[root@server1 mfs]# systemctl daemon-reload # 重新加載守護進程
[root@server1 mfs]# systemctl start moosefs-master # 可以開啓了
[root@server1 mfs]# systemctl status moosefs-master
● moosefs-master.service - MooseFS Master server
Loaded: loaded (/usr/lib/systemd/system/moosefs-master.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2020-05-20 15:10:14 CST; 5s ago
[root@server1 mfs]# systemctl stop moosefs-master.service # 再次關閉
[root@server1 mfs]# ls
changelog.0.mfs changelog.3.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs changelog.4.mfs metadata.mfs metadata.mfs.empty
文件就恢復正常了。
這就是異常關閉的處理
數據恢復
最開始介紹了 mfs 也是支持垃圾箱的, 已刪除的文件將保留一段可配置的時間(文件系統級別的“垃圾桶”)
我們可以根據這一特性進行恢復。
我們在server6上在重新掛載上:
[root@server6 ~]# mfsmount
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
然後刪除一個工作目錄中的文件
[root@server6 ~]# cd /mnt/mfs/dir1
[root@server6 dir1]# ls
file1
[root@server6 dir1]# rm -fr file1
然後去從垃圾箱中獲取:
[root@server6 dir1]# mfsgettrashtime /mnt/mfs/dir1/ 獲取垃圾箱最大存放時間
/mnt/mfs/dir1/: 86400
[root@server6 dir1]# mkdir /mnt/mfsmeta 建立恢復目錄
[root@server6 dir1]# mfsmount -m /mnt/mfsmeta/ 掛載,用df時看不到的,因爲時垃圾箱,可以用mount命令查看
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@server6 dir1]# cd /mnt/mfsmeta/
[root@server6 mfsmeta]# ls
sustained trash 進入我們就可以看到兩個目錄,我們的文件就存放在trash目錄中
[root@server6 mfsmeta]# cd trash/
[root@server6 trash]# find -name *file1*
./008/00000008|dir1|file1~
./009/00000009|dir2|file1~
./00A/0000000A|dir1|.file1.swp
./00B/0000000B|dir1|.file1.swpx
./00C/0000000C|dir1|.file1.swp
./00E/0000000E|dir1|file1 這就是我們的文件了
./00F/0000000F|dir2|.file1.swp
./010/00000010|dir2|.file1.swpx
./011/00000011|dir2|.file1.swp
[root@server6 trash]# cd 00E/
[root@server6 00E]# ls
0000000E|dir1|file1 undel
[root@server6 00E]# mv 0000000E\|dir1\|file1 undel/ 把我們的文件放到undel目錄中去,就是不刪除,相當於wimdows的恢復
[root@server6 00E]# cd /mnt/mfs/dir1/
[root@server6 dir1]# ls
file1
[root@server6 dir1]# cat file1
asdasjdasdaskjdasdasd
我們的文件就又回來了