SecondaryNamenode 持久化

什么是持久化

为了保证元数据的安全,将内存中的数据存放到磁盘中就是持久化。
元数据:描述数据的数据

为什么要使用持久化

当我们的集群因断电等特殊原因产生问题,数据丢失的时候,等重新开机时,可以去磁盘上读取元数据,把数据恢复到断电前的状态

NameNode不能进行持久化的原因

由于NameNode自身工作已经很多,有可能在持久化过程中宕机,所以不推荐使用NameNode去进行持久化

持久化的实现流程

在系统启动时会在内存中产生俩个文件:
edits.log 存放系统在运行过程中产生的操作信息
fsimage 存放系统信息

持久化的实现
开始运行时候,edits和fsimage会不断地产生信息,SecondaryNamenode会将俩个文件进行合并,组合成一个新的fsimage文件然后写入磁盘,写入磁盘之后新的fsimage文件会再次回到内存中,在合并和写入的过程中,也会有新的信息不断产生,然后会继续进行合并,循环下去。

持久化的触发条件

超过3600s或者edits文件超过64M

一个需要特别注意的点:当SecondaryNamenode合并时候,edits又超过64M,这个时候应该怎么办呢?

1.如果只是个别现象,再启动一个edits,里面会同时存在俩个edits,edits1和edits2,fsimage会先和1合并,然后合并2。
2.如果是常态的话,就需要对集群进行调整,调大edits的大小

如果发生断电数据丢失怎么办

持久化之前 —— 再次启动,读取系统日志
持久化之后 —— 读取磁盘中的数据

安全模式

持久化是安全模式中恢复数据的一种机制

1.恢复系统状态
2.检查DataNode的信息
3.对有问题的DataNode进行修复
1)在传输的过程中断电 数据丢失 如果数据特别重要,只能提前进行预判,进行相应的调整
2)在传输完成后断电 数据不会丢失 当我的集群重新恢复之后,NameNode会去读取元数据,然后进行恢复(内存)
3)如果DataNode出现问题 在DataNode恢复之后,如果新的任务,根据情况,确定是否将新的文件上传