MooseFS4.x 搭建全流程

准备工作

安装

参考 文档。根据 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 mfsmasterping 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 上。

重启服务:

1
mfschunkserver reload

此时可以在 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.cfgmfshdd1.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

mfsmetalogger

参考 文档,修改文件 /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 的方法:

github

参考 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 中显示:

CGI

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

0%