写的不到位的地方,欢迎评论指出不足之处
1、任何对文件系统元数据产生修改的操作,NameNode 都会使用一种称为 EditLog 的事务日志记录下来
2、使用 FsImage 存储内存所有的元数据状态
3、使用本地磁盘保存 EditLog 和 FsImage
4、EditLog 具有完整性、数据丢失少,但恢复速度慢、并有体积膨胀风险
5、FsImage 具有恢复速度快、体积与内存数据相当,但不能实时保存、数据丢失多
6、NameNode 使用了 Fslmage + EditLog 整合的方案
7、滚动将增量的 EditLog 更新到 Fslmage,以保证更近时点的 Fslmage 和更小的 EditLog 体积
补充
- 日志文件
- 操作
记录实时发生的增删改的操作:mkdir /abc
- 优点
- 完整性比较好
- 缺点
- 加载恢复数据:慢、占空间
- 方式
- append 向文件追加内容、实时
- 比如
- 内存4G、运行10年
- 断电后进行恢复可能需要5年
- 内存不会溢出
- 注
- 日志容量过大,可能需要5年时间恢复,明显不适合单独使用日志
- 操作
- 镜像、快照、dump、db
- 操作
内存全景数据基于某一个时间点做的向磁盘的溢写
- 优点
- 恢复速度快过日志文件
- 缺点
- 由于是间隔,容易丢失一部分数据
- 方式
间隔(小时、天)(相对合适,需要考虑 I/O 慢)
- 比如
- 假设容量400MB上限,当满的时候就删
- 操作
HDFS采用两种日志合并方式
- 日志文件
- EditsLog
- 当体积、记录少时有优势
- EditsLog
- 镜像/快照
- FsImage
- 若能更快的滚动更新时点的数据有优势(半小时、1小时)
- FsImage
- SecondaryNameNode(合并日志)
- 优势
- 最近时点 FsImage + 增量 EditsLog
- 方式
- 当前10点,FsImage 9点 + 9点 - 10点的增量 EditsLog,断电后
- 加载 FsImage
- 加载 EditsLog
- 当前10点,FsImage 9点 + 9点 - 10点的增量 EditsLog,断电后
- 问题
FsImage 时点是怎么滚动更新的?
NameNode 8点溢写,1小时后,9点溢写(但会导致 I/O出现问题)
假设8点时,第一次开机,只写一次 FI,到9点时,只需要将 EL 8点到9点的日志记录写入到 FI 中,FI 的数据就会更新成9点
读取一个 EL 日志,再读 FI,内存再进行追加,再重新写一个完整的 FI,其实并没有效率
- 解
- 需要寻求另一台机器进行合并的工作,此时 NameNode 可专注自身服务当中
- 备注
- 在非 Ha 模式下,SNN 一般是独立的节点,周期完成对 NameNode 的 EditLog 向 Fslmage 合并,减少 EditLog 大小,减少 NameNode 启动时间
- 根据配置文件设置的时间间隔 fs.checkpoint.period 默认3600秒
- 根据配置文件设置 editslog 大小 fs.checkpoint.size 规定 edits 文件的最大值默认是64MB
- 图解说明(方式过于简易,企业不使用)

- 优势
版权声明:本文为lian582796149原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。