准备工作
安装
参考 文档。根据 MooseFS(MFS) 的架构,大体上包含如下几种组件:
- Master Server:主服务器。用来存储和生成元数据,控制文件的存储和读取。
- Chunkserver:存储服务器。用来存储文件,需要与 Master Servers 交互。默认情况下,Chunkserver 以服务器为单元,而不是以磁盘为单元,即多块磁盘会被打包进一个 Chunkserver 中。
- Metalogger:元数据备份服务器。定时备份 Master Servers,用于容灾恢复。
- Client:客户端。用于挂载 MFS 文件系统。
截至该文发布位置,Ubuntu24.04 的官方库中 MooseFS 的版本为 3.x,需要加入新的库:
1
2
3
4
|
curl https://repository.moosefs.com/moosefs.key | gpg -o /etc/apt/keyrings/moosefs.gpg --dearmor
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/moosefs.gpg] http://repository.moosefs.com/moosefs-4/apt/ubuntu/noble noble main" > \
/etc/apt/sources.list.d/moosefs.list
apt update
|
然后对于不同的组件安装不同的应用程序:
1
2
3
4
5
6
7
8
|
# Master Servers
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
|
设置 DNS
参考 文档,由于搭建个人的分布式 MFS 系统,服务器数量通常不是很多,我们直接修改 /etc/hosts
:
1
2
3
4
5
|
127.0.0.1 localhost
xx.xx.xx.xx mfsmaster
xx.xx.xx.xx mfsnas0
xx.xx.xx.xx mfsnas1
...
|
其中 mfsmaster 为 Master Server,mfsnas* 为 Chunkserver。更新 hosts 后,执行 ping mfsmaster
或 ping mfsnas*
来测试是否生效:
1
2
3
4
5
6
|
$ ping mfsnas1
PING mfsnas1 (10.177.31.35) 56(84) bytes of data.
64 bytes from mfsnas1 (10.177.31.35): icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from mfsnas1 (10.177.31.35): icmp_seq=2 ttl=64 time=0.187 ms
64 bytes from mfsnas1 (10.177.31.35): icmp_seq=3 ttl=64 time=0.170 ms
...
|
注意
在实际使用中,应该只有 mfsmaster 一行是必须的。此外,也可以在不同组件的 .cfg
文件中设置 MASTER_HOST
为 IP 地址代替 DNS 设置,但这种方法只能用于单 Master Server 的情况(专业版 MFS 支持多 Master Server)。
mfsmaster
初步搭建
参考 文档,先修改配置文件:
1
2
3
|
cd /etc/mfs
cp mfsmaster.cfg.sample mfsmaster.cfg
cp mfsexports.cfg.sample mfsexports.cfg
|
其中 mfsexports.cfg
用来控制不同 IP 挂载 MFS 文件系统的权限,使用默认规则即可;mfsmaster.cfg
用来设置 Master Server 的启动项,同样使用默认即可。注意 SYSLOG_IDENT
属性值为 mfsmaster
,和 DNS 设置相对应。
启动服务并设置开机自启:
1
2
|
mfsmaster start
systemctl enable moosefs-master.service
|
搭建 CGI 监控面板
参考 文档,安装、启动并设置开机自启:
1
2
3
4
|
apt install moosefs-cgiserv
apt install moosefs-cgi
mfscgiserv start
systemctl enable moosefs-cgiserv.service
|
此时,可以在浏览器中输入 http://<IP>:9425 查看监控面板。
mfschunckserver
初步搭建
假设对于存储服务器 mfsnas1,有两块 HDD /dev/sda
和 /dev/sdb
。我们考虑如何把他们放入一个 Chunkserver 并挂载到 mfsmaster 上。
参考 文档,先修改配置文件:
1
2
3
|
cd /etc/mfs
cp mfschunkserver.cfg.sample mfschunkserver.cfg
cp mfshdd.cfg.sample mfshdd.cfg
|
其中 mfschunkserver.cfg
为存储服务器的配置文件,包括启动项和连接设置等。需要注意属性 MASTER_HOST
是否加入 hosts 或指定为 IP 地址:
1
2
|
# MooseFS master host, IP is allowed only in single-master installations (default is mfsmaster)
# MASTER_HOST = mfsmaster
|
mfshdd.cfg
为 Chunkserver 的硬盘设置。
接下来,格式化硬盘(可以通过 lsblk
命令查看具体盘符):
1
2
|
mkfs.xfs -s size=4k /dev/sda
mkfs.xfs -s size=4k /dev/sdb
|
将挂载点写入 /etc/fstab
:
1
2
|
/dev/sda /mnt/mfschunks0 xfs defaults 0 0
/dev/sdb /mnt/mfschunks1 xfs defaults 0 0
|
创建目录,挂载并修改目录权限:
1
2
3
4
5
6
7
8
|
mkdir /mnt/mfschunks0
mkdir /mnt/mfschunks1
mount /mnt/mfschunks0
mount /mnt/mfschunks1
chown mfs:mfs /mnt/mfschunks0
chown mfs:mfs /mnt/mfschunks1
chmod 770 /mnt/mfschunks0
chmod 770 /mnt/mfschunks1
|
然后在配置文件 mfshdd.cfg
开头加入:
1
2
|
/mnt/mfschunks0
/mnt/mfschunks1
|
最后启动 Chunkserver 并设置开机自启:
1
2
|
mfschunkserver start
systemctl enable moosefs-chunkserver.service
|
此时可以在 CGI 监控面板中的 Servers 栏看到新加入的 Chunkserver。
移除硬盘
如果要移除 Chunkserver 中的硬盘 /mnt/mfschunks0
,参考 文档,我们先修改 mfshdd.cfg
:
1
2
|
*/mnt/mfschunks0
/mnt/mfschunks1
|
表示将该硬盘上的块转移到其他 Chunkserver 上。注意,如果只有一台 Chunkserver,则需要修改 mfshdd.cfg
为:
1
2
|
</mnt/mfschunks0
/mnt/mfschunks1
|
这表示将该硬盘上的块转移到同 Chunkserver 的其他 HDD 上。
重启服务:
此时可以在 CGI 中的 Disks 中看到硬盘状态变为 marked for removal(not ready)
并在后台开始将该盘的 chunck 转移到其他 Chunkserver 或其他 HDD 上。等待转移完成后删除 mfshdd.cfg
包含 /mnt/mfschunks0
的行。最后重启服务并卸载硬盘即可。
1
2
|
mfschunkserver reload
umount /mnt/mfschunks0
|
此时,可以查看 CGI 中的 Disks 栏,没有硬盘 /mnt/mfschunks0
。
拆分 Chunkserver
对于一台个人服务器,通常来说只是一台 Chunkserver。而当我们需要组建 EC@4+1 或 EC@8+1 时,需要多个 Chunkserver,这是不现实的。我们考虑对 Chunkserver 进行拆分,将每块硬盘设置成一个 Chunkserver。我们以上述 /mnt/mfschunks0
和 /mnt/mfschunks1
为例。
先复制之前的配置文件:
1
2
3
4
|
cp mfschunkserver.cfg mfschunkserver0.cfg
cp mfschunkserver.cfg mfschunkserver1.cfg
cp mfshdd.cfg mfshdd0.cfg
cp mfshdd.cfg mfshdd1.cfg
|
在 mfshdd0.cfg
和 mfshdd1.cfg
中加入硬盘 /mnt/mfschunks0
和 /mnt/mfschunks1
。修改 mfschunkserver0.cfg
中的部分配置:
1
2
3
|
DATA_PATH = /var/lib/mfs0
HDD_CONF_FILENAME = /etc/mfs/mfshdd0.cfg
CSSERV_LISTEN_PORT = 9520
|
创建目录 /var/lib/mfs0
并设置权限:
1
2
3
|
mkdir /var/lib/mfs0
chown mfs:mfs /var/lib/mfs0
chmod 770 /var/lib/mfs0
|
启动服务:
1
2
|
mfschunkserver -c /etc/mfs/mfschunkserver0.cfg start
mfschunkserver -c /etc/mfs/mfschunkserver1.cfg start
|
此时,可以看到 CGI 的 Serves 栏出现两台 Chunkserver。对于开机自启,在 /etc/rc.local
中写入:
1
2
|
/usr/sbin/mfschunkserver -c /etc/mfs/mfschunkserver0.cfg start
/usr/sbin/mfschunkserver -c /etc/mfs/mfschunkserver1.cfg start
|
参考 文档,修改文件 /etc/mfs/mfsmetalogger.cfg
,注意以下两个属性值:
1
2
|
SYSLOG_IDENT = mfsnas0
MASTER_HOST = mfsmaster
|
启动服务并设置开机启动:
1
2
|
mfsmetalogger start
systemctl enable moosefs-metalogger.service
|
此时,在 CGI 面板的 Serves 栏可以看见 mfsnas0 作为 Metadata backup loggers。
mfsclient
参考 文档,安装依赖包:
1
|
apt install fuse libfuse2
|
创建挂载点并挂载:
1
2
|
mkdir -p /mnt/mfs
mfsmount /mnt/mfs -H mfsmaster
|
此时可查看 MFS 文件系统:
1
2
|
# df -h | grep mfs
mfsmaster:9421 102T 4.5T 98T 5% /mnt/mfs
|
设置开机自启,在 /etc/rc.local
中写入:
1
|
/usr/bin/mfsmount /mnt/mfs -H <IP>
|
警告
在很多情况下 docker 会使用到 MFS 挂载的目录,此时,需要保证 MFS 的挂载在 docker 服务启动之前。创建挂载启动项:
1
|
nano /etc/systemd/system/mfsmount.service
|
加入:
1
2
3
4
5
6
7
8
9
10
11
12
|
[Unit]
Description=MooseFS Mount Service
After=network-online.target
RequiresMountsFor=/mnt/mfs
[Service]
Type=oneshot
ExecStart=/usr/bin/mfsmount /mnt/mfs -H <IP>
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
|
注意如果同时是 Master Server 节点,则需要写成:
1
|
After=network-online.target moosefs-master.service
|
设置 service 自启并找到 docker 启动项位置:
1
2
|
systemctl enable mfsmount.service
find /etc/systemd/system/ /lib/systemd/system/ -name docker.service
|
修改 [Unit]
的 After
属性:
1
|
After=network-online.target docker.socket firewalld.service containerd.service time-set.target mfsmount.service
|
设置 Storage Class
MooseFS4.x 已经支持 Erasure Codes(EC)的设置,可以代替 mdadm 组软 raid5 的方法:

参考 discussions,挂载 MFS 的目录为 /mnt/mfs
,那么:
1
2
|
mfsscadmin create -K 2 -A @8+1 -d 1 ec81
mfssetsclass -r ec81 /mnt/mfs/my_ec81_folder
|
此处设置 KEEP_LABEL 下为 COPY 1+1
,ARCHIVE_LABEL 下为 EC@8+1
,文件将在 1 小时后从 KEEP_LABEL 变为 ARCHIVE_LABEL。在 CGI 中显示:

注意 EC@8+1 至少需要 9 台 Chunkserver。