我们都经历过玩着玩着电脑,电脑突然关机或者出现问题等情况,而万一这时候你正在写什么重要的东西没有来得及保存就关机了怎么办,这就需要了SecondaryNameNode持久化
在说说持久化之前,先谈谈其他的内容:
瞬时状态:
保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态。
持久化:
将程序数据在瞬时状态和持久化状态之间转换的机制。
持久状态:
保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态。
运行的东西在内存运行是最快的,但是他内存小,贵,磁盘内存足够大,也便宜,但是运行效率慢远远不如内存快
NameNode掌握了一批元数据(元数据:描述数据的数据)
当我们的集群因断电或者特殊原因产生问题而关机的时候,问题解决重新开机,会去磁盘上读取元数据,恢复到断电前的状态
但是NameNode尽量不要进行持久化
原因是:
可以做:需求小,占用内存少,不影响计算效率
不可以做:NameNode本身工作已经很多,有可能在持久化的过程中宕机
注意:SecondaryNameNode永远无法取代NameNode的位置,他只是NameNode的一个热备
NN与SNN的工作机制
第一次启动NameNode格式化后,创建edits.log和fsimage文件。
如果不是第一次启动,直接加载编辑日志(edits.log)和镜像文件(fsimage)到内存。
edits.log 是存放系统在运行过程中产生的操作信息(你不操作他就不跑)
fsImage是文件系统的镜像文件(不管你操不操作,他都在跑)
NameNode存储元数据流程图
达到一定条件时NameNode会把edits.log和fsimage文件发送给SecondaryNameNode,SecondaryNameNode会进行打包合成为新的fsimage并且将合成后的fsimage写入到磁盘中
NameNode会把新的fsimage拿回来,和新产生的edits.log在次发送给SecondaryNameNode进行打包。。。。循环往复达到持续持久化的目的
\
如果在SecondaryNameNode合并的时候edits又超过了64兆
1、个别现象:另启动一个edits里面会同时存在两个edits(edits1和edits2)当fsimage会先和1进行合并,然后合并2
2、常态:就需要对集群进行调整,调大edits的大小
持久化的触发条件:
超过3600S或者edits的大小超过64M
总计:持久化就是将NameNode的元数据写入到磁盘中进行存储,当NameNode挂了之后重启的时候回去磁盘读取相应的元数据局,恢复集群的状态
断电:
持久化之前:再次启动,读取系统日志
持久化之后:读取磁盘中的数据,恢复状态
重复的关机:
NameNode个DateNode的通信机制 ----- 心跳机制(每隔3S,DateNode会向NameNode发送一次心跳就是报告DateNode自己额状态,1分钟没有心跳,则认为DateNode挂掉)
安全模式
1、恢复系统状态
2、检查DateNode的信息
3、有问题的DateNode进行恢复
1、在传输的过程中断电 — 数据丢失(如果数据特别重要,那只能提前进行预判进行相应的调整)
2、传输完成之后断电
当我的集群重新恢复之后,NameNode是不是回去读取元数据,对状态进行相应的回复
3、若DateNode恢复之后,如果有新的任务,根据情况,确定是否将新的文件上传
现在假设我们要上传一个文件到DateNode1,DateNode2,DateNode3 上
1.当上传block1的时候DateNode3挂掉,当前任务不会再上传给DateNode3
2.当DateNode3恢复之后,相当于一个新的节点并不会再继续给他分配任务
3.只有当重新上传一个文件的时候才会写入到恢复的DateNode3上
4.当要获取DateNode3上的挂掉之前的数据的时候,会去DateNode1和DateNode2上寻找,
相当于三个人的工作量当一个人走了后,工作量全部落在另外两个人身上