Hadoop权威指南说 -
每个 Namenode 运行一个轻量级的故障转移控制器进程,其工作是监视其 Namenode 的故障(使用简单的心跳机制)并在 namenode 发生故障时触发故障转移。
为什么一个名称节点可以运行一些东西来检测它自己的故障?
谁给谁发送心跳?
这个过程在哪里运行?
它如何检测名称节点故障?
它通知谁进行过渡?
ZKFailoverController ( ZKFC ) 是一个新组件,它是一个ZooKeeper客户端,它还监视和管理 NameNode 的状态。每台运行NameNode的机器也运行一个ZKFC,ZKFC负责:
健康监控- ZKFC使用健康检查命令定期ping 其本地NameNode 。只要 NameNode 及时响应健康状态,ZKFC 就认为该节点是健康的。如果节点崩溃、冻结或以其他方式进入不健康状态,健康监视器会将其标记为不健康。
ZooKeeper 会话管理- 当本地 NameNode 健康时,ZKFC在 ZooKeeper 中保持一个打开的会话。如果本地 NameNode 处于活动状态,它还持有一个特殊的“锁”znode。此锁使用 ZooKeeper 对“临时”节点的支持;如果会话过期,锁节点将被自动删除。
基于 ZooKeeper 的选举——如果本地NameNode是健康的,并且ZKFC看到当前没有其他节点持有锁 znode,它会自己尝试获取锁。如果成功,那么它就“赢得了选举”,并负责运行故障转移以使其本地NameNode处于活动状态。
看看这个Apache PDF,它是HDFS-2185 JIRA 问题的一部分
幻灯片 16 从
http://www.slideshare.net/cloudera/hdfs-update-lipcon-federal-big-data-apache-hadoop-forum
Hadoop中的自动Namenode故障转移过程:
在典型的 HA 集群中,两台独立的机器被配置为 NameNode。在任何时间点,只有一个 NameNode 处于 Active 状态,而另一个处于 Standby 状态。Active NameNode 负责集群中的所有客户端操作,而 Standby 只是充当从属节点,保持足够的状态以在必要时提供快速故障转移。
为了使备用 Namenode 保持其状态与 Active Namenode 同步,两个节点都与一组称为JournalNodes (JN) 的单独守护进程通信。
当主动节点执行任何命名空间修改时,它会将修改记录持久地记录到这些 JN 中的大多数。Standby 节点从 JN 中读取这些编辑并应用于它自己的名称空间。
在发生故障转移的情况下,备用节点将确保它已从 JounalNodes 读取所有编辑,然后再将其提升为活动状态。这可确保在发生故障转移之前完全同步命名空间状态。
对于 HA 集群来说,一次只有一个NameNode处于活动状态是至关重要的。ZooKeeper已用于避免脑裂情况,因此名称节点状态不会因故障转移而发生分歧。
幻灯片 8 来自:http ://www.slideshare.net/cloudera/hdfs-futures-world2012-widescreen
总结: Name Node 是 Daemon & Failover controller 是 Daemon。如果名称节点守护程序失败,故障转移控制器守护程序会检测并采取纠正措施。即使整个机器崩溃,ZooKeeper服务器也会检测到它,并且锁会过期,其他 Standby 名称节点将被选为 Active Name 节点。