一、namenode存储元数据的有三部分:
1、内存中,会存储所有元数据,但断电会丢失;
2、硬盘中,也会存储所有元数据,但由edits log+fsimage才是所有元数据;
(1) edits log日志文件中,存最新储增删改等操作,每当有这些操作,都会先存到日志文件中,但log有容量限制,并且容量不大(几十兆),每次快满时会把数据计算后刷入fsimage(在secondaryNameNode中操作);
(2) fsimage 镜像文件,镜像文件就是存储大部分元数据(并且是旧数据)。镜像文件的数据不是从内存中的元数据刷入的,因为这样会导致namenode的机器性能下降,而是每隔一段时间通过secondaryNameNode执行edits log的操作然后再刷入fsimage(具体步骤后面再说)
二、客户端写文件时namenode的流程
1、客户端想要写文件,先分块,然后会向namenode请求写各个文件块;
2、namenode收到写文件的请求后,先把写文件操作写入edits log中,然后把哪些datanode可以存储的信息返回给客户端;
3、客户端收到namenode的可以写入信息后,把各个文件数据块上传给相应的datanode节点。。各个数据块只上传一份到相应的datanode,至于会对这些数据块备份几份,则是由datanode根据配置进行备份,和客户端无关;
4、全部上传成功之后,客户端向namenode报告上传成功,此时该写入文件所增加或修改的元数据会更新到namenode的内存中(edits log在之前已经更新过了),此时edits log和fsimage不会进行更新,准确的说fsimage的数据不会被namenode更新,而是由secondaryNameNode更新;
三、namenode的edits log与fsimage是如何保证存储的元数据与内存中一致的?
请看:https://blog.csdn.net/qq_36951116/article/details/89704985