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分布式文件系统的安装部署应用_第1张图片

简介

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

工作原理

读:
MooseFS分布式文件系统的安装部署应用_第2张图片
写:
MooseFS分布式文件系统的安装部署应用_第3张图片

安装配置

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
在这里插入图片描述

测试访问:
MooseFS分布式文件系统的安装部署应用_第4张图片
此时没有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
MooseFS分布式文件系统的安装部署应用_第5张图片
MooseFS分布式文件系统的安装部署应用_第6张图片
格式化:

[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界面:
MooseFS分布式文件系统的安装部署应用_第7张图片

打标签需要先修改配置文件:
( 类型: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

我们的文件就又回来了

你可能感兴趣的:(MFS)