欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MooseFS分布式文件系统的安装部署应用

程序员文章站 2024-03-08 12:43:58
...

实验环境:

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分布式文件系统的安装部署应用

简介

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分布式文件系统的安装部署应用
写:
MooseFS分布式文件系统的安装部署应用

安装配置

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用户:
MooseFS分布式文件系统的安装部署应用
三台主机都做好本地解析;
MooseFS分布式文件系统的安装部署应用
启动mfs:

systemctl start moosefs-master.service
systemctl start moosefs-cgiserv.service

master会开启三个端口:
19端口用于备份日志的监听端口,20是chunk server的监听端口,21是和客户端连接的地址
cgi会开启图形界面的端口:9425
MooseFS分布式文件系统的安装部署应用

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

[aaa@qq.com ~]# 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

创建挂载点:

[aaa@qq.com ~]# mkdir /mnt/chunk1
[aaa@qq.com ~]# mount /dev/sdb1 /mnt/chunk1/           挂载
[aaa@qq.com ~]# chown mfs.mfs /mnt/chunk1/      修改权限

再配置文件中更改挂载点:

[aaa@qq.com ~]# vim /etc/mfs/mfshdd.cfg

MooseFS分布式文件系统的安装部署应用
启动chunkserver。

[aaa@qq.com ~]# systemctl start moosefs-chunkserver
[aaa@qq.com ~]# 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端我们可以看见:
MooseFS分布式文件系统的安装部署应用
server2已经加入到集群里面去了。

server3中:
/分区下的空间还很大。所以这里使用根分区。

[aaa@qq.com ~]# mkdir /mnt/chunk2
[aaa@qq.com ~]# vim /etc/mfs/mfshdd.cfg           里面设置为 /mnt/chunk2
[aaa@qq.com ~]# chown mfs.mfs /mnt/chunk2/
[aaa@qq.com ~]# systemctl start moosefs-chunkserver

MooseFS分布式文件系统的安装部署应用
server3就加进去了。

读写

我们在server6上安装客户端:

[aaa@qq.com ~]# yum install  moosefs-client-3.0.113-1.rhsystemd.x86_64.rpm -y
[aaa@qq.com ~]# vim /etc/hosts             添加server1  mfsmaster的解析
[aaa@qq.com ~]# mkdir /mnt/mfs             建立目录   mfs的挂载目录
[aaa@qq.com ~]# vim /etc/mfs/mfsmount.cfg

MooseFS分布式文件系统的安装部署应用

[aaa@qq.com ~]# mfsmount                    挂载
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[aaa@qq.com ~]# 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

[aaa@qq.com ~]# cd /mnt/mfs/
[aaa@qq.com mfs]# mkdir dir1                # 建立两个子目录
[aaa@qq.com mfs]# mkdir dir2
[aaa@qq.com mfs]# ls
dir1  dir2
[aaa@qq.com mfs]# mfsgetgoal dir1/       获取备份数目,因为有server2 和3 两台chunk服务器,所以为2
dir1/: 2
[aaa@qq.com mfs]# mfsgetgoal dir2/
dir2/: 2
[aaa@qq.com 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
[aaa@qq.com mfs]# mfsgetgoal dir1/
dir1/: 1

我们现在拷贝一份文件进去():

[aaa@qq.com mfs]# cp /etc/passwd dir1
[aaa@qq.com mfs]# cp /etc/group dir2
[aaa@qq.com mfs]# mfsfileinfo dir1/passwd 
dir1/passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)          只有一个备份在server3上
		copy 1: 172.25.254.3:9422 (status:VALID)
[aaa@qq.com 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:

[aaa@qq.com ~]# systemctl stop moosefs-chunkserver

在server6查看:
[aaa@qq.com mfs]# mfsfileinfo dir1/passwd 
dir1/passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)                  ## 看不了了,因为数据存放在server3
		no valid copies !!!
[aaa@qq.com mfs]# mfsfileinfo dir2/group 
dir2/group:
	chunk 0: 0000000000000002_00000001 / (id:2 ver:1)					
		copy 1: 172.25.254.2:9422 (status:VALID)								## 还有server2的一份数据可以查看
[aaa@qq.com mfs]# cat dir1/passwd 
^C                   						## 查看的时候就会卡到这里
[aaa@qq.com 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服务就可以看到了
[aaa@qq.com ~]# systemctl start moosefs-chunkserver

[aaa@qq.com 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:
[aaa@qq.com mnt]# yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
[aaa@qq.com mnt]# mkdir /mnt/chunk3
[aaa@qq.com mnt]# chown mfs.mfs /mnt/chunk3/
[aaa@qq.com mnt]# vim /etc/mfs/mfshdd.cfg
# 最后一行加上 /mnt/chunk3 
[aaa@qq.com mnt]# systemctl start moosefs-chunkserver

server5:
[aaa@qq.com mnt]# yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
[aaa@qq.com mnt]# mkdir /mnt/chunk4
[aaa@qq.com mnt]# chown mfs.mfs /mnt/chunk4/
[aaa@qq.com mnt]# vim /etc/mfs/mfshdd.cfg
# 最后一行加上 /mnt/chunk4 
[aaa@qq.com mnt]# systemctl start moosefs-chunkserver

此时web界面:
MooseFS分布式文件系统的安装部署应用

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

设置四种存储类: 必须在工作目录中进行
在客户端

[aaa@qq.com mfs]# mfsscadmin create 2A class2A             两个都存在A上 
storage class make class2A: ok
[aaa@qq.com mfs]# mfsscadmin create 2B class2B				两个都存在B上
storage class make class2B: ok
[aaa@qq.com mfs]# mfsscadmin create A,B classAB				存在A和B 上
storage class make classAB: ok
[aaa@qq.com mfs]# mfsscadmin create AS,BH classASBH			存在A和S标签 和 B和H标签 的chunk上。
storage class make classASBH: ok
[aaa@qq.com mfs]# mfsscadmin list
1
2
3
4
5
6
7
8
9
class2A
class2B
classAB
classASBH
[aaa@qq.com mfs]# mkdir dir1 dir2
[aaa@qq.com mfs]# ls
dir1  dir2
[aaa@qq.com mfs]# touch dir1/file1            ## 在里面随便输入一点数据。
[aaa@qq.com mfs]# touch dir2/file1
[aaa@qq.com mfs]# mfsgetgoal dir1/file1
dir1/file1: 2                     ## 默认存储两个
[aaa@qq.com mfs]# mfsgetgoal dir2/file1
dir2/file1: 2
[aaa@qq.com 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
[aaa@qq.com 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
[aaa@qq.com 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服务器上。

更改一下:

[aaa@qq.com 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
[aaa@qq.com 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 指定时间后,文件打包存储的设定
[aaa@qq.com 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服务器上

MooseFS分布式文件系统的安装部署应用
可以看到我们的设定

处理异常

异常关闭后无法开启

我们先在server6取消挂碍client的客户端,不然对这个实验产生影响。
umount /mnt/mfs

我们在打开mfs-master时,会产生一个文件:

[aaa@qq.com 3.0.113]# cd /var/lib/mfs/
[aaa@qq.com 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 结尾的文件。

我们正常关闭时:

[aaa@qq.com mfs]# systemctl stop moosefs-master.service 
[aaa@qq.com 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的结尾

当我们不正常关闭时:

[aaa@qq.com 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
[aaa@qq.com mfs]# kill -9 13929
[aaa@qq.com mfs]# ps ax |grep mfsmaster
13936 pts/0    S+     0:00 grep --color=auto mfsmaster
[aaa@qq.com 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:
[aaa@qq.com 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参数:
[aaa@qq.com mfs]# mfsmaster start -a
[aaa@qq.com 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
[aaa@qq.com 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

这个文件还在,于是我们去启动脚本中更改:
[aaa@qq.com mfs]# vim /usr/lib/systemd/system/moosefs-master.service;
ExecStart=/usr/sbin/mfsmaster start -a        # 给这一行加上-a 参数

[aaa@qq.com mfs]# systemctl daemon-reload         # 重新加载守护进程
[aaa@qq.com mfs]# systemctl start moosefs-master      # 可以开启了
[aaa@qq.com 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  
[aaa@qq.com mfs]# systemctl stop moosefs-master.service        # 再次关闭
[aaa@qq.com 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上在重新挂载上:

[aaa@qq.com ~]# mfsmount 
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root

然后删除一个工作目录中的文件

[aaa@qq.com ~]# cd /mnt/mfs/dir1
[aaa@qq.com dir1]# ls
file1
[aaa@qq.com dir1]# rm -fr file1 

然后去从垃圾箱中获取:

[aaa@qq.com dir1]# mfsgettrashtime /mnt/mfs/dir1/       获取垃圾箱最大存放时间
/mnt/mfs/dir1/: 86400
[aaa@qq.com dir1]# mkdir /mnt/mfsmeta            建立恢复目录
[aaa@qq.com dir1]# mfsmount -m /mnt/mfsmeta/                 挂载,用df时看不到的,因为时垃圾箱,可以用mount命令查看
mfsmaster accepted connection with parameters: read-write,restricted_ip
[aaa@qq.com dir1]# cd /mnt/mfsmeta/
[aaa@qq.com mfsmeta]# ls
sustained  trash                      进入我们就可以看到两个目录,我们的文件就存放在trash目录中
[aaa@qq.com mfsmeta]# cd trash/
[aaa@qq.com 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

[aaa@qq.com trash]# cd 00E/
[aaa@qq.com 00E]# ls
0000000E|dir1|file1  undel 
[aaa@qq.com 00E]# mv 0000000E\|dir1\|file1 undel/     把我们的文件放到undel目录中去,就是不删除,相当于wimdows的恢复
[aaa@qq.com 00E]# cd /mnt/mfs/dir1/
[aaa@qq.com dir1]# ls
file1
[aaa@qq.com dir1]# cat file1 
asdasjdasdaskjdasdasd

我们的文件就又回来了