Raspberry Pi 4 终于到手了。折腾开始!今天我们折腾MooseFS文件系统!
MooseFS是具有冗余容错功能的分布式文件系统,简称MFS,它可以把数据存储在多个节点上,确保一份数据多个备份副本,保证数据的安全可靠。
。
1.MFS的架构和特点
1.1 MFS文件系统结构
MFS文件系统中包括4种角色:
Master:管理节点,负责各个数据存储服务器的管理、文件读写、文件空间回收以及恢复、多节点拷贝等。
Metalogger:元数据日志服务器,可以认为是Master的备份节点,负责备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,在Master节点出问题的时候替代Master节点工作。
Chunkserver:数据存储服务器,负责连接Master,并由Master调度,并提供 存储空间。
Client:客户端,通过fuse接口挂载Master上所管理的Chunkservers,挂载后的访问类似于本地文件系统。
Metalogger,Chunkserver,Client都需要连接到Master上,Master是MFS系统的挂载入口。从这个架构,我们可以看到MFS系统的访问都需要通过Master节点,系统庞大时可能会出现单点故障。
1.2 MFS文件系统的特点
- 基于IP地址和密码的访问控制
- 高可靠性,数据可以在多个Chunkserver上存储多个副本
- 容量动态扩展,可以动态添加Chunkserver
- 有回收站功能,可以在设定的过期时间内恢复删除的文件
2.MFS文件系统搭建
2.1 安装MFS
MFS文件系统适配了Ubuntu、Debian、CentOS、MacOS、Raspbian等操作系统,针对这些操作系统都做了优化。安装方式可以参考MFS官网https://moosefs.com/download/,下面我们就来实际操作一下。
由于只有一台Raspberry Pi,所以我们就把MFS的所有节点都搭建在这台Raspberry Pi上。
MFS官网https://moosefs.com/download/上有针对Raspbian 8和9的安装指导,我们先确定一下Raspberry Pi的软件版本。
pi@raspberrypi:~$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
....
Raspbain的版本是10,官方还没有对应的版本支持,我们就先安装Raspbian 9的版本。
我们按照官网上的指导按步骤操作。
下载并导入MFS的ppa的key。
pi@raspberrypi:~$ wget -O - https://ppa.moosefs.com/moosefs.key | apt-key add -
--2020-03-09 07:56:53-- https://ppa.moosefs.com/moosefs.key
正在解析主机 ppa.moosefs.com (ppa.moosefs.com)... 46.17.113.51
正在连接 ppa.moosefs.com (ppa.moosefs.com)|46.17.113.51|:443... E: This command can only be used by root.
已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1796 (1.8K) [application/pgp-keys]
正在保存至: “STDOUT”
- 0%[ ] 0 --.-KB/s 用时 0s
无法写入 “-” (断开的管道)。
出现以上错误,我们滤过错误,分两步来完成key的下载和导入。
pi@raspberrypi:~$ wget https://ppa.moosefs.com/moosefs.key
pi@raspberrypi:~$ sudo apt-key add moosefs.key
pi@raspberrypi:~$ sudo apt-key list
/etc/apt/trusted.gpg
--------------------
pub rsa2048 2012-04-01 [SC]
A0DA 38D0 D76E 8B5D 6388 7281 9165 938D 90FD DD2E
uid [ 未知 ] Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP) <[email protected]>
sub rsa2048 2012-04-01 [E]
......
pub rsa2048 2014-06-04 [SC] [有效至:2027-06-05]
0F42 5A56 8FAF F43D EA2F 6843 0427 65FC CF82 ADBA
uid [ 未知 ] MooseFS Development Team (Official MooseFS Repositories) <[email protected]>
增加apt安装MFS的source。
pi@raspberrypi:~$ sudo echo "deb http://ppa.moosefs.com/moosefs-3/apt/raspbian/stretch stretch main" > /etc/apt/sources.list.d/moosefs.list
-bash: /etc/apt/sources.list.d/moosefs.list: 权限不够
权限不够,我们直接到apt的source目录中添加文件。
pi@raspberrypi:~$ cd /etc/apt/sources.list.d
pi@raspberrypi:/etc/apt/sources.list.d$ sudo vim moosefs.list
deb http://ppa.moosefs.com/moosefs-3/apt/raspbian/stretch stretch main
pi@raspberrypi:/etc/apt/sources.list.d$ sudo apt update
然后就可以安装MFS软件啦!我们把4种角色都安装在Raspberry Pi上,安装命令参考MFS官网。
安装Master:
apt install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli
安装Chunkserver:
apt install moosefs-chunkserver
安装Metalogger:
apt install moosefs-metalogger
安装Client:
apt install moosefs-client
2.2 配置MFS
MFS安装好之后,进入配置文件目录修改各个节点的配置文件。
pi@raspberrypi:~$ cd /etc/mfs/
pi@raspberrypi:/etc/mfs$ ls
mfschunkserver.cfg mfsexports.cfg.sample mfsmaster.cfg mfsmetalogger.cfg.sample mfstopology.cfg
mfschunkserver.cfg.sample mfshdd.cfg mfsmaster.cfg.sample mfsmount.cfg mfstopology.cfg.sample
mfsexports.cfg mfshdd.cfg.sample mfsmetalogger.cfg mfsmount.cfg.sample
Master节点的配置文件有两个:mfsmaster.cfg和mfsexports.cfg,其中mfsmaster.cfg配置整个MFS系统的参数,mfsexports.cfg配置MFS系统中可挂载目录及权限。试验中不做任何修改。
Metalogger节点的配置文件是mfsmetalogger.cfg,我们只修改配置文件中Master节点的IP地址为Raspberry Pi的本机IP。
# MooseFS master host, IP is allowed only in single-master installations (default is mfsmaster)
MASTER_HOST = 192.168.1.9
Chunkserver节点的配置文件是mfschunkserver.cfg和mfshdd.cfg。其中mfschunkserver.cfg配置Chunkserver的参数,mfshdd.cfg配置挂载目录或者硬盘路径。
我们修改mfschunkserver.cfg文件中Master节点的IP地址为Raspberry Pi的本机IP。
# MooseFS master host, IP is allowed only in single-master installations (default is mfsmaster)
MASTER_HOST = 192.168.1.9
新建mfs1目录,并在mfshdd.cfg中配置为挂载目录,空间总共1GB。
/home/pi/mfs1 1GiB
这样,MFS的简单配置就完成了。
2.3 MFS系统的启动和关闭
安全启动MFS的步骤如下:
mfsmaster start #启动 Master进程
mfschunkserver start #启动 Chunkserver进程
mfsmetalogger start #启动 Metalogger进程
mfsmount #客户端挂载MFS文件系统
安全停止MFS集群的步骤是反向执行启动步骤,如下:
umount #客户端卸载MFS文件系统
mfschunkserver stop #停止 Chunkserver进程
mfsmetalogger stop #停止 Metalogger进程
mfsmaster stop #停止 Master进程
2.4 MFS的可视化监控服务
MFS在Master节点上提供了监控当前运行状态cgi服务mfscgiserv,启动后,可以通过浏览器来查看MFS的运行状态。
pi@raspberrypi:/etc/mfs$ sudo mfscgiserv start
lockfile created and locked
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/share/mfscgi)
在浏览器中访问http://192.168.1.9:9425,就可以看到MFS系统的当前状态了。
3.MFS功能操作
MFS启动完成后,我们逐步来实践MFS的挂载、读写、删除、恢复等操作。
3.1 MFS的挂载
MFS系统通过mfsmount Master节点来挂载。我们新建mfstest目录来挂载MFS。
pi@raspberrypi:~$ mkdir mfstest
pi@raspberrypi:~$ mfsmount ./mfstest/ -H 192.168.1.9
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf
error in fuse_mount
出现了错误,按照提示,修改fuse.conf。
pi@raspberrypi:~$ sudo vim /etc/fuse.conf
......
# Allow non-root users to specify the allow_other or allow_root mount options.
user_allow_other
重新挂载后,成功。用df命令也可以看到挂载成功。
pi@raspberrypi:~/mfs1$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/root 15G 11G 3.5G 75% /
......
192.168.1.9:9421 1.0G 0 1.0G 0% /home/pi/mfstest
3.2 读写操作
进入挂载目录mfstest,添加文件。
pi@raspberrypi:~/mfstest$ touch aaaa.txt
pi@raspberrypi:~/mfstest$ ls
aaaa.txt
pi@raspberrypi:~/mfstest$ vim aaaa.txt
hello MFS.
新建目录mfstest1,并再次挂载MFS。
pi@raspberrypi:~$ mkdir mfstest1
pi@raspberrypi:~$ mfsmount ./mfstest1 -H 192.168.1.9
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
pi@raspberrypi:~$ cd mfstest1
pi@raspberrypi:~/mfstest1$ ls
aaaa.txt
pi@raspberrypi:~/mfstest1$ vim aaaa.txt
hello MFS.
可以看到,测试文件写入成功。
3.3 查看文件信息
MFS中查看文件信息的命令有mfsfileinfo和mfsdirinfo。
我们先看一下文件信息。
pi@raspberrypi:~/mfstest$ ls
aaaa.txt
pi@raspberrypi:~/mfstest$ mfsfileinfo aaaa.txt
aaaa.txt:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 192.168.1.9:9422 (status:VALID)
通过文件信息,可以看到测试文件aaaa.txt在MFS系统中只有一个副本,是因为我们搭建的MFS系统中只有一个Chunkserver。当MFS系统中有多个Chunkserver时,可以通过mfssetgoal和mfsrsetgoal命令来设置文件或目录的副本数量。文件信息中还包含了副本所在Chunkserver的IP。
我们再看一下目录信息。
pi@raspberrypi:~/mfstest$ mkdir ttt
pi@raspberrypi:~/mfstest$ cd ttt
pi@raspberrypi:~/mfstest/ttt$ ls
pi@raspberrypi:~/mfstest/ttt$ touch bbbb.txt
pi@raspberrypi:~/mfstest/ttt$ vim bbbb.txt
testt
"bbbb.txt" 1L, 9C 已写入
pi@raspberrypi:~/mfstest/ttt$ ls
bbbb.txt
pi@raspberrypi:~/mfstest/ttt$ cd ..
pi@raspberrypi:~/mfstest$ ls
aaaa.txt ttt
pi@raspberrypi:~/mfstest$ mfsdirinfo ttt/
ttt/:
inodes: 2
directories: 1
files: 1
chunks: 1
length: 9
size: 73728
realsize: 147456
3.4 文件的删除和恢复
MFS有垃圾箱机制,能保证在文件删除后的隔离时间内,恢复删除文件。
MFS的默认隔离时间是24小时,也可以通过mfssettrashtime来设置,设置的时间是按照小时计算,设置的单位是秒,不满一小时就按一小时计算。
pi@raspberrypi:~$ mfsgettrashtime mfstest
mfstest: 86400
pi@raspberrypi:~$ sudo mfssettrashtime 5000 mfstest
mfstest: 5000
pi@raspberrypi:~$ mfsgettrashtime mfstest
mfstest: 7200
我们重新创建一个文件,并删除掉。
pi@raspberrypi:~/mfstest$ touch bb.txt
pi@raspberrypi:~/mfstest$ vim bb.txt
pi@raspberrypi:~/mfstest$ ls
aaaa.txt bb.txt ttt
pi@raspberrypi:~/mfstest$ rm bb.txt
pi@raspberrypi:~/mfstest$ ls
aaaa.txt ttt
删除掉的文件,通过-m参数挂载到辅助文件系统后,就可以看到。这个辅助文件系统,可以看作为MFS的垃圾箱。
pi@raspberrypi:~$ sudo umount mfstest1
pi@raspberrypi:~$ mfsmount -m mfstest1 -H 192.168.1.9
mfsmaster accepted connection with parameters: read-write,restricted_ip
pi@raspberrypi:~$ cd mfstest1
pi@raspberrypi:~/mfstest1$ ls
sustained trash
pi@raspberrypi:~/mfstest1$ find ./trash/ -name "*bb*"
./trash/012/00000012|bb.txt~
./trash/013/00000013|.bb.txt.swp
./trash/014/00000014|.bb.txt.swx
./trash/015/00000015|.bb.txt.swp
./trash/017/00000017|bb.txt
在垃圾箱中,可以找到删除掉的bb.txt文件,只要把找到的文件移动到同级目录下的undel目录即可恢复。
pi@raspberrypi:~/mfstest1$ cd trash/017
pi@raspberrypi:~/mfstest1/trash/017$ ls
'00000017|bb.txt' undel
pi@raspberrypi:~/mfstest1/trash/017$ mv 00000017\|bb.txt ./undel/
pi@raspberrypi:~/mfstest1/trash/017$ ls
undel
回到mfstest目录,可以看到删除的文件已经恢复。
pi@raspberrypi:~/mfstest$ ls
aaaa.txt bb.txt ttt
4.小结
到此为止,我们在Raspberry Pi上熟悉了MFS的搭建和基本操作,由于常用的文件读写性能测试工具IOZone没有Raspberry Pi的版本,因此性能测试没有完成。另外,由于是单台机器搭建了所有的MFS节点,性能测试的意义不大,后续我们会搭建多节点的MFS系统,并进行读写性能的测试,请大家持续关注!
5.参考资料:
https://moosefs.com/download/