文章目录
MooseFS
什么是MooseFS
MooseFS是一个容错的分布式文件系统。它将数据分散到多个物理服务器,用户可以将这些物理服务器作为一个整体的资源看到。
MooseFS的特点是:
- 高可靠性(数据的多个副本可以存储在单独不同的物理机器上)
- 通过添加新的计算机/磁盘,可以动态扩展容量
- 删除的文件将根据一段可配置的时间进行0保留(一个文件系统级的“垃圾箱”)
- 文件的连贯快照,即使文件正在写入或访问
MooseFS的组成
MooseFS文件系统结构包括以下四种角色:
- 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝;
- 元数据日志服务器: 负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作;
- 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输;
- 客户端: 通过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