官方文档翻译,官方链接。
翻译水平有限,且以学习为主,请谅解和提意见。
转载请注明出处!!!
目标
这篇指南提供了一份HDFS HA特性,以及如何配置和管理一个基于QJM的HDFS HA集群。
这篇文档假设读者对HDFS集群组件和节点类型有所了解。关注更详细信息,请参见HDFS架构文档。
注意:使用QJM或一般共享存储
该指南讨论如何基于QJM配置和使用HDFS HA,在活动的NameNodes和备用的NameNode之间共享编辑日志。除了使用QJM,还可以使用HFS作为共享存储,在配置HDFS HA中使用。
背景
Hadoop2.0.0之前,NameNode在HDFS集群中是一个故障单点。每个集群只有一个NameNode,如果机器或进程不可用,致使整个集群不可用,直到NameNode重启或者在另一台机器上部署。
影响HDFS集群整体可用性,主要在两方面:
- 非计划内事件,例如机器crash,集群将不可用,直至重启NameNode
- 计划内事件,比如NameNode机器在停机时间窗口的软硬件升级
通过提供在同一个集群运行两个冗余的NameNode,使用Active/Passive机制配置一个热备份,HDFS的HA特性解决了上述问题。在机器crash场景下,或者管理员为计划维护而优雅地发起故障转移操作场景下,允许快速地转移到一个新的NameNode。
架构
在典型的HA集群,两台独立的机器配置成NameNode。在任何时刻,都是一个NameNode是active状态,另一个是standby状态。Active NameNode负责在集群中负责所有客户端的操作,而Standby作为一个slave进行简单活动,必要时维护足够的状态提供快速故障转移。
为了Standby节点状态保持与Active节点同步,两个节点间使用一组被称为JournalNodes的独立守护进程进行通讯。当Active节点执行任何的namespace修改时,在多数JNs上持久化这条修改记录日志。Standby节点有从JNs读取这些记录的能力,并且持续监视这个编辑日志的变化。当Standby节点看到这些记录,将应用这些到自己的namespace。在故障转移事件中,在升级为Active状态之前,Standby确保从JNs读取所有的记录。这保证了在一个故障转移发生前,namespace状态是完全同步的。
为了提供快速地故障转移,Standby节点拥有最新的集群block位置信息是必须的。为了实现这个目标,DataNode使用两个NameNode位置信息进行配置,并发送block位置信息和心跳。
一个HA集群在某一时刻有且仅有一个NameNode是Active的正确操作是至关重要的。否则,namespace状态将很快在两个Namenode之间产生分歧,数据丢失或其它不正确结果。为了确保这个特性并阻止脑裂现象,JournalNode将永远仅允许一个NameNode在某一时刻可以写入。故障转移期间,成为Active的NameNode将接管JournalNode的写角色,将有效阻止其它NameNode持续处于Actvie状态,允许新的Active安全地处理故障转移。
硬件资源
为了部署HA集群,将准备如下资源:
- NameNode机器 – 运行Active和Standby的机器,配置相同。
- JournalNode机器 – 运行JournalNode的机器。JournalNode守护进程相对轻量,因此可以分配在其它Hadoop守护进程运行的机器上,例如NameNode,JobTracker,或者Yarn的ResourceManager。注意:必须至少有3个JournalNode进程,且编辑日志修改必须写入多数JNs中。这将允许系统容忍单台机器出现故障。可以运行多于3个JournalNode,为了实际增加系统可容忍故障节点数,需要运行奇数个JN。注意当运行N个JournalNode,系统至多可以容忍(N-1)/2个节点数出现故障,并继续提供服务。