企业 MooseFS分布式文件系统

MooseFS

什么是MooseFS

MooseFS是一个容错的分布式文件系统。它将数据分散到多个物理服务器,用户可以将这些物理服务器作为一个整体的资源看到。
MooseFS的特点是:

  • 高可靠性(数据的多个副本可以存储在单独不同的物理机器上)
  • 通过添加新的计算机/磁盘,可以动态扩展容量
  • 删除的文件将根据一段可配置的时间进行0保留(一个文件系统级的“垃圾箱”)
  • 文件的连贯快照,即使文件正在写入或访问
MooseFS的组成

MooseFS文件系统结构包括以下四种角色:

  1. 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝;
  2. 元数据日志服务器: 负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作;
  3. 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输;
  4. 客户端: 通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,.看起来共享的文件系统和本地unix文件系统使用一样的效果.

MooseFS安装

在它的官网里 moosefs.com 可以查看到它的下载和安装方式,里面是需要先下载yum配置,通过yum直接去下载需要的安装包
在这里插入图片描述
这个就是它的yum配置

[MooseFS]
name=MooseFS $releasever - $basearch
baseurl=http://ppa.moosefs.com/moosefs-3/yum/el7
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
enabled=1

我们也可以直接访问这里的网站去下载需要的rpm包
在这里插入图片描述
这里我根据需要下载里一些软件包

 moosefs-cgi-3.0.113-1.rhsystemd.x86_64.rpm
 moosefs-cgiserv-3.0.113-1.rhsystemd.x86_64.rpm
 moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm
 moosefs-cli-3.0.113-1.rhsystemd.x86_64.rpm
 moosefs-client-3.0.113-1.rhsystemd.x86_64.rpm
 moosefs-master-3.0.113-1.rhsystemd.x86_64.rpm
 moosefs-metalogger-3.0.113-1.rhsystemd.x86_64.rpm
安装master节点

我使用server1主机作为master

[root@server1 ~]# yum install -y 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

安装之后会生成一个用户mfs

[root@server1 ~]# id mfs
uid=998(mfs) gid=996(mfs) groups=996(mfs)

在配置文件里:/etc/mfs/mfsmaster.cfg ,可以看到后面这个主机会使用mfsmaster这个主机名去管理client节点的主机,所以在其他client节点上要修改地址解析。
在这里插入图片描述
启动moosefs-master,开启后会打开9419、9420、9421这3个端口

[root@server1 ~]# netstat -ntlp
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:9419            0.0.0.0:*               LISTEN      4431/mfsmaster      
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN      4431/mfsmaster      
tcp        0      0 0.0.0.0:9421            0.0.0.0:*               LISTEN      4431/mfsmaster  

然后开启moosefs-cgiserv,会开启9425的端口,这个端口是图形界面的端口,可以使用浏览器去访问moosefs的控制台

[root@server1 ~]# systemctl start moosefs-cgiserv.service 
[root@server1 ~]# netstat -ntlp
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:9425            0.0.0.0:*               LISTEN      4460/python2   

在这里插入图片描述

安装Chunk server节点

使用server2和server3最为Chunk节点
只需要安装 moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm
安装完成同样也会生成mfs用户,这里要注意安装完生成的mfs的uid和gid必须都是一样的,否则在连接操作时会出错。

[root@server2 ~]# id mfs
uid=998(mfs) gid=996(mfs) groups=996(mfs)

[root@server3 ~]# id mfs
uid=998(mfs) gid=996(mfs) groups=996(mfs)
servser2配置

同时我在server2上添加一块新的硬盘大小是1G作为共享数据的储存硬盘,使用fdisk -l命令查看磁盘情况确认添加成功
在这里插入图片描述并且对这个磁盘进行分区格式化操作,是其可用

[root@server2 ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xe3750616.

Command (m for help): n	#新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 	#回车默认添加分区
Using default response p
Partition number (1-4, default 1): 1	#1表示主分区
First sector (2048-2097151, default 2048): #回车默认从头开始 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): 	#回车默认到最后结束,相当于分了全部空间
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): wq	#wq保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@server2 ~]# mkfs.xfs /dev/vdb1 #格式化文件系统,有过有文件系统可以加 -f 参数

完成后创建一个目录来挂在这块磁盘

[root@server2 ~]# mkdir /mnt/disk1
[root@server2 ~]# mount /dev/vdb1 /mnt/disk1/

对这个目录的拥有者和拥有组进行更改

[root@server2 disk1]# chown mfs.mfs /mnt/disk1/

编辑配置文件:vim /etc/mfs/mfshdd.cfg ,在最后指定磁盘的挂在点
在这里插入图片描述
开启moosefs-chunkserver ,查看端口

[root@server2 disk1]# systemctl start moosefs-chunkserver
[root@server2 disk1]# netstat -ntlp
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      14492/mfschunkserve 

然后我们就可以在moosefs页面上看到,多了有一个server2,大小是1G
在这里插入图片描述

server3配置

server3上直接使用它的系统文件系统的磁盘进行挂载

[root@server3 ~]# mkdir /mnt/disk2	#创建挂在目录
[root@server3 ~]# vim /etc/mfs/mfshdd.cfg	#指定挂在目录
[root@server3 ~]# chown mfs.mfs /mnt/disk2	#更改权限
[root@server3 ~]# systemctl start moosefs-chunkserver	#开启服务

刷新页面就可以看到server3也添加到server里了,它的磁盘大小就是 / 的大小
在这里插入图片描述

测试操作

这里需要配置一台server6来进行访问操作,同样配置地址解析
安装客户端的软件 moosefs-client-3.0.113-1.rhsystemd.x86_64.rpm
编辑配置文件:/etc/mfs/mfsmount.cfg,在最后添加挂载信息
在这里插入图片描述

[root@server6 ~]# mkdir /mnt/mfs
[root@server6 ~]# vim /etc/mfs/mfsmount.cfg
[root@server6 ~]# mfsmount #改完配置进行挂载
[root@server6 ~]# cd /mnt/mfs
[root@server6 mfs]# mkdir dir1 dir2	#创建两个子目录
[root@server6 mfs]# mfsgetgoal dir1
dir1: 2	#这个2表示dir1目录有两个备份,因为我们有两台server主机
[root@server6 mfs]# mfsgetgoal dir2
dir2: 2

这个备份数量我们也是可以更改的,手动更改为1个备份

[root@server6 mfs]# mfssetgoal -r 1 dir1
dir1:
 inodes with goal changed:                       1
 inodes with goal not changed:                   0
 inodes with permission denied:                  0
[root@server6 mfs]# mfsgetgoal dir1
dir1: 1

然后我们就可以开启数据的备份测试

#给dir1和dir2分别放入一个文件
[root@server6 mfs]# cp /etc/passwd dir1/
[root@server6 mfs]# cp /etc/shadow dir2/

#查看它们里面的文件备份在哪里
[root@server6 mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
		copy 1: 172.25.254.3:9422 (status:VALID)	#只备份在一个server上
[root@server6 mfs]# mfsfileinfo dir2/shadow 
dir2/shadow:
	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)

这里dir1只备份在server3上一份,而dir2里的数据在server3和server2都有备份,如果我们现在去关闭server3上的moosefs-chunkserver ,看看是什么效果

[root@server6 mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
		no valid copies !!!	#没有备份了
[root@server6 mfs]# mfsfileinfo dir2/shadow 
dir2/shadow:
	chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
		copy 1: 172.25.254.2:9422 (status:VALID)	#还有server2上的备份

当使用cat查看文件时 dir1/passwd 是打不开的,命令直接会卡死。
这是因为放在mfs目录的所有数据都会根据配置上传备份到server里,如果备份的server端没了,那你的数据也就看不了了,所以同时备份在多个server上就可以避免这个问题。
再去打开server3上的moosefs-chunkserver,就又可以看到数据了

写入数据过程总结
  • client向Master发送写请求
  • Master服务器与Chunk servers进行交互,但Master服务器只在某些服务器上创建新的分块Chunks
  • 创建成功后由Chunk servers告知Master操作成功
  • Master服务器告知client,可以在哪个Chunk server上的哪些Chunks上写入数据
  • client向指定的Chunk server写数据
  • 写入数据的Chunk server与其他Chunk servers进行数据同步,成功后告知client写入成功
  • client告知Master写入完毕
    在这里插入图片描述
读取数据过程在总结
  • client向Master发送读的请求
  • Master告诉client数据储存在哪个Chunk server上
  • client向储存数据的Chunk server发送读的信号
  • Chunk server返回需要读的数据给client
    在这里插入图片描述

Storage Classes 存储类 ,Labels 标签

说明

Storage Classes
存储类允许您指定应存储哪些块服务器文件备份。存储类是使用标签表达式定义的。
简单来说就是可以将Chunk server进行分类,有读写快的服务器,都读写慢的服务器,根据需要去进行分配资源

Labels
标签是可以分配给Chunk server的字母(A-Z的26个字母)。每个Chunk server可以有多个(最多26个)标签。
标签表达式是一组用逗号分隔的子表达式,每个子表达式指定一个文件备份的存储架构。子表达式可以是:一个星号或一个标签架构。
标签模式可以是一个标签,也可以是一个包含加(+)、乘和方括号的表达式。
加意味着文件可以存储在通过“+”连接的的任何一个元素匹配的Chunk server上,如:A+B,就是A或者B
乘意味着文件只能存储在与所有元素匹配的Chunk server上,如:AB,就必须同时包含A和B
星号表示任何Chunk server,如: *,表示所有的Chunk server都可以

操作

为了实验效果明显,这里使用了4台Chunk server主机server2、server3、server4、server5
在这里插入图片描述
server6作为客户主机
server1是master

打标签
  • 首先在server2打标签
    编辑配置文件:/etc/mfs/mfschunkserver.cfg,搜索LABELS
    在这里插入图片描述
    给标签写上A S,A表示我表示机房A,S表示磁盘是SSD(这都是自己定义的,自己理解就好,没有限制)

  • 在server3打标签
    B S 表示B机房,磁盘是SSD
    在这里插入图片描述

  • 在server4打标签
    A H 表示A机房,磁盘是HD
    在这里插入图片描述

  • 在server5打标签
    B H 表示B机房,磁盘是HD
    在这里插入图片描述

打完标签后对Chunk上的moosefs-chunkserver进行reload重新加载,在页面上就可以看到它们的标签了
在这里插入图片描述

存储测试

在server6客户端上进行存储类的定义

[root@server6 mfs]# mfsscadmin create A,A class2A	#都存储在A机房,A,A也可以写2A
storage class make classAA: ok
[root@server6 mfs]# mfsscadmin create 2B class2B	#都存储在B机房,2B=B,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上
storage class make classASBH: ok

[root@server6 mfs]# mfsscadmin list
#这里会显示(1-9)的数字是留给老的存储类的
class2A
class2B
classAB
classASBH

建立目录去分别建立文件在里面,,给建立的文件里面都随机写入一些数据,可以看到它们都是两个备份

[root@server6 mfs]# mkdir 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:	#将dir1都放在class2A存储类里,就是都在A机房
 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:	#将dir1都放在class2B存储类里,就是都在B机房
 inodes with storage class changed:              2
 inodes with storage class not changed:          0
 inodes with permission denied:                  0

查看信息,可以看出来dir1的数据存放在标签都有A的主机上,dir2数据存放在标签都有B的主机上

[root@server6 mfs]# mfsfileinfo dir*/*
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.3:9422 (status:VALID)
		copy 2: 172.25.254.5:9422 (status:VALID)

修改存储类

[root@server6 mfs]# mfsxchgsclass -r class2A classAB dir2	#给dir2添加两个存储类,2A和AB这两个存储类都可以使用,随机存储在2台主机上
dir2:
 inodes with storage class changed:              0
 inodes with storage class not changed:          2
 inodes with permission denied:                  0

还有一些创建存储类时的特殊设定参数
create -C 创建数据储存的服务器
kepp -K 保存数据备份的服务器
archive -A 数据存储打包时间的设定

[root@server6 mfs]# mfsscadmin create -C 2A -K AS,BS -A AH,BH -d 7 testfile
# -C 指定存储在2A主机上, -K指定备份在AS,BS主机, -A 指定打包在AH,BH主机上,-d 7表示7天之后执行打包,testfile创建的文件名

我们编写的存储类在页面里都可以看到信息+
在这里插入图片描述

MooseFS 异常退出

测试前,需要卸载server6里的挂载

[root@server6 ~]# umount /mnt/mfs

r如果mfsmaster异常退出,再启动时就会报错
例如:使用kill -9直接杀掉它的进程

[root@server1 ~]# kill -9 4431	#进程ID使用 ps -ax | grep mfsmaster 查看

[root@server1 ~]# systemctl start moosefs-master.service 
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.

然后使用systemctl start 或mfs本身的命令mfsmaster start,查看日志里会说尝试使用-a参数.
它的启动脚本在:/usr/lib/systemd/system/moosefs-master.service 文件里,在里面的脚本里直接加上-a参数不论是不是异常退出启动都可以再开启
添加完,执行systemctl daemon-reload 加载脚本
在这里插入图片描述
再去执行 systemctl start moosefs-master.service 就可以正常运行了

MooseFS数据恢复

重新去挂载server6客户端数据

[root@server6 mfs]# mfsmount 

[root@server6 mfs]# rm -fr dir1/file1 #删除dir1/file1
[root@server6 mfs]# mfsgettrashtime /mnt/mfs/dir1/	#产看dir1在垃圾箱里的存放时间
/mnt/mfs/dir1/: 86400	#这里的计数是秒,超过这个时间就会永久删除

恢复数据

[root@server6 mfs]# mkdir /mnt/mfsmeta	#创建一个新的目录存放数据
[root@server6 mfs]# mfsmount -m /mnt/mfsmeta/	#挂载这个目录
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@server6 mfs]# cd /mnt/mfsmeta/	#进入挂载的目录
[root@server6 mfsmeta]# ls	#里面有垃圾箱目录,删除的数据都会存放在里面
sustained  trash
[root@server6 mfsmeta]# find trash/ -name *file1*
trash/00E/0000000E|dir1|file1	#查找到的这样的才是数据文件
[root@server6 mfsmeta]# cd trash/00E/	#进入查找到目录
[root@server6 00E]# mv '0000000E|dir1|file1' undel/	#将文件移动到不删除目录里
[root@server6 00E]# cat /mnt/mfs/dir1/file1 #就可以在看到文件内容了
adasdasd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Howei__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值