MooseFS分佈式文件系統的安裝部署應用

實驗環境:

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的顯著特徵是:

  1. 高可靠性(數據的多個副本可以存儲在單獨的物理機器上)
  2. 容量可以通過添加新的計算機或磁盤實現容量的動態擴展
  3. 已刪除的文件將保留一段可配置的時間(文件系統級別的“垃圾桶”)
  4. 文件的一致快照,即使文件正在被寫入/訪問

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

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