一、搭建MooseFS分布式文件系统
什么是MooseFS?
MooseFS(Moose File System)是一个开源的、分布式的、容错的网络文件系统,它将数据分散存储在多个物理服务器上,但对用户呈现为单一的文件系统。MooseFS具有以下核心特性:
-
高可用性:支持主服务器(Master Server)的高可用配置,确保服务不中断
-
数据冗余:通过副本机制保证数据安全,即使部分存储服务器故障也不会丢失数据
-
容量扩展:可以轻松添加新的存储节点来扩展系统容量
-
POSIX兼容:提供标准的文件系统接口,兼容大多数Linux应用程序
-
实时快照:支持文件系统的实时快照功能
1.1MooseFS采用经典的Master-Chunkserver-Client架构:
Master Server:管理整个文件系统的元数据(文件名、目录结构、文件属性等)
Chunkserver:存储实际的文件数据块,可以有多个节点
Client:通过FUSE(Filesystem in Userspace)挂载MooseFS,像使用本地文件系统一样访问
本文将通过实际部署案例,详细介绍在RedHat/CentOS系统上搭建MooseFS集群的完整步骤。
准备四台主机,第一台作为Master Servers;二三作为Chunkservers;第四台作为Clients。
1.1 添加 MooseFS 仓库与组件
在开始安装 MooseFS 之前,需要在所有四台主机上配置官方的软件仓库并导入 GPG 密钥。请依次执行以下步骤:
cs
# 1. 导入 MooseFS 官方 GPG 密钥
[root@server1 ~]# curl "https://repository.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1796 100 1796 0 0 491 0 0:00:03 0:00:03 --:--:-- 491
2. 添加 MooseFS 官方 YUM 仓库配置文件
[root@server1 ~]# curl "http://repository.moosefs.com/MooseFS-4-el9.repo" > /etc/yum.repos.d/MooseFS.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 176 100 176 0 0 229 0 --:--:-- --:--:-- --:--:-- 229
完成上述操作后,请在每台主机的 /etc/hosts 文件中添加以下解析记录,确保主机名 server1 能够正确映射到 Master 服务器的 IP 地址:
cs
# 3. 配置主机名解析(在所有四台主机上执行)
# 编辑 /etc/hosts 文件,添加如下行
192.168.223.146 server1 master
1.2 安装图形界面和CLI
接下来,我们需要在四台主机上分别安装 MooseFS 的核心组件。请根据每台主机的角色,执行对应的安装命令:
cs
# 在 Master 服务器(server1)上安装主服务、Web 图形界面和命令行工具
[root@server1 yum.repos.d]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli
在 Chunkserver 服务器(server2 和 server3)上安装数据块服务
[root@server2 ~]# yum install moosefs-chunkserver
[root@server3 ~]# yum install moosefs-chunkserver
在 Client 服务器(server4)上安装客户端工具
[root@server4 ~]# yum install moosefs-client
安装完成后,在 Master 服务器上启动 MooseFS 主服务和图形界面服务,并设置为开机自启:
cs
# 启动并启用 MooseFS Master 服务
[root@server1 yum.repos.d]# systemctl enable --now moosefs-master
Created symlink /etc/systemd/system/multi-user.target.wants/moosefs-master.service → /usr/lib/systemd/system/moosefs-master.service.
启动并启用 MooseFS 图形界面服务
[root@server1 yum.repos.d]# systemctl enable --now moosefs-gui
Created symlink /etc/systemd/system/multi-user.target.wants/moosefs-gui.service → /usr/lib/systemd/system/moosefs-gui.service.

1.3 MooseFS Chunkservers 挂载
在 MooseFS 集群中,Chunkserver 负责存储实际的文件数据块。为了提供可靠的存储空间,我们需要为每个 Chunkserver 节点添加专用磁盘并完成挂载配置。以下以 server2 为例,详细说明操作步骤,server3 的操作与之相同。
cs
# 为 server2 和 server3 各添加一块 20GB 的新磁盘
[root@server2 ~]# fdisk -l
Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x838f615c
Device Boot Start End Sectors Size Id Type
/dev/nvme0n1p1 * 2048 2099199 2097152 1G 83 Linux
/dev/nvme0n1p2 2099200 41943039 39843840 19G 8e Linux LVM
cs
# 对新磁盘进行分区、格式化并挂载
[root@server2 ~]# fdisk /dev/nvme0n2
[root@server2 ~]# mkfs.xfs /dev/nvme0n2p1
meta-data=/dev/nvme0n2p1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@server2 ~]# mkdir /mnt/ssd01
[root@server2 ~]# vim /etc/fstab
UUID="c98f28d4-27e0-44d0-9e35-cb55e7ad86f4" /mnt/ssd01 xfs defaults 0 0
[root@server2 ~]# systemctl daemon-reload
[root@server2 ~]# mount -a
[root@server2 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4096 0 4096 0% /dev
tmpfs 1855076 0 1855076 0% /dev/shm
tmpfs 742032 9120 732912 2% /run
/dev/mapper/rl-root 17756160 1560468 16195692 9% /
/dev/nvme0n1p1 983040 248000 735040 26% /boot
tmpfs 371012 0 371012 0% /run/user/0
/dev/nvme0n2p1 20904960 178804 20726156 1% /mnt/ssd01
[root@server2 ~]# chown mfs.mfs /mnt/ssd01/
[root@server2 ~]# ll -d /mnt/ssd01/
drwxr-xr-x. 2 mfs mfs 6 Aug 19 18:58 /mnt/ssd01/
[root@server2 ~]# systemctl enable --now moosefs-chunkserver
Created symlink /etc/systemd/system/multi-user.target.wants/moosefs-chunkserver.service → /usr/lib/systemd/system/moosefs-chunkserver.service.
cs
# 配置 MooseFS Chunkserver 使用新挂载的磁盘
[root@server2 ~]# vim /etc/mfs/mfshdd.cfg
/mnt/ssd01
[root@server2 ~]# systemctl reload moosefs-chunkserver

cs
# 验证 Chunkserver 存储目录
[root@server2 ~]# cd /mnt/ssd01/
[root@server2 ssd01]# ls | wc -l
256
1.4 在 server3 上重复上述步骤,完成磁盘添加、格式化、挂载以及 MooseFS Chunkserver 的配置。
1.4 MooseFS 客户端挂载
在 Master 服务器和 Chunkserver 节点配置完成后,最后一步是在客户端(server4)上挂载 MooseFS 文件系统。客户端通过 FUSE(Filesystem in Userspace)将远程的 MooseFS 挂载到本地目录,从而像访问本地文件系统一样使用分布式存储。
首先,编辑 MooseFS 客户端配置文件,启用默认挂载点:
cs
[root@server4 ~]# vim /etc/mfs/mfsmount.cfg
# 取消 /mnt/mfs 行的注释,使其生效
# 原配置行示例:
# /mnt/mfs mfsmaster=server1
# 取消注释后:
/mnt/mfs mfsmaster=server1
接着,创建挂载目录并执行挂载命令:
cs
[root@server4 ~]# mkdir /mnt/mfs
[root@server4 ~]# mfsmount
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root ; sclass groups allowed: ALL
挂载成功后,使用 df -h 命令查看文件系统状态,确认 MooseFS 已正常挂载:
cs
[root@server4 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4096 0 4096 0% /dev
tmpfs 1855072 0 1855072 0% /dev/shm
tmpfs 742032 9104 732928 2% /run
/dev/mapper/rl-root 17756160 1574160 16182000 9% /
/dev/nvme0n1p1 983040 248000 735040 26% /boot
tmpfs 371012 0 371012 0% /run/user/0
mfs#mfsmaster:9421 41809920 882240 40927680 3% /mnt/mfs
从输出可见,MooseFS 文件系统(mfs#mfsmaster:9421)已成功挂载到 /mnt/mfs,总容量约 40GB,已使用约 3%。


至此,一个包含 Master、Chunkserver 和 Client 的完整 MooseFS 分布式文件系统集群已搭建完成。
二、创建存储类 hot_1cp并应用
cs
[root@server4 ~]# cd /mnt/mfs
[root@server4 mfs]# mkdir dir1
[root@server4 mfs]# mkdir dir2
[root@server4 mfs]# ls
dir1 dir2
[root@server4 mfs]# mfslistsclass
2CP
3CP
EC4+1
EC8+1
[root@server4 mfs]# mfssclass get dir1/
dir1/: 2CP
cs
[root@server4 mfs]# cd dir1/
[root@server4 dir1]# cp /etc/passwd .
[root@server4 dir1]# ls
passwd
[root@server4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) ; mtime:1787140142 (2026-08-19 19:49:02)
copy 1: 192.168.223.147:9422 ; status:VALID
copy 2: 192.168.223.148:9422 ; status:VALID
[root@server4 dir1]# mfsscadmin create -K 1* hot_1cp
storage class make hot_1cp: ok
[root@server4 dir1]# mfsscadmin list
2CP
3CP
EC4+1
EC8+1
hot_1cp
[root@server4 dir1]# mfssetsclass -r hot_1cp .
.:
inodes with storage class changed: 2
inodes with storage class not changed: 0
inodes with permission denied: 0
[root@server4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) ; mtime:1787140142 (2026-08-19 19:49:02)
copy 1: 192.168.223.147:9422 ; status:VALID
[root@server4 dir1]# mfssclass get passwd
passwd: hot_1cp
MooseFS 带 Chunkserver 标签 (LABELS) 的存储类实验
MooseFS 支持为 Chunkserver 节点设置标签(LABELS),这允许我们创建更精细的存储策略。通过标签,可以将文件数据定向存储到具有特定标签的 Chunkserver 上,从而实现数据隔离、性能优化或成本分级。以下实验演示如何为 Chunkserver 配置标签并创建基于标签的存储类。
1. 为 Chunkserver 配置标签
在 Chunkserver 节点(例如 server2)上,编辑其配置文件 /etc/mfs/mfschunkserver.cfg,添加 LABELS 参数:
cs
[root@server2 ssd01]# vim /etc/mfs/mfschunkserver.cfg
LABELS = A
[root@server2 ssd01]# systemctl reload moosefs-chunkserver
配置完成后,重启 MooseFS Chunkserver 服务使标签生效。
1. 创建基于标签的存储类
在客户端(server4)上,使用 mfsscadmin create -K <标签> 命令创建仅使用特定标签 Chunkserver 的存储类。例如,创建一个名为 1CP_A 的存储类,要求数据副本仅存储在标签为 A 的 Chunkserver 上:
cs
[root@server4 mfs]# mfsscadmin create -K A 1CP_A
storage class make 1CP_A: ok
创建成功后,可以使用 mfssclass set -r 1CP_A <目录> 将指定目录的存储类设置为 1CP_A:
cs
[root@server4 mfs]# mfssclass set -r 1CP_A dir1/
dir1/:
inodes with storage class changed: 2
inodes with storage class not changed: 0
inodes with permission denied: 0
- 验证存储类生效
设置完成后,检查目录的存储类是否已更新:
cs
[root@server4 mfs]# mfssclass get dir1/
dir1/: 1CP_A
查看目录中的文件(例如之前复制的 passwd 文件)的存储详情,确认其数据块仅存储在标签为 A 的 Chunkserver(即 server2)上:
cs
[root@server4 dir1]# ls
passwd
[root@server4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1) ; mtime:1787140142 (2026-08-19 19:49:02)
copy 1: 192.168.223.147:9422 ; status:VALID
输出显示该文件的数据块副本仅存在于 IP 为 192.168.223.147(即 server2)的 Chunkserver 上,符合标签 A 的存储策略。
通过以上步骤,我们成功实现了基于 Chunkserver 标签的存储类配置。这为数据存储提供了更灵活的控制能力,例如可以将高性能磁盘的节点标记为"SSD"标签,创建对应的存储类用于存放热数据;或将大容量机械硬盘节点标记为"HDD"标签,用于存放冷数据。
三、MooseFS分布式文件系统删除机制
MooseFS 的删除机制是其数据管理的重要组成部分,它采用了一种延迟删除与垃圾回收相结合的策略,既保证了数据安全,又提高了存储空间的利用率。理解这一机制对于日常运维和故障恢复至关重要。
3.1 查看回收时间
cs
# 查看当前垃圾回收时间设置(单位:秒)
[root@server4 mnt]# cd /mnt/meta
[root@server4 meta]# ls
sustained trash
[root@server4 trash]# mfsgettrashretention /mnt/mfs/dir1
/mnt/mfs/dir1: 24 (1d)
3.3 文件恢复与快照
MooseFS 提供了强大的文件恢复能力:
重要提示 :在垃圾回收期内的文件可以通过
.snapshot目录访问和恢复。每个挂载点下都有一个隐藏的.snapshot目录,其中包含:
trash:存放已删除但未过期的文件
trashcan:存放已删除且已过期的文件(仅当启用快照功能时)
archive:存放手动创建的快照
恢复已删除文件的步骤:
cs
1. 查看回收站中的文件,删除文件
[root@server4 ~]# ls -la /mnt/mfs/.snapshot/trash/
[root@server4 trash]# cd /mnt/mfs/dir1
[root@server4 dir1]# ls
passwd
[root@server4 dir1]# rm -f passwd
2. 恢复文件到原目录
[root@server4 dir1]# cd -
/mnt/meta/trash
[root@server4 trash]# find -name *passwd*
./004/00000004|dir1|passwd
[root@server4 trash]# mv ./004/00000004\|dir1\|passwd undel/
3. 验证文件已恢复
[root@server4 ~]# ls /mnt/mfs/dir1/
passwd
总结:MooseFS 的删除机制通过延迟删除和垃圾回收,在数据安全与存储效率之间取得了良好平衡。管理员应充分理解这一机制,合理配置相关参数,并建立定期监控和快照策略,以确保分布式文件系统的稳定运行和数据可靠性。
