2.2 架构
架构概述
在一个典型的 HA 集群中, 会在 2 个独立设备上分别配置 1 个 NameNode, 这个这个集群中就有了 2 个 NameNode. 避免单点失效的第一步.
在任何的时间点上, 严格的按照其中一个 NameNode 是活动状态(Active state), 另外一个 NameNode 是备用状态(Standby state). 在集群中, 活动的 NameNode 负责所有的客户端操作, 而备用 NameNode 仅仅是简单作为一个备份, 一旦出现问题, 可以进行一个快速的切换.
为了使备用 NameNode 的数据与活动 NameNode 的数据同步, 这两个 NameNode 节点通过一组独立的称作JournalNodes(JNs)
守护进程进行通讯.
当活动 NameNode 修改了任何数据, 都会把修改记录日志提交给JNs
. 备份 NameNode 就会收到来自JNs
的edits
, 他就会把这些这些修改写到自己的命名空间中.
在备灾发生的时候, 备份 NameNode 会确保自己已经从JNs
读到了所有的edits
, 然后把自己变成活动状态(Active state). 这些操作可以确保命名空间的状态可以完全与备灾发生前保持一致.
为了具有快速备灾的能力, 备份 NameNode 也必须有集群中所有数据块位置的最新信息. 为了实现这个需求, 所有的DataNode
会被配置 2 个 NameNode
的位置信息, 并且会发送数据块的位置信息和心跳给 2 NameNode
.
对正确的操作 HA 集群来说, 同一时间只能有一个活动状态的 NameNode
是至关重要的. 否则的话, 两个NameNode
的命名空间会迅速的变的有差异, 导致数据丢失和其他一些错误结果的风险.
为了确保数据不丢失和阻止所谓的脑裂情况(split-brain scenario)发生, JournalNodes(JNs) 甚至同一时间只允许单独一个 NameNode 可以被写入数据.
在备灾期间, 即将变成活动状态的 NameNode 会负责向 JournalNodes 写数据, 这将有效的阻止其他 NameNode 继续处于活动状态, 然后新的活动 NameNode 能够安全的处理备灾.
脑裂: 如果同时有两个活动的 NameNode, 这种情况就叫脑裂.