分布式文件系统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,即初始化根目录为”/”。
在KFS中,log操作是由logger.cc自动完成的,默认为每隔10分钟做一次log(写切换);checkpoint操作是由checkpoint.cc实现,但是是通过logcompactor_main.cc的离线操作手动完成的,其main函数的工作过程如下:
- 加载log和checkpoint文件的目录;
- 恢复最近一次的checkpoint文件;
- 重做最近一次checkpoint之后的所有logs;
- 将metatree中所有叶节点写入新的checkpoint文件中。
2. 元数据持久化过程
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文件系统中持久化后的元数据的恢复过程。