目的
背景
架构
一个典型的HA集群,NameNode会被配置在两台独立的机器上.在任何的时间上,一个NameNode处于活动状态,而另一个在备份状态,活动状态的NameNode会响应集群中所有的客户端,同时备份的只是作为一个副本,保证在必要的时候提供一个快速的转移。
为了备份节点和活跃的节点状态同步,当前的实现要求两个节点可以连接到一个共享设备上的目录(例如网络存储的网络文件系统)。这个架构会在以后的版本中实现。
当任何的namespace被活动状态的节点修改,他会记录在共享文件夹的edit日志文件中。备份节点观察共享文件夹的edit,他允许拥有自己的namespace。在执行自动迁移之前,备份节点在转换为活动的节点之前确认已经读取到共享存储当中所有的edit。这将确保和迁移之前完全同步。
为了提供一个快速的转移,备份NameNode要求保存着最新的block在集群当中的信息。为了能够得到这个,DataNode都被配置了所有的NameNode的地址,并且发送block的地址信息和心跳给两个node。
保证只有一个活跃的NameNode在集群当中是一个十分重要的一步。否则namespace状态在两个节点间不同会导致数据都是或者其他一些不正确的结果。为了确保这个,防止所谓split - brain场景,管理员至少为共享存储配置一个过滤方法。故障转移期间,如果前一个活跃节点不再是活跃状态那么他将无法通过过滤,过滤过程负责切断前一活跃的节点写入共享存储edits的权限。这会有效防止其他NameNode持续处于活跃状态,允许新的活动节点安全进行故障转移。
硬件资源
为了部署一个HA集群,你应该按照以下准备:
NameNode机器:机器负责运行活动和和备份的NameNode,两台机器应该有着完全一样的硬件,同样的硬件应该和没有HA的硬件完全一致。
共享存储:需要有一个共享文件夹并且所有的NameNode机器都有读写权限。通常这是一个远程文件,支持NFS并安装挂载在每个NameNode机器。目前只有单一的共享edits文件夹被支持。因此,系统的可用性被共享的edits文件夹所限制,为了解决这个单点则需要edits文件夹的冗余。具体来说,多个网络的存储路径和冗余存储本身(磁盘、网络、和权力)。因为这个原因,建议共享存储服务器是一个高质量的专用NAS设备而不是一个简单的Linux服务器。
注意:在一个HA集群中备份的NameNode也要坚持namespace的状态,那么就没有必要去运行一个Secondary NameNode, CheckpointNode, 或者是BackupNode在集群当中,事实上这么做的话有可能会是一个错误。为了允许有一个重新配置的非HA的集群可以实现HA,并且实现硬件的重用,所以把以前的secondary NameNode的机器作为这样一个机器。
部署
配置综述
HA的配置向后兼容允许既存的单NameNode配置在没有任何改动的情况下工作,新的配置被设计成集群当中的所有节点拥有着相同的配置并且并不需要为不同的机器设置不同的配置文件。
如HDFS Federation,HA集群重用nameserviceID去标示一个HDFS实例这个实例可能实际上包含了很多的HA NameNodes。另外一个新的抽象叫做NameNode ID被添置到了HA。在集群中每个不同的NameNode有着不同的NameNode ID 去标示他,所有的NameNode采用同一个配置文件,相关的配置参数都被用nameservice ID和NameNode ID作为后缀。
配置细节
dfs.ha.namenodes.[nameservice ID] -为在nameservice中的每一个NameNode设置唯一标示符。
配置一个逗号分隔的 NameNode ID列表。这将是被DataNode识别为所有的NameNode。例如,如果使用“mycluster”作为nameservice ID,并且使用“nn1”和“nn2”作为NameNodes标示符,你应该如下配置:<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
注意:在每一个nameservice中最多只能有两个NameNode可以被配置
dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 每个NameNode监听的完整正确的RPC地址
对于先前配置的NameNode ID,设置全地址和IP端口的NameNode进程,注意配置两个独立的配置选项例如:
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</pr