官方地址:https://moosefs.com/
常见问题地址:https://moosefs.com/faq/
MooseFS 相关概念
MooseFS 是一种容错的分布式文件系统。它将数据分布在多个物理位置,用户可以将这些物理位置视为一个资源(可以理解为:共享的是一个根目录,也可以共享它的子目录)。
使用场景(个人觉得):管理员控制 MooseFS 共享的根目录,然后通过子目录来控制各个程序或者客户端共享权限。
MooseFS 的显著特征是
- 高可靠性
- 可动态扩展容量(添加新的节点 or 磁盘)
- 删除的文件将保留一段可配置的时间(回收站)
- 文件的一致快照,即使文件正在被写入 or 访问
MooseFS 的组成
- 管理服务器(master):存储每个文件的元数据(有关大小、属性和文件位置的信息,包括有关非常规文件的所有信息,即目录、套接字、管道和设备)
- 数据服务器(chunkserver):存储文件数据并在它们之间进行同步。
- 元数据备份服务器(metalogger):存储元数据更改日志并定期下载 master 元数据文件。
- 客户端服务器(client):使用 mfsmount 进程与 master(接收和修改文件元数据) 和
chunkservers(交换实际文件数据) 通信的服务器。
MooseFS 读写原理
MooseFS 读操作原理解释:
- client 通过 master 访问数据
- master 返回给数据存在的 chunkserver 地址
- client 向 chunkserver 访问数据
- chunkserver 返回给 client 数据
MooseFS 写操作原理解释:
- client 询问 master 将数据写入至哪里
- master 会告知 chunkserver 创建一个块
- chunkserver 创建好块之后,告知 master
- master 告知 client 要将数据写入的位置信息(chunkserver)
- client 在 chunkserver 写入数据
- 多个 chunkserver 之间同步副本
- 同步成功后返回 client 成功信息,写操作完成
Metalogger 相关概念
MooseFS 集群中,所有写操作的元数据存储在 master 的内存中,并在一段时间内保存到磁盘(作为定期更新的二进制文件和立即更新的增量日志)。默认情况下 master 每一个小时会将内存中保存的元数据刷新到 metadata.mfs.back 二进制文件中。
如果配置了 metalogger 节点,那么 master 上的二进制文件和日志会同步到 metalogger 中。metalogger 只是从 master 收集元数据备份,因此硬件要求并不高于 master 本身,但是至少应具有与 master 相同的 HDD 空间(尤其是 /var/lib/mfs 中的可用空间,可以考虑将工作目录作为挂载点);如果您想在 master 发生故障时将 metalogger 用作 master,那么它应至少具有与 master 相同的内存大小。
MooseFS 块的相关概念
MooseFS 集群最初设计用于保存大文件的,它具有 64MiB 的硬编码块大小和 64KiB 的块大小。即使是一个小文件也要占用 64KiB 的空间,另外还要加上 4KiB 的校验和 1KiB 的报头。
关于存储在 MooseFS 块中小文件的占用空间问题确实很重要,但我们认为仍然可以忽略不计。
让我们以副本为 2 的 2500 万个文件为例,来计算存储开销:这可能会创建约 5000 万个 69KiB 块,由于内部碎片(文件大小小于块大小),这些块可能无法完全利用。因此,这 5000 万块的总空间约为 3.2TiB。
具有 10 万个小文件的更典型的中型到大型项目,最多消耗 13GiB 的额外空间。
安全地停止 MooseFS 集群
- 停止所有使用 MooseFS 挂载的进程。
lsof -n | grep mfsmount
可能会有所帮助 - 使用 umount 命令卸载所有机器上的文件系统
- 停止 Chunkserver
- 停止 Master
- 停止 Metalogger
动态添加/删除 Chunkserver
如果该 Chunkserver 仅包含文件系统中的唯一副本(CGI 监视器将其标记为橙色),则断开该块服务器是不明智的。但是可以断开 or 更改单个硬盘:
- 将磁盘标记为要删除
- 重新加载 Chunkserver
- 等待复制(CGI 监视器中不应有标记为 “undergoal” or “missing” 的块)
- 关闭 Chunkserver
- 删除 mfshdd.cfg 中断开连接的磁盘的条目
- 关机—卸下硬盘—启动机器
- 开启 Chunkserver
PS: 经过测试,动态删除单个 HDD 的前提条件是副本数必须要小于 Chunkserver 数,让原本在要删除的 HDD 上的副本可以移动到其他 Chunkserver 的 HDD 上。
有兴趣的可以另外的文档:MooseFS 文件恢复测试和动态删除 HDD 测试