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是一个容错的分布式文件系统。它将数据分散到多个物理位置(服务器),用户可以将这些位置(服务器)看作一个资源。
比如用户要上传10G的资源,对于用户本身和服务器来说都是不友好的,所以可以把它分成10个1G的资源,这样就方便快捷多了,但实际还是一个资源。系统将这些资源的链接集成到一个共享文件夹内,这样用户就可以在一个文件夹内看到所有的资源了。
对于标准文件操作,MooseFS充当任何其他类似unix的文件系统:
- 层次结构(目录树)
- 存储POSIX文件属性(权限、最后访问和修改时间)
- 支持特殊文件(块和字符设备、管道和套接字)
- 符号链接(指向目标文件的文件名,不一定在MooseFS中)和硬链接链接(引用MooseFS上相同数据的文件的不同名称)
- 基于IP地址和/或密码,可以限制对文件系统的访问
MooseFS的显著特征是:
- 高可靠性(数据的多个副本可以存储在单独的物理机器上)
- 容量可以通过添加新的计算机或磁盘实现容量的动态扩展
- 已删除的文件将保留一段可配置的时间(文件系统级别的“垃圾桶”)
- 文件的一致快照,即使文件正在被写入/访问
MooseFS由四个部分组成:
- 管理服务器(master server)——在MooseFS one机器中,在MooseFS Pro any中
管理整个文件系统、为每个文件存储元数据(infor-)的机器的数量关于文件大小、属性和文件位置的信息,包括所有不定期的信息文件,即目录、套接字、管道和设备)。
- 元数据服务器(chunk server)——存储文件数据并在它们之间进行同步的任意数量的普通服务器(如果某个文件应该存在于多个ecopy中)。
- 元数据备份服务器(metalogger服务器)——任意数量的服务器,所有这些服务器都存储元数据更改日志并定期下载主元数据文件。当master损坏是,可以从日志服务器中取得文件进行恢复。
在MooseFS(非pro)中,如果主主机发生故障,则带有金属记录器的机器可以很容易地设置为主机。
- 客户端——使用mfsmount进程与管理服务器通信(接收和修改文件元数据)的任意数量的计算机,以及与chunkservers通信(交换实际的文件数据)的计算机。可以像挂载 nfs 一样挂载 mfs
工作原理
读:
写:
安装配置
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
测试访问:
此时没有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
格式化:
[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
启动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端我们可以看见:
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
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
[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界面:
打标签需要先修改配置文件:
( 类型: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服务器上
可以看到我们的设定
处理异常
异常关闭后无法开启
我们先在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
我们的文件就又回来了
推荐阅读
-
MooseFS分布式文件系统的安装部署应用
-
hadoop 2.6.0 伪分布式部署安装的实例教程
-
python django框架中使用FastDFS分布式文件系统的安装方法
-
Ubuntu Docker 的安装部署及简单应用
-
python django框架中使用FastDFS分布式文件系统的安装方法
-
Ubuntu Docker 的安装部署及简单应用
-
Hadoop分布式文件系统HDFS的安装
-
MFS(moosefs)分布式文件系统最简单的搭建
-
大型网站分布式架构(二)—— Linux下Tomcat的安装和项目部署
-
GlusterFS的分析与应用【毕业论文】 GlusterFS分布式文件系统HDFS弹性hash算法