分布式文件系统KFS源码阅读与分析(二):MetaServer元数据持久化
KFS文件系统的MetaServer元数据的持久化采用的是checkpoint + log方式,下面将结合其源码,对KFS MetaServer中元数据的持久化机制及其实现细节进行分析。
1. 相关源码文件
KFS MetaServer元数据持久化所涉及的代码所在目录为kfs-[version]/src/cc/meta,其中,KFS元数据持久化的相关源码如下:
(1)meta/statup.cc: 负责KFS的启动,在启动过程中处理checkpoint和log。
(2)meta/checkpoint.cc: 负责metadata的checkpointing操作。
(3)meta/restore.cc: 从已保存的checkpoint重新构建metatree(以B+树的方式组织)。
(4)meta/logger.cc: 为metadata的更新做日志记录操作。
(5)meta/replay.cc: 在checkpoint恢复之后,重做log日志文件中的所有操作。
(6)meta/kfstree.h: 构建一个新的metatree,即初始化根目录为”/”。
2. checkpoint和log机制
Log(日志)通常是系统或者软件对已完成的某种处理操作的记录,以便将来用作系统恢复,一般来说是文本格式。Checkpoint(检查点)机制是将内存中被修改的数据块与磁盘上的数据文件进行同步的一种数据持久化方式。
在KFS的元数据持久化中,之所有采用checkpoint + log的方式,本人觉得主要出于以下考虑:
(1)通过记录必要的Checkpoint(检查点),保证将文件系统元数据按照序列化的要求,永久持久化存储到磁盘上,从而保证内存和硬盘上的数据的同步与一致;当下次系统恢复时,直接按照反序列化的要求进行还原,快速重新构建KFS的元数据metatree树。
(2)通过checkpoint(检查点)和log(日志)相结合,缩短KFS系统的启动恢复时间。在系统恢复时,首先将系统恢复到最近一次的checkpoint状态(即重新构建B+树),然后,只需将最近一次checkpoint之后的log中的操作进行redo即可,而不是所有log中的所有操作进行redo,从而有效缩短系统恢复时间。
3. 元数据的持久化
在KFS中,log操作是由logger.cc自动完成的,默认为每隔10分钟做一次log(写切换);checkpoint操作是由checkpoint.cc实现,但是是通过logcompactor_main.cc的离线操作手动完成的,其main函数的工作过程如下:
- 加载log和checkpoint文件的目录;
- 恢复最近一次的checkpoint文件;
- 重做最近一次checkpoint之后的所有logs;
- 将metatree中所有叶节点写入新的checkpoint文件中。
4. 元数据加载过程
KFS文件系统停止时,MetaServer的元数据被持久化存储到物理磁盘上(checkpoint文件和log文件);当KFS下次启动时,这些持久化后的数据会被KFS MetaServer启动程序所加载,相关方法的调用关系如图中所示:
其中,
(1)KFS启动后,将日志目录logdir和checkpoint目录cpdir等信息,传给KFS::kfs_startup()函数,该函数中首先会调用KFS::logger_setup_paths()设置KFS的日志目录;
(2)然后,KFS::kfs_startup()函数会继续调用KFS::checkpointer_setup_paths()设置KFS的checkpoint目录;
(3)接下来,KFS::kfs_startup()函数会继续调用KFS::setup_initial_tree()函数,初始化MetaServer的B+树metatree,分为以下两种情况:
(4.1)如果存在最近的checkpoint文件,则调用Restorer::rebuild()函数,根据加载checkpoint文件,初始化后构建metatree树;
(4.2)否则,则调用KFS::metatree.new_tree()函数,初始化一个新的metatree树,只包含根目录”/”,并设置与其相关联的"."和".."链接项;
(5)完成之后,回到KFS::kfs_startup()函数中,调用Replay::playAllLogs()函数,重做最近一次checkpointing之后的所有日志中的操作;
(6)在KFS::kfs_startup()函数中,调用KFS::logger_init()函数,启动记录日志,设置日志轮转的间隔时间;
(7)在KFS::kfs_startup()函数中,调用KFS::checkpointer_init()函数,初始化checkpoint。
至此,完成了KFS文件系统中持久化后的元数据的恢复过程。