在一个典型的HA集群中,两个或更多的独立机器被配置为NameNodes。在任何时间点上,正好有一个NameNode处于活动状态,其他的NameNode处于待机状态。Active NameNode 负责集群中的所有客户机操作,而Standbys 只是作为worker,保持足够的状态,以便在必要时提供快速故障切换。
为了让Standby 节点与Active节点保持状态同步,这两个节点都会与一组独立的守护进程进行通信,这些守护进程被称为 "JournalNodes"(JNs)。当Active节点执行任何命名空间修改时,它就会持久地将修改的记录记录记录到这些JNs中的大部分。Standby节点能够读取这些JNs中的编辑,并时刻关注这些JNs对编辑日志的修改。当Standby节点看到这些编辑后,它会将其应用到自己的命名空间中。在发生故障切换时,Standby节点将确保它已经读取了来自JournalNodes的所有编辑,然后再将自己提升到Active状态。这样可以确保在故障切换发生之前,命名空间状态完全同步。
为了提供快速故障切换,还需要Standby节点掌握集群中块位置的最新信息。为了实现这一点,DataNode配置了所有NameNode的位置,并向所有的NameNode发送块位置信息和心跳信息。
对于HA集群的正确运行来说,一次只能有一个NameNode处于Active状态是至关重要的。否则,命名空间的状态会很快在这两个节点之间发生分歧,有可能造成数据丢失或其他不正确的结果。为了保证这个属性,并防止所谓的 "分裂脑的情况",JournalNode将永远只允许一个NameNode作为一个写入器。在故障切换期间,将成为活动状态的NameNode将简单地接管向JournalNode写入的角色,这将有效地阻止另一个NameNode继续处于活动状态,允许新的Active安全地进行故障切换。
为了部署HA集群,您应该准备以下内容:
- NameNode machines: 运行 Active 和 Standby NameNode 的机器应该具有同等的硬件,并与非 HA 集群中使用的硬件相当。
- JournalNode machines:JournalNode的机器上运行JournalNode守护进程。JournalNode 守护进程相对较轻,因此这些守护进程可以合理地与其他 Hadoop 守护进程(例如 NameNodes、JobTracker 或 YARN ResourceManager)搭配在一起运行的机器上。注意:必须至少有3个JournalNode守护进程,因为编辑日志修改必须写到大部分的JN。这将使系统能够容忍单机故障。你也可以运行3个以上的JournalNode,但为了实际增加系统可以容忍的故障数量,你应该运行奇数的JN,(即3、5、7等)。注意,当运行N个JournalNodes时,系统最多可以容忍(N - 1)/2的故障,并继续正常运行。
请注意,在HA集群中,备用NameNode也会执行命名空间状态的检查点,因此在HA集群中没有必要运行SecondaryNameNode、CheckpointNode或BackupNode。事实上,这样做是会出错的。这也允许正在重新配置一个非 HA 启用的 HDFS 集群的人重新配置为 HA 启用的 HDFS 集群,以重新使用之前专门用于 Secondary NameNode 的硬件。(非HA SecondaryNameNode)