您的位置:首页 > Web前端 > Node.js

Ambari—HDFS配置NameNode HA高可用原理和操作步骤(一)

2018-02-27 14:36 1546 查看

NameNode HA原理

在典型的HA集群中,两台独立的机器被配置为NameNode。在工作集群中,NameNode机器中的一个处于Active状态,另一个处于Standby状态。Active NameNode负责群集中的所有客户端操作,而Standby充当从服务器。Standby机器保持足够的状态以提供快速故障切换(如果需要)。为了让Standby节点保持其与Active节点的状态同步,两个节点都与一组名为JournalNodes(JNs)的独立守护进程进行通信。当Active节点执行任何namespace修改时,Active节点将修改记录持久地记录到这些JN中的大多数中。Standby节点从JN读取edits并持续监视JN以更改edit log。一旦Standby节点观察edits后,会将这些edits应用于其自己的namespace。当使用QJM时,JournalNodes将执行shared editlog storage。在故障切换事件中,Standby服务器确保在将自己提升为Active状态之前,已从JounalNodes中读取所有edits。(这种机制确保在故障切换完成之前namespace状态已完全同步。)

注意
HA配置中不需要Secondary NameNode,因为Standby节点还执行Secondary NameNode的任务。
为了提供快速故障切换,Standby节点还需要有关群集中blocks块位置的最新信息。为了获得有关block位置的准确信息,DataNodes配置了两个NameNode的位置,并向两个NameNode机器发送block位置信息和心跳。

HA群集的正确操作对于一次只有一个NameNode应该处于Active状态至关重要。如果不这样做,会导致namespace状态在两个NameNode计算机之间快速发生分歧,从而导致潜在的数据丢失。(这种情况被称为裂脑情景split-brain scenario。)为了防止裂脑方案,JournalNodes一次只允许一个NameNode作为一个writer。在故障切换期间,要选择成为active状态的NameNode将接管写入JournalNodes的角色。此过程可防止另一个NameNode继续处于活动状态,从而让新的Active节点安全地继续进行故障切换。在HA群集中,Standby NameNode还执行namespace 状态的检查点。因此,请勿在HA群集中部署Secondary NameNode,CheckpointNode或BackupNode。

注意
必须至少有三个JournalNode守护进程,因为edit log修改必须写入大多数JN。这让系统可以容忍单台机器的故障。您也可以运行三个以上的JournalNodes,但为了增加系统可以容忍的故障次数,您必须运行奇数个JN(即3,5,7等)。请注意,在运行N个JournalNodes时,系统最多可以承受(N-1)/ 2次故障并继续正常运行。
建议部署:
服务组件管理节点 MN数据节点 DN
  MNMNDNDNDN
      
HDFSNameNode
YY   
 ZKFailoverController
YY   
 DataNode
  YYY
 JournalNode
  YYY
ZKFailoverController(ZKFC)是一个ZooKeeper客户端,用于监视和管理NameNode的状态。运行NameNode服务的每台机器也运行ZKFC。ZKFC负责:
健康监控: ZKFC定期使用健康检查命令对其本地NameNode进行ping操作。
ZooKeeper会话管理:当本地NameNode健康时,ZKFC在ZooKeeper中保持会话打开状态。如果本地NameNode处于active状态,则它还包含一个特殊的“lock”znode。该锁使用ZooKeeper对“ephemeral”节点的支持; 如果会话过期,锁定节点将被自动删除。
基于ZooKeeper的选举:如果本地NameNode健康并且其他节点当前没有锁znode,ZKFC将尝试获取该锁。如果ZKFC成功,那么它“赢得选举”并将负责运行故障切换以使其本地NameNode处于 active状态。故障切换过程:首先,必要时先隔离前一个active,然后本地NameNode转换为active状态。



NameNode HA部署

1.1 先决条件

(1)验证群集中至少有三台主机,并且至少运行三台Apache ZooKeeper服务器。
(2)验证Hadoop分布式文件系统(HDFS)和ZooKeeper服务未处于维护模式。
如果HDFS或ZooKeeper服务处于维护模式,则NameNode HA向导将无法成功完成。
注意:HA不能接受包含下划线(_)的HDFS集群名称。

个人先停用HBase再继续后面操作

1.2 操作步骤

(1)在Web主界面中,选择服务> HDFS。
(2)单击服务操作,然后单击启用NameNode HA。
(3)Enable HA向导启动。该向导介绍了设置NameNode高可用性所需的一系列自动和手动步骤。
(4)在“Get Started”页面上,输入一个名称Nameservice ID(自己命名,如:mycluster),然后单击 Next。
 


HA设置完成后,您使用此Nameservice ID而不是NameNode FQDN。
(5)在“ Select Hosts”页面上,选择其他NameNode和JournalNodes的主机,然后单击“ Next”,JournalNodes数量一般为奇数个,建议配置在DataNode节点上。
 


(6)在Review页面上,确认您的主机选择并单击Next:
 


(7)按照所需手动步骤的说明:在NameNode页面上创建检查点,然后单击Next
 


您必须登录到当前的 NameNode主机,然后运行命令将NameNode置于安全模式并创建检查点。
(8)在“ Configure Components”页面上,监视配置进度条,然后单击Next:
 


(9)按照所需手动步骤的说明:初始化JournalNodes页面,然后单击下一步:
 


(10)按照所需手动步骤的说明:初始化JournalNodes页面,然后单击Next:
 


您必须登录到当前的 NameNode主机才能运行该命令来初始化JournalNodes。
(11)当Ambari检测到成功并且窗口底部的消息变为时 JournalNodes initialized,单击Next
(12)在“ Start Components”页面上,将进度条作为ZooKeeper服务器和NameNode启动进行监视; 然后单击Next:
 


(13)在所需的手动步骤上:初始化NameNode HA元数据 页面:使用页面上的说明完成每个步骤,然后单击 Next。
 


对于这一步,您必须登录到当前的 NameNode和附加的 NameNode。确保您已登录到每个命令的正确主机。完成每个命令后,单击OK确认。
(14)在Finalize HA Setup页面上,随着向导完成HA设置,监视进度条,然后单击Done 以完成向导。
 


Web UI重新加载后,您可能会看到一些警报通知。等待几分钟,直到所有服务重新启动。
(15)必要时使用Web重新启动任何组件。
(16)如果您使用的是Hive,则必须手动将Hive Metastore FS根目录更改为指向Nameservice URI而不是NameNode URI。您在“Get Started”步骤中创建了Nameservice ID。
步骤:
a、在安装Hive Metastore的主机上查找当前FS根目录:
hive --config /etc/hive/conf/conf.server --service metatool -listFSRoot
输出应该看起来类似于
Listing FS Roots... hdfs://<namenode-host>/apps/hive/warehouse
b、更改FS根目录
$ hive --config /etc/hive/conf/conf.server --service metatool -updateLocation <new-location><old-location>
例如,如果您的Nameservice ID是mycluster,则输入:
$ hive --config /etc/hive/conf/conf.server --service metatool -updateLocation hdfs://mycluster/apps/hive/warehouse hdfs://132.bd:8020/apps/hive/warehouse
输出看起来类似于:
Successfully updated the following locations...Updated X records in SDS table
(17)调整或检查下您的环境ZooKeeper故障切换控制器重试设置。
a、浏览:服务> HDFS>配置>高级core-site。
b、设置的参数:
ha.failover-controller.active-standby-elector.zk.op.retries=120

注:如果因安装失败问题,想删除界面上额外的一个NameNode,只能通过Restful接口删除,举例:
在Ambari Server主机上运行命令:
curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari" -i -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/<CLUSTER_NAME>/host_components?HostRoles/component_name=NAMENODE
显示包含两个NameNode,删除其中一个:
curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari" -i -X DELETE <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/<CLUSTER_NAME>/hosts/<ADDITIONAL_NAMENODE_HOSTNAME>/host_components/NAMENODE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: