思考:类似导航的NameNode 中的元数据是存储在哪里的?
如果是存在磁盘,效率低下,如果是内存,服务器宕机后数据会消失,集群无法工作,因此产生在磁盘中备份元数据的FsImage。
但是如果内存数据更新后,FsImage的数据必须也要及时更新(防止宕机后数据不一致),效率会受影响,因此,引入 **Edits 文件(只进行追加操作,效率很高)**每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中。这样,一旦 NameNode 节点宕机断电,可以通过 FsImage 和 Edits 的合并,合成元数据。
服务器需要定时给edits中数据 和FsImage数据进行合并,这个工作给不同节点的SecondaryNamenode来做
第一阶段:NameNode 启动
(1)第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode 记录操作日志,更新滚动日志。
(4)NameNode 在内存中对元数据进行增删改。
第二阶段:Secondary NameNode 工作
(1)Secondary NameNode 询问 NameNode 是否需要 CheckPoint。直接带回 NameNode
是否检查结果。
(2)Secondary NameNode 请求执行 CheckPoint。
(3)NameNode 滚动正在写的 Edits 日志。
(4)将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。 (5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件 fsimage.chkpoint。
(7)拷贝 fsimage.chkpoint 到 NameNode。
(8)NameNode 将 fsimage.chkpoint 重新命名成 fsimage。
CheckPoint 时间设置
1、通常情况下,SecondaryNameNode 每隔一小时执行一次。
2、一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行一次。
DataNode工作机制
(1)一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据
本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。 (2)DataNode 启动后向 NameNode 注册,通过后,周期性(6 小时)的向 NameNode 上报所有的块信息。
(3)心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块
数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,
则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
数据完整性
主要是通过一定的校验算法(crc32)对数据做一致性处理。