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

企业 MooseFS分布式文件系统

程序员文章站 2024-03-08 15:46:22
...

MooseFS

什么是MooseFS

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

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

MooseFS的组成

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

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

MooseFS安装

在它的官网里 moosefs.com 可以查看到它的下载和安装方式,里面是需要先下载yum配置,通过yum直接去下载需要的安装包
企业 MooseFS分布式文件系统
这个就是它的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分布式文件系统
这里我根据需要下载里一些软件包

 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

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

[aaa@qq.com ~]# id mfs
uid=998(mfs) gid=996(mfs) groups=996(mfs)

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

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

[aaa@qq.com ~]# systemctl start moosefs-cgiserv.service 
[aaa@qq.com ~]# 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   

企业 MooseFS分布式文件系统

安装Chunk server节点

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

[aaa@qq.com ~]# id mfs
uid=998(mfs) gid=996(mfs) groups=996(mfs)

[aaa@qq.com ~]# id mfs
uid=998(mfs) gid=996(mfs) groups=996(mfs)
servser2配置

同时我在server2上添加一块新的硬盘大小是1G作为共享数据的储存硬盘,使用fdisk -l命令查看磁盘情况确认添加成功
企业 MooseFS分布式文件系统并且对这个磁盘进行分区格式化操作,是其可用

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

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

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

[aaa@qq.com ~]# mkdir /mnt/disk1
[aaa@qq.com ~]# mount /dev/vdb1 /mnt/disk1/

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

[aaa@qq.com disk1]# chown mfs.mfs /mnt/disk1/

编辑配置文件:vim /etc/mfs/mfshdd.cfg ,在最后指定磁盘的挂在点
企业 MooseFS分布式文件系统
开启moosefs-chunkserver ,查看端口

[aaa@qq.com disk1]# systemctl start moosefs-chunkserver
[aaa@qq.com 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
企业 MooseFS分布式文件系统

server3配置

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

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

刷新页面就可以看到server3也添加到server里了,它的磁盘大小就是 / 的大小
企业 MooseFS分布式文件系统

测试操作

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

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

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

[aaa@qq.com mfs]# mfssetgoal -r 1 dir1
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

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

#给dir1和dir2分别放入一个文件
[aaa@qq.com mfs]# cp /etc/passwd dir1/
[aaa@qq.com mfs]# cp /etc/shadow dir2/

#查看它们里面的文件备份在哪里
[aaa@qq.com mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
		copy 1: 172.25.254.3:9422 (status:VALID)	#只备份在一个server上
[aaa@qq.com 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 ,看看是什么效果

[aaa@qq.com mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
		no valid copies !!!	#没有备份了
[aaa@qq.com 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写入完毕
    企业 MooseFS分布式文件系统
读取数据过程在总结
  • client向Master发送读的请求
  • Master告诉client数据储存在哪个Chunk server上
  • client向储存数据的Chunk server发送读的信号
  • Chunk server返回需要读的数据给client
    企业 MooseFS分布式文件系统

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
企业 MooseFS分布式文件系统
server6作为客户主机
server1是master

打标签
  • 首先在server2打标签
    编辑配置文件:/etc/mfs/mfschunkserver.cfg,搜索LABELS
    企业 MooseFS分布式文件系统
    给标签写上A S,A表示我表示机房A,S表示磁盘是SSD(这都是自己定义的,自己理解就好,没有限制)

  • 在server3打标签
    B S 表示B机房,磁盘是SSD
    企业 MooseFS分布式文件系统

  • 在server4打标签
    A H 表示A机房,磁盘是HD
    企业 MooseFS分布式文件系统

  • 在server5打标签
    B H 表示B机房,磁盘是HD
    企业 MooseFS分布式文件系统

打完标签后对Chunk上的moosefs-chunkserver进行reload重新加载,在页面上就可以看到它们的标签了
企业 MooseFS分布式文件系统

存储测试

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

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

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

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

[aaa@qq.com mfs]# mkdir 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:	#将dir1都放在class2A存储类里,就是都在A机房
 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:	#将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的主机上

[aaa@qq.com 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)

修改存储类

[aaa@qq.com 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 数据存储打包时间的设定

[aaa@qq.com 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分布式文件系统

MooseFS 异常退出

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

[aaa@qq.com ~]# umount /mnt/mfs

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

[aaa@qq.com ~]# kill -9 4431	#进程ID使用 ps -ax | grep mfsmaster 查看

[aaa@qq.com ~]# 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 加载脚本
企业 MooseFS分布式文件系统
再去执行 systemctl start moosefs-master.service 就可以正常运行了

MooseFS数据恢复

重新去挂载server6客户端数据

[aaa@qq.com mfs]# mfsmount 

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

恢复数据

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