MooseFS 分布式文件系统调研分析报告
第一章MooseFS 文件系统介绍--------------------------------------------------------------7
1.1 MooseFS 系统简介 ----------------------------------------------------------------------------- 7
1.1.1 MoosFS 特点 ------------------------------------------------------------------------------------------------7
1.1.2 MooseFS 的体系结构 ------------------------------------------------------------------------------------ 7
1.1.3 系统如何工作 -----------------------------------------------------------------------------------------------8
1.1.4 容错性 -------------------------------------------------------------------------------------------------------- 8
1.1.5 平台 ----------------------------------------------------------------------------------------------------------- 9
1.2.1 MooseFS 系统源码结构 ----------------------------------------------------------------------9
第二章master 主服务器工作原理--------------------------------------------------------- 10
2.1 元数据结构分析 ------------------------------------------------------------------------------- 10
2.1.1 节点数据结构与文件树的构成 -----------------------------------------------------------------------10
2.1.2 块数据结构和文件节点与块的关系 ---------------------------------------------------------------- 14
2.1.3 元数据文件 metadata.mfs ------------------------------------------------------------------------------ 17
2.2 master 整体运行框架 ------------------------------------------------------------------------- 19
2.2.1 一切从 main 开始 ----------------------------------------------------------------------------------------19
2.2.2 文件锁与进程启停控制 --------------------------------------------------------------------------------21
2.2.3 系统各模块的初始化 ----------------------------------------------------------------------------------- 21
2.2.4 大循环 mainloop ----------------------------------------------------------------------------------------- 23
2.2.5 总结 ---------------------------------------------------------------------------------------------------------26
2.3 master 的初始化 ------------------------------------------------------------------------------- 26
2.3.1 日志模块初始化 ----------------------------------------------------------------------------------------- 27
2.3.2 随机数产生器初始化 ----------------------------------------------------------------------------------- 27
2.3.3 数据 cache 管理初始化 ---------------------------------------------------------------------------------27
2.3.4 加载 sessions 初始化 ------------------------------------------------------------------------------------27
2.3.5 exports 管理初始化 -------------------------------------------------------------------------------------- 27
2.3.5 文件系统管理初始化 ----------------------------------------------------------------------------------- 28
2.4 mater 的消息交互概述 ------------------------------------------------------------------------29
2.4.1 消息交互框架 -------------------------------------------------------------------------------------------- 29
2.4.2 对应 metalogger 的消息结构 --------------------------------------------------------------------------32
2.4.3 对应 chunkserver 的消息结构 ------------------------------------------------------------------------ 34
2.4.3 对应 client 的消息结构 ---------------------------------------------------------------------------------35
2.5 master 与 client 的消息交互 ----------------------------------------------------------------- 37
2.5.1 消息 REGISTER ----------------------------------------------------------------------------------------- 43
2.5.2 消息 STATFS --------------------------------------------------------------------------------------------- 43
2.5.3 消息 ACCESS -------------------------------------------------------------------------------------------- 44
2.5.4 消息 LOOKUP ------------------------------------------------------------------------------------------- 44
2.5.5 消息 GETATTR ------------------------------------------------------------------------------------------- 45
2.5.6 消息 SETATTR --------------------------------------------------------------------------------------------46
2.5.7 消息 READLINK -----------------------------------------------------------------------------------------46
2.5.8 消息 SYMLINK -------------------------------------------------------------------------------------------46
2.5.9 消息 MKNOD --------------------------------------------------------------------------------------------- 47
2.5.10 消息 MKDIR ---------------------------------------------------------------------------------------------48
2.5.11 消息 UNLINK ------------------------------------------------------------------------------------------- 48
2.5.12 消息 RMDIR --------------------------------------------------------------------------------------------- 49
2.5.13 消息 RENAME ------------------------------------------------------------------------------------------ 49
2.5.14 消息 LINK ------------------------------------------------------------------------------------------------50
2.5.15 消息 GETDIR --------------------------------------------------------------------------------------------51
2.5.16 消息 OPEN ----------------------------------------------------------------------------------------------- 51
2.5.17 消息 READ CHUNK 及读数据过程 --------------------------------------------------------------- 52
2.5.18 消息 WRITE CHUNK 及写数据过程 -------------------------------------------------------------- 53
2.6 exports 机制 -------------------------------------------------------------------------------------55
2.6.1 mfsexports.mfs 文件结构 ------------------------------------------------------------------------------- 55
2.6.2 exports 数据结构 ----------------------------------------------------------------------------------------- 57
2.6.3 session 数据结构 ------------------------------------------------------------------------------------------58
2.6.4 客户端 IP 访问控制 ------------------------------------------------------------------------------------ 58
2.6.5 挂在目录路径访问控制 --------------------------------------------------------------------------------59
2.6.6 密码访问控制 -------------------------------------------------------------------------------------------- 59
2.6.7 版本访问控制 -------------------------------------------------------------------------------------------- 59
2.6.8 用户映射机制 -------------------------------------------------------------------------------------------- 61
2.6.9 文件权限控制 -------------------------------------------------------------------------------------------- 62
2.7 用户与组机制(自定义模块) ------------------------------------------------------------- 63
2.7.1 数据结构 ---------------------------------------------------------------------------------------------------63
2.7.2 保存加载与初始化 -------------------------------------------------------------------------------------- 65
2.7.3 访问控制 ---------------------------------------------------------------------------------------------------66
2.7.4 用户与组的相关命令 ----------------------------------------------------------------------------------- 67
2.7.5 密码的维护 ------------------------------------------------------------------------------------------------70
2.7.6 root 用户的特殊性 --------------------------------------------------------------------------------------- 71
2.7.7 掉电保护和恢复 ----------------------------------------------------------------------------------------- 71
2.8 session 机制 ------------------------------------------------------------------------------------- 71
2.8.1 session 数据结构 ------------------------------------------------------------------------------------------71
2.8.2 sessions.mfs 文件结构 -----------------------------------------------------------------------------------72
2.8.3 session 与用户重映射 ----------------------------------------------------------------------------------- 73
2.8.4 session 统计文件操作次数 ----------------------------------------------------------------------------- 73
2.8.5 session 记录打开文件 ----------------------------------------------------------------------------------- 74
2.8.6 session 的维护 ---------------------------------------------------------------------------------------------75
2.9 副本机制 ---------------------------------------------------------------------------------------- 75
2.9.1 副本数据结构 -------------------------------------------------------------------------------------------- 75
2.9.2 块 ID --------------------------------------------------------------------------------------------------------76
2.9.2 块的版本号 ------------------------------------------------------------------------------------------------77
2.9.4 副本状态及转换 ----------------------------------------------------------------------------------------- 77
2.9.5 块的副本数 ------------------------------------------------------------------------------------------------79
2.9.6 块的副本操作 -------------------------------------------------------------------------------------------- 80
2.9.7 chunk 的周期维护 ----------------------------------------------------------------------------------------82
2.9.8 副本放置算法 --------------------------------------------------------------------------------------------- 87
2.9.9 块节点的移除 -------------------------------------------------------------------------------------------- 90
2.10 快照机制 ---------------------------------------------------------------------------------------92
2.10.1 快照的生成 ----------------------------------------------------------------------------------------------92
2.10.2 快照的写时复制 ----------------------------------------------------------------------------------------93
2.11 配额机制 ---------------------------------------------------------------------------------------94
2.11.1 配额相关的数据结构和变量 ------------------------------------------------------------------------ 95
2.11.2 配额的维护 ---------------------------------------------------------------------------------------------- 96
2.11.3 配额的使用 ---------------------------------------------------------------------------------------------- 97
2.11.4 配额的设置和配额信息的获取 --------------------------------------------------------------------- 97
2.12 回收站机制 ------------------------------------------------------------------------------------ 97
2.12.1 回收站数据结构 ----------------------------------------------------------------------------------------98
2.12.2 META 系统 -----------------------------------------------------------------------------------------------99
2.12.3 文件信息的获取 ----------------------------------------------------------------------------------------99
2.12.4 trashpath 的获取和设置 ------------------------------------------------------------------------------100
2.12.5 trashtime 的获取和设置 ------------------------------------------------------------------------------100
2.12.6 文件的清除 PURGE --------------------------------------------------------------------------------- 102
2.12.7 文件的恢复 UNDEL --------------------------------------------------------------------------------- 102
2.12.8 回收站的维护 ----------------------------------------------------------------------------------------- 102
2.13 reserved 机制 -------------------------------------------------------------------------------- 102
2.13.1 记录打开文件 ----------------------------------------------------------------------------------------- 103
2.13.2 reserved 机制数据结构 -------------------------------------------------------------------------------103
2.13.3 META 系统 --------------------------------------------------------------------------------------------- 104
2.13.4 文件信息的获取 -------------------------------------------------------------------------------------- 105
2.13.5 文件保持和释放 -------------------------------------------------------------------------------------- 105
2.13.6 reserved 维护 ------------------------------------------------------------------------------------------- 105
2.14 DCM 机制 ------------------------------------------------------------------------------------ 106
2.14.1 数据结构及初始化 ----------------------------------------------------------------------------------- 106
2.14.2 dcm_open ------------------------------------------------------------------------------------------------107
2.14.3 dcm_modify ---------------------------------------------------------------------------------------------108
2.14.4 总结 ------------------------------------------------------------------------------------------------------109
2.15 优化机制 ------------------------------------------------------------------------------------- 110
2.15.1 freenode 与位管理节点编号 ------------------------------------------------------------------------ 110
2.16 master 的容错恢复 --------------------------------------------------------------------------112
2.16.1 changelog 机制 ----------------------------------------------------------------------------------------- 113
2.16.2 mfsmetarestore 机制 -----------------------------------------------------------------------------------115
2.17 异地备份机制(自定义模块) ---------------------------------------------------------- 118
2.17.1 工作模型 ------------------------------------------------------------------------------------------------119
2.17.2 基本实现原理 ----------------------------------------------------------------------------------------- 121
2.17.3 冲突文件的产生与解决 -----------------------------------------------------------------------------123
2.17.4 备份文件副本数可控 --------------------------------------------------------------------------------124
2.17.5 新增配置参数说明 ----------------------------------------------------------------------------------- 125
2.17.6 测试 ------------------------------------------------------------------------------------------------------126
第三章chunkserver 块服务器工作原理-------------------------------------------------128
3.1 基本数据结构 --------------------------------------------------------------------------------- 129
3.1.1 块文件存储结构及命名规则 ------------------------------------------------------------------------ 129
3.1.2 块目录组织结构及配置文件 ------------------------------------------------------------------------ 130
3.1.3 块文件对应的数据结构 chunk ----------------------------------------------------------------------131
3.1.4 块目录对应的数据结构 folder ---------------------------------------------------------------------- 133
3.1.5 数据结构组织方式 -------------------------------------------------------------------------------------134
3.2 chunkserver 的初始化 -----------------------------------------------------------------------134
3.2.1 块文件管理初始化 -------------------------------------------------------------------------------------135
3.2.2 与 client&cs 通信模块初始化 ----------------------------------------------------------------------- 136
3.2.3 与 master 通信模块初始化 ---------------------------------------------------------------------------137
3.2.4 表格数据模块初始化 --------------------------------------------------------------------------------- 137
3.3 周期性数据结构维护 ------------------------------------------------------------------------137
3.3.1 周期性 chunk 维护 -------------------------------------------------------------------------------------138
3.3.2 周期性 folder 维护 -------------------------------------------------------------------------------------139
3.3.3 延时计数器维护 ----------------------------------------------------------------------------------------140
3.3.4 块目录操作状态维护 --------------------------------------------------------------------------------- 142
3.4 与 master 的消息交互 ---------------------------------------------------------------------- 142
3.4.1 消息交互数据结构及框架 --------------------------------------------------------------------------- 142
3.4.2 消息 CREATE -------------------------------------------------------------------------------------------143
3.4.3 消息 DELETE -------------------------------------------------------------------------------------------143
3.4.4 消息 DUPLICATE --------------------------------------------------------------------------------------144
3.4.5 消息 SET_VERSION ----------------------------------------------------------------------------------145
3.4.6 消息 REPLICATE -------------------------------------------------------------------------------------- 146
3.4.7 消息 TRUNCATE -------------------------------------------------------------------------------------- 147
3.4.8 消息 DUPTRUNC --------------------------------------------------------------------------------------148
3.4.9 消息 REGISTER ----------------------------------------------------------------------------------------148
3.4.10 信息反馈 ------------------------------------------------------------------------------------------------149
3.5 线程池机制 ------------------------------------------------------------------------------------149
3.5.1 数据结构 ------------------------------------------------------------------------------------------------- 149
3.5.2 基本操作函数 -------------------------------------------------------------------------------------------153
3.5.3 工作原理 ------------------------------------------------------------------------------------------------- 154
3.5.4 总结 ------------------------------------------------------------------------------------------------------- 157
3.6 与 client/cs 的消息交互 --------------------------------------------------------------------- 157
3.6.1 消息交互数据结构及框架 --------------------------------------------------------------------------- 157
3.6.2 读块数据过程 -------------------------------------------------------------------------------------------159
3.6.3 单副本写块数据过程 --------------------------------------------------------------------------------- 163
3.6.4 多副本写块数据过程 --------------------------------------------------------------------------------- 166
3.6.5 读/写操作阶段状态转换 ----------------------------------------------------------------------------- 169
3.6.6 总结 ------------------------------------------------------------------------------------------------------- 172
第四章metalogger 备份服务器工作原理----------------------------------------------- 173
4.1 metalogger 的初始化 ------------------------------------------------------------------------ 173
4.2 与 master 的消息交互 ---------------------------------------------------------------------- 175
4.3 metalogger 实时接收日志消息 -------------------------------------------------------------176
4.4 metalogger 定期下载元数据的过程 -------------------------------------------------------176
4.5 metalogger 定期下载 session 文件的过程 ----------------------------------------------- 178
4.6 总结 ---------------------------------------------------------------------------------------------178
第五章client 客户端工作原理-------------------------------------------------------------178
5.1 mfsmount 的工作原理 -----------------------------------------------------------------------178
5.2 mfstool 的工作原理 -------------------------------------------------------------------------- 202
5.2.1 mfsfilerepair ---------------------------------------------------------------------------------------------- 202
第一章 MooseFS 文件系统介绍
1.1 MooseFS 系统简介
MooseFS 是一个高容错性的分布式文件系统,它能够将资源分布存储于几台不同的物
理介质,对外只提供给用户一个访问接口。对它的操作与其它文件系统完全一样:
分层文件结构(目录树结构);
存储 POSIX 文件属性(权限、最后访问、修改时间);
支持特殊的文件(块文件夹、字符文件及管道和 socket );
软链接(文件名指向目标文件)及硬链接(不同的文件名指向同一块数据);
仅限于基于 IP 地址或密码来访问文件系统。
1.1.1 MoosFS 特点
高可靠性:数据可以被存储于几个不同的地方;
可扩展性:可以动态的添加计算机或磁盘来增加系统的容量产;
高可控性:系统能够设置删除文件的时间间隔;
可追溯性:能够根据文件的不同操作(写入/ 访问)生成文件快照。
1.1.2 MooseFS 的体系结构
MooseFS 体系结构包含以下四个模块,如图所示:
块服务器
块服务器
块服务器
<
-
r
e
p
l
i
c
a
t
i
o
n
-
>
<
-
r
e
p
l
i
c
a
t
i
o
n
-
>
<- data management
status ->
主服务器
m
e
t
a
d
a
t
a
b
a
c
k
u
p
-
>
<-data transmission ->
客户端
客户端
备份服务器
主服务器( master server ):它用来管理整个文件系统,用来存储每个文件的元数
据(包括文件大小、属性及存储位置,同时也包括的一些非规则性的文件,如目录、
socket 、管道及设备);
块服务器( chunk servers ):用于存储文件的服务器,同时它们之间可以同步数据;
备份服务器( metalogger servers ):用于存储元数据变化日志并周期性的下载元
数据文件;同时也可以替代管理服务器暂不能工作的情况;
客户端:用于访问 MooseFS 中的文件,采用 mfsmount 来与管理服务器进行交互
(接收或修改元数据文件)及与数据服务器交换真正的数据。
1.1.3 系统如何工作
在客户端上对挂载在 MooseFS 上的文件操作与的文件系统完全一样,操作系统内核将
文件操作传输至 FUSE 模块,进而与 mfsmount 进程进行交互。 Mfsmount 进程通过网络
与管理服务器及数据服务器交互。整个过程对用户来说是完全透明的。
Mfsmount 每次与管理服务器交互,以下的操作文件元是必须的:
创建文件;
删除文件;
读取文件目录;
读取及改变属性;
改变文件大小;
开始读取或写入数据;
访问 MFSMETA 上的任何特殊文件。
mfsmount 直接连接到数据服务器,用于存储相关片段的文件。当写入一个文件时,写
入过程完成后,管理服务器会接收从 mfsmount 发送回来的信息,用于更新文件的长度及
最后的修改时间。
此外,数据服务器间能够相互复制数据,以达到将数据文件存储在不同机器上的目的。
1.1.4 容错性
系统 管理员可以通过管理命令将数据文件拷贝至不同的数据服务器上。设置多于一台
数据服务器的目标将有利于提高系统的容错性。多份数据文件的存储有利于消除单一数据服
务器宕机或网络延迟带来的灾难。
当采用 mfssetgoal 的目标数为 1 时,会将数据文件存储在系统中的单一数据服务器
中。当有重要数据时,可以将该目标值设置大于 2 ,它能够有效的防止因系统宕机而带来
数据无法访问的后果。当然了目标数的设定不能多于数据服务器的数目,否则将无法将数据
保存到预定数目的服务器中。当有一个服务器已经存储满时,它将无法再容纳数据存储,在
这种情况下,需要重新挂载一台数据服务器,才能够满足预期的目标数。如果有一台数据服
务器临时无法访问或网络出现问题,由于之前数据文件至少有两份以上的备份,客户端可以
从其它服务器上进行有效访问。
新的数据服务器能够随时挂载到系统中,同时新的存储容量也会立即生效,用来存储新
文件或从其它数据服务器复制备份文件。管理工具能够查询文件系统中的状态以及是否在目
标值设定的范围之前内,工具也能够用来改变目标值的设置。客户端(运行 mfsmount 进