MooseFS 分布式存储系统实战笔记

📅 2026/8/24 14:05:41
MooseFS 分布式存储系统实战笔记
MooseFS 分布式存储系统实战笔记面向人群存储系统初学者已掌握 Linux 基础命令希望从零搭建 MooseFS 分布式存储集群。实验环境Rocky Linux 9多台服务器server1 ~ server4IP 段 192.168.88.x零、前置知识0.1 什么是分布式文件系统分布式文件系统Distributed File SystemDFS是一种将物理存储资源分散在多台独立服务器上通过网络连接为用户提供统一文件访问接口的存储系统。简单来说用户看到的是一个完整的文件目录树而背后的文件数据实际上分布存储在多台物理机器上。0.2 为什么需要分布式文件系统传统的单机文件系统受限于单台服务器的存储容量、I/O吞吐量和可靠性。当数据量达到TB甚至PB级别时单机方案面临以下瓶颈容量瓶颈单台服务器能挂载的磁盘数量有限性能瓶颈单台服务器的网络带宽和磁盘I/O有限单点故障服务器宕机将导致所有数据不可用扩展困难更换更大容量的服务器需要数据迁移分布式文件系统通过将数据分散到多台服务器上同时解决了上述问题。0.3 核心设计思路元数据与数据分离分布式文件系统普遍采用元数据与数据分离的架构元数据Metadata描述文件是什么——包括文件名、目录结构、权限、大小、以及文件数据块存储在哪些服务器上等信息数据Data文件的实际内容这种分离设计使得元数据服务器可以高效地处理大量文件的寻址请求而数据服务器专注于高吞吐量的数据读写。一、MooseFS 简介1.1 什么是 MooseFSMooseFS 是一款软件定义的分布式存储系统。它的核心思想是将多台普通 x86-64 服务器的存储资源聚合成一个统一的、巨大的存储池对使用者来说就像一个单一的、容量近乎无限的文件系统。它最早于2008年发布经过多年发展已从最初的分布式文件系统演变为支持块设备、API等多种数据访问方式的综合存储平台。1.2 核心功能与特性MooseFS 具备一系列强大功能使其适用于从开发测试到关键任务生产的多种场景兼容POSIX应用无缝迁移它完全兼容POSIX标准支持层级目录结构、文件权限、ACL、软/硬链接以及跨客户端的文件锁。这意味着现有应用无需修改代码就能像操作本地文件系统一样直接使用。高可靠与容错这是其核心优势之一。文件数据会自动在多个物理服务器上保存多个副本。当某个服务器或磁盘出现故障时系统能自动检测并修复确保数据不丢失、服务不中断。在MooseFS 4.x版本中还引入了**纠删码Erasure Coding**功能提供了比多副本更高效的冗余方式。近无限扩展能力其扩展性极强。单个MooseFS集群就可以扩展到1600万TB16 Exabytes的容量并能管理超过20亿个文件。扩容方式非常简单只需动态添加新的服务器或磁盘即可且扩容过程无需停机。并行高性能数据的读写操作可以并行地在多个存储节点上进行避免了单点性能瓶颈。随着集群节点的增加整体性能也能获得线性提升。数据安全与保护回收站机制删除的文件会在一段可配置的时间内保留在系统级的回收站中方便误删后恢复。快照功能支持创建文件的一致性快照即使在文件被写入时也能进行。多形态访问方式除了作为标准的POSIX文件系统挂载使用它还能作为块设备提供给虚拟机或数据库使用或通过C语言API直接访问。灵活的部署与管理支持异构硬件可以混合使用不同厂商、不同性能如SATA/SAS, SSD/HDD的服务器。滚动升级支持在不中断服务的情况下对集群的各个组件进行升级。提供监控工具内置了Web图形界面GUI和命令行工具CLI用于监控和管理集群。二、MooseFS 核心架构与四大组件MooseFS 集群由四个核心角色进程组成它们相互协作共同呈现一个统一的 POSIX 文件系统。每个角色都是一个独立的进程可以根据部署规模选择部署在同一台物理机上或分散到不同的专用节点上。2.1 Master Server元数据服务器Master Server 是 MooseFS 系统的中央大脑。职责管理文件系统的全部元数据目录树、文件名、权限、所有权、以及每个文件的数据块chunk分布在哪些 Chunkserver 上处理客户端的元数据请求打开、关闭、创建、删除文件/目录、修改属性等协调 chunk 的复制和负载均衡Master Server本身不存储任何文件内容chunk它只存储文件在哪里的信息⚠️关键理解Master Server 是集群的单点依赖。如果 Master 宕机整个文件系统将无法访问尽管数据本身还在 Chunkserver 上。因此生产环境必须为 Master 配置高可用方案如本文档中的 Pacemaker 集群或使用 MooseFS PRO 版本的多 Master 冗余方案。2.2 Chunkserver数据存储服务器Chunkserver 是 MooseFS 中真正存储文件数据的节点。职责存储、读取和写入文件 chunk管理本地磁盘空间并向 Master Server 报告容量状态在 Chunkserver 之间复制 chunk以满足配置的副本数要求当硬件或网络故障发生时参与 chunk 的恢复过程关键理解客户端读取/写入数据时直接与 Chunkserver 通信不经过 Master这大大提高了数据吞吐量并避免了 Master 成为瓶颈。2.3 Metalogger元数据日志服务器Metalogger 是一个轻量级的元数据备份服务。职责定期从 Master Server下载并存储元数据的副本快照持续记录元数据的变更日志changelog在 Master Server 故障时可以手动将 Metalogger 提升为新的 Master2.4 Client客户端客户端通过mfsmount命令将MooseFS 文件系统挂载到本地目录。工作原理mfsmount利用 FUSEFilesystem in Userspace技术拦截操作系统内核发起的文件操作请求元数据操作如打开文件、读取目录由客户端与 Master Server 通信完成实际数据读写由客户端直接与 Chunkserver 通信完成关键理解客户端看到的只是一个普通的挂载点所有分布式复杂性对用户和应用完全透明。三、关键概念解析3.1 Chunk数据块Chunk是 MooseFS 中数据存储和复制的最小单位。大文件会被按照 64MB默认的大小切分成多个 chunk每个 chunk 有一个 64 位的唯一标识符chunkID每个 chunk 独立地存储在一个或多个 Chunkserver 上小文件小于 64MB则直接作为一个独立的 chunk 存储关键理解因为文件被切分成 chunk 并分散存储所以 MooseFS 可以实现并行读写大文件的不同 chunk 可以同时从多个 Chunkserver 读取灵活冗余可以为不同目录/文件设置不同的副本数动态扩容新加入的 Chunkserver 可以立即接收新的 chunk3.2 元数据Metadata元数据是 Master Server 管理的核心信息包括从文件名到 chunk 列表的映射关系每个 chunk 的存储位置在哪些 Chunkserver 上文件的属性大小、权限、时间戳等目录结构3.3 副本Copy/Replica副本是 MooseFS 实现数据冗余的基本手段。每个 chunk 可以拥有 1 个或多个副本存储在不同的 Chunkserver 上副本数由文件的 Storage Class存储类决定Master Server 持续监控副本状态自动修复缺失或过期的副本副本数与容错能力2 个副本可容忍 1 台 Chunkserver 故障冗余级别为 13 个副本可容忍 2 台 Chunkserver 故障冗余级别为 2四、存储策略Storage Class原理Storage Class 是 MooseFS 中定义数据冗余策略的核心机制。4.1 标签Label标签是管理员为每个 Chunkserver 赋予的标识符用于分类和区分不同的存储节点。常见标签用途按存储介质区分SSSD 固态硬盘、HHDD 机械硬盘按地理位置区分A机房 A、B机房 B按机架区分R1机架 1、R2机架 2关键理解标签让管理员可以精确控制数据存放的位置——例如确保关键数据同时存放在 SSD 和 HDD 上或确保副本分布在不同的机架/机房以应对区域性故障。4.2 Storage Class 的定义一个 Storage Class 通过标签表达式来指定需要创建多少个副本这些副本应该存储在带有哪些标签的 Chunkserver 上示例2A在带有标签 A 的服务器上存储 2 个副本A,B分别在带有标签 A 和 B 的服务器上各存储 1 个副本S,H分别在 SSD标签 S和 HDD标签 H上各存储 1 个副本4.3 标签匹配模式Label ModeStorage Class 支持三种标签匹配模式控制当带标签的服务器不可用时的行为模式行为STRICT严格必须使用指定标签的服务器否则写入失败STANDARD标准优先使用指定标签的服务器不可用时使用其他服务器默认LOOSE宽松优先使用指定标签但允许在其他服务器上创建副本4.4 存储类在实际中的应用在本文档的实践部分为 server2、server3 标记标签 SSSD为 server5 标记标签 HHDD创建 Storage Class2CP_SH要求在标签 S 和 H 的服务器上各存一份副本将目录dir2/应用该策略——实现数据同时存储在 SSD 和 HDD 上这种策略既保证了性能SSD 上的副本提供快速访问又兼顾了成本HDD 上的副本提供低成本备份。五、数据保护机制5.1 副本机制Replication副本是 MooseFS 最基础的数据保护方式。每次写入数据时MooseFS 会根据文件的 Storage Class 自动在多个 Chunkserver 上创建指定数量的副本。副本机制的优势快速恢复副本是完整的数据拷贝故障时可直接使用无需计算低延迟客户端可以从最近的或负载最低的副本读取数据实现简单CPU 和内存开销较低适合频繁访问的热数据5.2 回收站机制TrashMooseFS 的回收站是一个文件系统级别的回收站。工作原理当文件被删除unlink时MooseFS 不会立即从磁盘上擦除数据文件被移动到特殊的 trash回收站区域文件在 trash 中保留可配置的时间称为 trashtime以小时为单位超过保留时间后文件才会被真正删除释放磁盘空间恢复方法通过挂载 MFSMETA 文件系统mfsmount -m访问 trash 目录在 trash 目录中找到被删除的文件将文件移动到trash/undel子目录即可恢复关键理解回收站机制提供了误删除的后悔药但需要注意回收站中的文件仍然占用磁盘空间需要合理设置 trashtime平衡数据安全和存储空间可以通过mfstrashtime命令为不同目录设置不同的保留时间六、MooseFS 部署实践实验环境基于 4 台 Rocky Linux 9 服务器后续扩展至 6 台6.1 导入 GPG 密钥和添加软件仓库在终端中执行以下命令下载并将 MooseFS 的 GPG 密钥保存到系统指定目录curlhttps://repository.moosefs.com/RPM-GPG-KEY-MooseFS/etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS执行以下命令为 Rocky Linux 9 添加 MooseFS 的软件源配置文件curlhttp://repository.moosefs.com/MooseFS-4-el9.repo/etc/yum.repos.d/MooseFS.repo完成上述配置后你就可以使用 yum 或 dnf 命令来安装 MooseFS 了。例如安装 Master Server 组件yuminstallmoosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli6.2 功能概述本节完成 MooseFS 软件仓库的配置和 Master Server 的安装。GPG 密钥用于验证软件包签名防止下载到被篡改的安装包。软件源配置文件告诉 yum/dnf 去哪里下载 MooseFS 的软件包。6.3 Chunkserver 配置chunkserver3, server4curlhttp://repository.moosefs.com/MooseFS-4-el9.repo/etc/yum.repos.d/MooseFS.repocurlhttps://repository.moosefs.com/RPM-GPG-KEY-MooseFS/etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS yuminstallmoosefs-chunkserver配置主机名解析vim/etc/hosts192.168.88.161 server1 mfsmaster 192.168.88.162 server2 192.168.88.163 server3 192.168.88.164 server4 192.168.88.165 server5 192.168.88.166 server66.4 功能概述Chunkserver 是 MooseFS 中实际存储数据的节点。本节在 server3 和 server4 上安装 Chunkserver 软件并配置主机名解析。注意mfsmaster别名指向 server1这是 MooseFS 客户端和 Chunkserver 默认用来发现 Master Server 的主机名。6.5 数据管理磁盘分区关机情况下给 server2、server3 分别新加一块磁盘。以 server3 为例server2 执行相同操作。磁盘类型NVMe。格式化磁盘mkfs.xfs-Lssd02 /dev/nvme0n2设置挂载点mkdir-p/mnt/ssd01chownmfs.mfs /mnt/ssd01查看 UUIDlsblk-oNAME,UUID,LABEL,MOUNTPOINTvim/etc/fstabmount-a6.6 功能概述Chunkserver 需要专用的磁盘空间来存储 chunk 数据。本节为 Chunkserver 节点添加新磁盘格式化为 XFS 文件系统设置mfs用户权限MooseFS 进程以 mfs 用户运行并通过/etc/fstab配置开机自动挂载。6.7 启用 GUIMaster 节点systemctl start moosefs-gui.service systemctlenablemoosefs-gui.service6.8 功能概述MooseFS 内置了 Web 图形界面用于监控集群状态。在 Master 节点启动moosefs-gui服务后可通过浏览器访问管理界面查看 Chunkserver 状态、存储容量、文件分布等信息。6.9 启动 Chunkserverserver2、server3systemctlenable--nowmoosefs-chunkserver配置数据目录cd/etc/mfsvimmfshdd.cfgsystemctl reload moosefs-chunkserver.service6.10 功能概述mfshdd.cfg文件用于告诉 Chunkserver 哪些目录可以用来存储 chunk 数据。将之前挂载的/mnt/ssd01加入该配置后Chunkserver 就会向 Master 报告该目录的可用空间并开始接收 chunk 存储任务。6.11 Client 配置cd/etc/mfsvimmfsmount.cfgmkdir/mnt/mfs mfsmount6.12 功能概述客户端通过mfsmount将 MooseFS 文件系统挂载到本地/mnt/mfs目录。mfsmount.cfg中配置了 Master Server 的地址。挂载成功后用户操作/mnt/mfs就像操作本地目录一样但实际上所有数据都存储在 MooseFS 集群中。七、MooseFS 应用实践7.1 挂载点下创建目录设置 Storage Classmfssclassset2CP-rdir1/查看目录 Storage Classmfssclass get dir1列出所有 Storage Classmfslistsclass-l复制文件并查看信息cp/etc/passwd.mfsfileinfopasswd创建自定义 Storage Classmfsscadmin create-K1* hot_1cp查看文件信息mfsfileinfo fstab7.2 功能概述本节演示 MooseFS 的核心操作mfssclass set为目录设置 Storage Class控制该目录下文件的副本策略mfssclass get查看目录当前应用的 Storage Classmfslistsclass列出系统中所有可用的 Storage Classmfsfileinfo查看文件在集群中的分布情况包括 chunk 数量、副本位置等mfsscadmin create创建自定义 Storage Class-K 1*表示 1 个副本7.3 设置标签vim/etc/mfs/mfschunkserver.cfg systemctl reload moosefs-chunkserver.service创建带标签的 Storage Class 并应用mfsscadmin create-KA 1CP_A mfssclassset-r1CP_A dir1/7.4 功能概述标签Label是 MooseFS 实现精细化存储策略的基础。通过在mfschunkserver.cfg中为 Chunkserver 设置标签可以将不同性能的存储介质SSD/HDD或不同位置的节点分组。然后创建 Storage Class 指定副本存放在哪些标签的节点上实现冷热数据分离、跨机房容灾等高级策略。7.5 添加一个 Chunkservercurlhttps://repository.moosefs.com/RPM-GPG-KEY-MooseFS/etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFScurlhttp://repository.moosefs.com/MooseFS-4-el9.repo/etc/yum.repos.d/MooseFS.repo yuminstallmoosefs-chunkservermkdir/mnt/hdd01vimmfshdd.cfgsystemctlenable--nowmoosefs-chunkservervimmfschunkserver.cfg systemctl reload moosefs-chunkserverserver4 查看文件分布cd/mnt/mfs/dir1 mfsfileinfo fstab修改 Storage Classmfssclassset-r2CP_AC.再次查看文件分布mfsfileinfo fstab7.6 功能概述MooseFS 支持动态扩容——新 Chunkserver 加入集群后Master 会自动发现并将其纳入存储池。本节演示添加一台新的 Chunkserverserver5并修改 Storage Class 让现有数据重新分布到新节点上实现负载均衡。7.7 多标签存储策略实践server2 配置 SSD 标签vim/etc/mfs/mfschunkserver.cfg# S 表示固态server3 配置 SSD 标签vim/etc/mfs/mfschunkserver.cfg systemctl reload moosefs-chunkserverserver5 配置 HDD 标签vim/etc/mfs/mfschunkserver.cfg systemctl reload moosefs-chunkserver# H 表示机械server4 客户端操作mkdirdir3/ mfsgetsclass dir3 mfssclassset-r3CP dir3cp/etc/hosts dir3/ mfsfileinfo dir3/hosts设置跨介质存储策略mfssetsclass-r2CP_SH dir2/创建自定义 Storage Classmfscreatesclass-KS,H hosts 2CP_SH移动文件并应用策略mvdir1/fstab dir2/ mfssetsclass-r2CP_SH dir2/7.8 功能概述本节实现异构存储策略——让数据同时存储在 SSD标签 S和 HDD标签 H上2CP_SH2 个副本分别存放在标签 S 和标签 H 的节点上这样既保证了 SSD 提供的高性能读取又利用 HDD 提供了低成本的备份mfscreatesclass -K S,H中的-K参数指定标签组合文件移动后MooseFS 会自动在后台重新平衡 chunk 分布八、回收站机制mkdirmeta mfsmount-m/mnt/metacd/mnt/meta查看回收站保留时间mfsgettrashretention /mnt/mfs/dir1恢复文件find-name*passwd*mv./004/00000004\|dir1\|passwdundel8.1 功能概述MooseFS 的回收站通过 MFSMETA 文件系统访问。挂载-m参数后可以在trash目录中找到被删除的文件。文件在回收站中的路径包含原始位置信息移动到undel目录即可完成恢复。mfsgettrashretention查看保留时间mfstrashtime可以修改保留时长。九、Master Server 高可用Pacemaker 集群目标消除 Master Server 单点故障使用 Pacemaker 实现双节点高可用9.1 安装 Pacemaker 集群软件双节点同时配置dnf config-manager --set-enabled highavailability dnfinstall-ypacemaker pcs corosync fence-agents-all systemctlenable--nowpcsd.service设置集群用户密码# 将系统用户 hacluster 密码设置为 westosechowestos|passwd--stdinhacluster给所有节点设置密码pcshostauth server1 server5-uhacluster创建集群pcs cluster setup mycluster server1 server5启动并启用集群pcs cluster start--allpcs clusterenable--all配置集群属性pcs propertysetstonith-enabledfalse pcs propertysetno-quorum-policyignore9.2 功能概述Pacemaker 是 Linux 高可用集群的标准解决方案。本节在 server1 和 server5 上部署双节点集群pcsdPacemaker 的守护进程提供 Web 管理和节点通信corosync集群消息层负责节点间心跳检测stonith-enabledfalse暂时关闭 fencing后续通过 SBD 启用no-quorum-policyignore双节点场景下忽略 quorum票数检查避免脑裂9.3 配置虚拟 IPpcs resource create vip ocf:heartbeat:IPaddr2ip192.168.88.100cidr_netmask24opmonitorinterval30s更新 hosts 配置vim/etc/hosts同步到所有节点9.4 功能概述虚拟 IPVIP是高可用集群的核心组件。192.168.88.100作为浮动 IP平时绑定在主节点 server1 上。当 server1 故障时Pacemaker 会自动将 VIP 漂移到 server5。客户端始终通过mfsmaster解析到 VIP连接 Master无需感知后端节点的切换。9.5 配置 iSCSI 共享存储server4iSCSI Target 端yuminstall-ytargetcli systemctlenabletarget targetcli在 targetcli 中执行/backstores/block create my_disk /dev/nvme0n2 Created block storage object my_disk using /dev/nvme0n2. /iscsi create iqn.2026-08.com.example:mfsdata Created target iqn.2026-08.com.example:mfsdata. Created TPG 1. Global pref auto_add_default_portaltrue Created default portal listening on all IPs (0.0.0.0), port 3260. /iscsi/iqn.20...ata/tpg1/acls create iqn.2026-08.com.example:client Created Node ACL for iqn.2026-08.com.example:client Created mapped LUN 0. /iscsi/iqn.20...ata/tpg1/acls exit Global pref auto_save_on_exittrue Configuration saved to /etc/target/saveconfig.jsonserver1 和 server5iSCSI Initiator 端yuminstall-yiscsi-initiator-utilsviminitiatorname.iscsi# 设置为InitiatorNameiqn.2026-08.com.example:clientsystemctl restart iscsid iscsiadm-mdiscovery-tst-p192.168.88.164 iscsiadm-mnode-l给 server1、server5 添加 iSCSI 硬盘9.6 功能概述Pacemaker 双节点集群需要共享存储来存放 MooseFS 的元数据确保主备节点看到的是同一份数据。iSCSI 提供了一种基于 IP 网络的块级存储共享方案Targetserver4提供共享磁盘Initiatorserver1、server5连接并使用共享磁盘共享磁盘格式化后可用于存放 MooseFS 元数据实现主备切换时数据一致性9.7 配置 SBD FencingVMware 虚拟机配置打开记事本编辑添加以下内容scsi1:0.mode independent-persistent disk.locking FALSE disk.EnableUUID TRUE scsi1.sharedBus virtual开机后狂按 ESCshift将 NVME 调整到 SCSI 上方exit save changes - save查看磁盘 IDcd/dev/disk/by-id安装 SBD 和 fencing 代理dnfinstall-ysbd fence-agents-all创建 SBD 设备sbd-d/dev/disk/by-id/scsi-36000c298d3769e543b507df5981c1de1 create sbd-d/dev/disk/by-id/scsi-36000c298d3769e543b507df5981c1de1 dump启用 SBD Stonithpcs cluster stop--allpcs stonith sbdenabledevice/dev/disk/by-id/scsi-36000c298d3769e543b507df5981c1de1watchdog/dev/watchdogpcs cluster start--all测试 Fencingsbd-d/dev/disk/by-id/scsi-36000c298d3769e543b507df5981c1de1 message server1 reset pcs stonith fence server19.8 功能概述Fencing隔离是高可用集群的保险丝——当集群检测到某个节点故障时必须确保该节点真的被隔离不会继续访问共享资源造成数据损坏。SBDStonith Block Device是一种基于共享存储的 fencing 机制在共享磁盘上创建 SBD 分区每个节点持续向 SBD 写入心跳当某节点心跳停止其他节点通过 SBD 命令强制重置该节点pcs stonith fence server1手动测试 fencing 功能VMware 虚拟机需要特殊配置disk.locking FALSE、disk.EnableUUID TRUE来支持共享磁盘和磁盘 UUID 识别。附录常见错误排查错误现象可能原因解决方法mfsmount: cant connect to masterMaster Server 未启动或网络不通检查moosefs-master服务状态和防火墙chunkserver: no hdd spacemfshdd.cfg配置错误或权限不足检查路径是否正确chown mfs.mfs设置权限Storage Class 写入失败符合条件的 Chunkserver 不足检查标签配置和 Chunkserver 状态Pacemaker 脑裂节点间网络中断双方都认为自己是主配置 FencingSBD强制隔离故障节点iSCSI 连接失败Target 未启动或 ACL 配置错误检查targetcli配置和 initiatornameVIP 无法漂移资源约束或监控超时检查pcs status和 resource 约束配置SBD 创建失败磁盘被占用或 UUID 不正确确保磁盘未被挂载VMware 开启disk.EnableUUID