首先我们要知道,在NameNode中有三种数据的形式:
- 内存元数据:内存中有一份完整的元数据]
- 磁盘元数据镜像文件FSImage:磁盘有一个"准完整"的元数据镜像文件
- 数据操作日志文件edit:用于衔接内存metadata和磁盘元数据镜像fsimage之间的日志
当客户端对hdfs的文件进行新增或者修改操作的时候,操作首先会被记入到edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存的meta.data中
为了说明他们之间是如何工作的,请看下面的示意图:
- 1:SecondaryNameNode定期通知Namenode进行checkpoint的操作
- 2:NameNode将这区间的所有的操作日志都保存到日志003中,
- 3:NameNode将fsimage和操作日志合并之后的003日志一起发送给SecondaryNameNode
- 4:SecondaryNameNode通过镜像文件和操作日志,恢复成这个时间段的内存数据
- 5:将合并之后的meta data进行序列化发送给NameNode.
- 6:如果NameNode宕机了的话,那么,磁盘中的镜像文件也会恢复成上一个CheckPoint时间段的内存
虽然可以通过设置CheckPoint的时间,将此机制进行的更频繁,但是如果一旦宕机,仍然避免不了数据的丢失…