KFS文件系统的MetaServer元数据的持久化采用的是checkpoint + log方式,下面将结合其源码,对KFS MetaServer中元数据的持久化机制及其实现细节进行分析。

1. 相关源码文件

KFS MetaServer元数据持久化所涉及的代码所在目录为kfs-[version]/src/cc/meta,其中,KFS元数据持久化的相关源码如下:

(1)meta/statup.cc: 负责KFS的启动,在启动过程中处理checkpointlog

(2)meta/checkpoint.cc: 负责metadatacheckpointing操作。

(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函数的工作过程如下:

  1. 加载logcheckpoint文件的目录;
  2. 恢复最近一次的checkpoint文件;
  3. 重做最近一次checkpoint之后的所有logs
  4. 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文件系统中持久化后的元数据的恢复过程。

作者: 大圆那些事 发表于 2011-08-28 16:56 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"