实验环境:
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 客户端
MooseFS是一个容错的分布式文件系统。它将数据分散到多个物理位置(服务器),用户可以将这些位置(服务器)看作一个资源。
比如用户要上传10G的资源,对于用户本身和服务器来说都是不友好的,所以可以把它分成10个1G的资源,这样就方便快捷多了,但实际还是一个资源。系统将这些资源的链接集成到一个共享文件夹内,这样用户就可以在一个文件夹内看到所有的资源了。
对于标准文件操作,MooseFS充当任何其他类似unix的文件系统:
MooseFS的显著特征是:
MooseFS由四个部分组成:
管理整个文件系统、为每个文件存储元数据(infor-)的机器的数量关于文件大小、属性和文件位置的信息,包括所有不定期的信息文件,即目录、套接字、管道和设备)。
在MooseFS(非pro)中,如果主主机发生故障,则带有金属记录器的机器可以很容易地设置为主机。
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
格式化:
[root@server2 ~]# 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
创建挂载点:
[root@server2 ~]# mkdir /mnt/chunk1
[root@server2 ~]# mount /dev/sdb1 /mnt/chunk1/ 挂载
[root@server2 ~]# chown mfs.mfs /mnt/chunk1/ 修改权限
再配置文件中更改挂载点:
[root@server2 ~]# vim /etc/mfs/mfshdd.cfg
[root@server2 ~]# systemctl start moosefs-chunkserver
[root@server2 ~]# 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中:
/分区下的空间还很大。所以这里使用根分区。
[root@server3 ~]# mkdir /mnt/chunk2
[root@server3 ~]# vim /etc/mfs/mfshdd.cfg 里面设置为 /mnt/chunk2
[root@server3 ~]# chown mfs.mfs /mnt/chunk2/
[root@server3 ~]# systemctl start moosefs-chunkserver
我们在server6上安装客户端:
[root@server6 ~]# yum install moosefs-client-3.0.113-1.rhsystemd.x86_64.rpm -y
[root@server6 ~]# vim /etc/hosts 添加server1 mfsmaster的解析
[root@server6 ~]# mkdir /mnt/mfs 建立目录 mfs的挂载目录
[root@server6 ~]# vim /etc/mfs/mfsmount.cfg
[root@server6 ~]# mfsmount 挂载
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@server6 ~]# 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
[root@server6 ~]# cd /mnt/mfs/
[root@server6 mfs]# mkdir dir1 # 建立两个子目录
[root@server6 mfs]# mkdir dir2
[root@server6 mfs]# ls
dir1 dir2
[root@server6 mfs]# mfsgetgoal dir1/ 获取备份数目,因为有server2 和3 两台chunk服务器,所以为2
dir1/: 2
[root@server6 mfs]# mfsgetgoal dir2/
dir2/: 2
[root@server6 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
[root@server6 mfs]# mfsgetgoal dir1/
dir1/: 1
我们现在拷贝一份文件进去(写):
[root@server6 mfs]# cp /etc/passwd dir1
[root@server6 mfs]# cp /etc/group dir2
[root@server6 mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) 只有一个备份在server3上
copy 1: 172.25.254.3:9422 (status:VALID)
[root@server6 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:
[root@server3 ~]# systemctl stop moosefs-chunkserver
在server6查看:
[root@server6 mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) ## 看不了了,因为数据存放在server3
no valid copies !!!
[root@server6 mfs]# mfsfileinfo dir2/group
dir2/group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.254.2:9422 (status:VALID) ## 还有server2的一份数据可以查看
[root@server6 mfs]# cat dir1/passwd
^C ## 查看的时候就会卡到这里
[root@server6 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服务就可以看到了
[root@server3 ~]# systemctl start moosefs-chunkserver
[root@server6 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:
[root@server4 mnt]# yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
[root@server4 mnt]# mkdir /mnt/chunk3
[root@server4 mnt]# chown mfs.mfs /mnt/chunk3/
[root@server4 mnt]# vim /etc/mfs/mfshdd.cfg
# 最后一行加上 /mnt/chunk3
[root@server4 mnt]# systemctl start moosefs-chunkserver
server5:
[root@server5 mnt]# yum install moosefs-chunkserver-3.0.113-1.rhsystemd.x86_64.rpm -y
[root@server5 mnt]# mkdir /mnt/chunk4
[root@server5 mnt]# chown mfs.mfs /mnt/chunk4/
[root@server5 mnt]# vim /etc/mfs/mfshdd.cfg
# 最后一行加上 /mnt/chunk4
[root@server5 mnt]# systemctl start moosefs-chunkserver
打标签需要先修改配置文件:
( 类型: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标签的服务器上
设置四种存储类: 必须在工作目录中进行
在客户端
[root@server6 mfs]# mfsscadmin create 2A class2A 两个都存在A上
storage class make class2A: ok
[root@server6 mfs]# mfsscadmin create 2B class2B 两个都存在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标签 的chunk上。
storage class make classASBH: ok
[root@server6 mfs]# mfsscadmin list
1
2
3
4
5
6
7
8
9
class2A
class2B
classAB
classASBH
[root@server6 mfs]# mkdir dir1 dir2
[root@server6 mfs]# ls
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下的存储到A上
dir1:
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下的存储到B上
dir2:
inodes with storage class changed: 2
inodes with storage class not changed: 0
inodes with permission denied: 0
[root@server6 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服务器上。
更改一下:
[root@server6 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
[root@server6 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
比如创建文件的时候可以进行设定,参数:
[root@server6 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时,会产生一个文件:
[root@server1 3.0.113]# cd /var/lib/mfs/
[root@server1 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 结尾的文件。
我们正常关闭时:
[root@server1 mfs]# systemctl stop moosefs-master.service
[root@server1 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的结尾
当我们不正常关闭时:
[root@server1 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
[root@server1 mfs]# kill -9 13929
[root@server1 mfs]# ps ax |grep mfsmaster
13936 pts/0 S+ 0:00 grep --color=auto mfsmaster
[root@server1 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:
[root@server1 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参数:
[root@server1 mfs]# mfsmaster start -a
[root@server1 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
[root@server1 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
这个文件还在,于是我们去启动脚本中更改:
[root@server1 mfs]# vim /usr/lib/systemd/system/moosefs-master.service;
ExecStart=/usr/sbin/mfsmaster start -a # 给这一行加上-a 参数
[root@server1 mfs]# systemctl daemon-reload # 重新加载守护进程
[root@server1 mfs]# systemctl start moosefs-master # 可以开启了
[root@server1 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
[root@server1 mfs]# systemctl stop moosefs-master.service # 再次关闭
[root@server1 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上在重新挂载上:
[root@server6 ~]# mfsmount
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
然后删除一个工作目录中的文件
[root@server6 ~]# cd /mnt/mfs/dir1
[root@server6 dir1]# ls
file1
[root@server6 dir1]# rm -fr file1
然后去从垃圾箱中获取:
[root@server6 dir1]# mfsgettrashtime /mnt/mfs/dir1/ 获取垃圾箱最大存放时间
/mnt/mfs/dir1/: 86400
[root@server6 dir1]# mkdir /mnt/mfsmeta 建立恢复目录
[root@server6 dir1]# mfsmount -m /mnt/mfsmeta/ 挂载,用df时看不到的,因为时垃圾箱,可以用mount命令查看
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@server6 dir1]# cd /mnt/mfsmeta/
[root@server6 mfsmeta]# ls
sustained trash 进入我们就可以看到两个目录,我们的文件就存放在trash目录中
[root@server6 mfsmeta]# cd trash/
[root@server6 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
[root@server6 trash]# cd 00E/
[root@server6 00E]# ls
0000000E|dir1|file1 undel
[root@server6 00E]# mv 0000000E\|dir1\|file1 undel/ 把我们的文件放到undel目录中去,就是不删除,相当于wimdows的恢复
[root@server6 00E]# cd /mnt/mfs/dir1/
[root@server6 dir1]# ls
file1
[root@server6 dir1]# cat file1
asdasjdasdaskjdasdasd
我们的文件就又回来了