9 HadoopHA
一、背景
在Hadoop集群中,NameNode是唯一负责存储元数据到数据块的映射的,如果NameNode挂掉,那么hdfs将不能使用,所以为了保证集群的可靠性,Hadoop2.0中提出了高可用的概念
二、原理
2.1 高可用原理
-
设置两个NameNode,一个正常工作(active),另一个充当active的热备(standby)
-
active的namenode把edits的修改写入到日志管理器 (QJM,quorum journal manager) 中
-
standby的namenode读取qjm中的日志,并且合并edits和fsimage
-
在高可用的hadoop中,每个NameNode都有对应的zkfc,如果zkfc1检测到自己的NameNode发生了假死,那么就会通知另一个zkfc2
-
zkfc2强行杀死发生假死的NameNode
-
zkfc2**本节点的NameNode,并切换为Active
注:假死是指zkfc连接不上NameNode从而认为NameNode死亡,但是其他客户端可能可以连接到NameNode,为了防止脑裂的情况,必须把active的NameNode杀死,让其真正死亡
2.2 Zookeeper作用
现役NameNode的选择:Zookeeper通过分布式锁机制用于唯一的选择一个节点为active状态;
2.3 zkfc的作用
zkfc是hadoop的一个线程,充当zookeeper的客户端,也监视NameNode的状态,负责如下功能:
1. 健康检测:zkfc定期检测自己监控的NameNode,如果NameNode能及时回复,zkfc就认为该节点健康的;否则认为是非健康的;
2. Zookeeper会话管理:当本地NameNode是健康的,zkfc保持在Zookeeper中打卡的会话。如果本地NameNode处于active状态,zkfc也保持一个特殊的znode锁,改锁使用了zookeeper对短暂节点的支持,如果会话中止,锁节点将自动删除;
ookeeper对短暂节点的支持,如果会话中止,锁节点将自动删除;
3. 基于Zookeeper的选择:如果本地NameNode是健康的,且zkfc发现没有其它节点持有znode锁,它将自己获取该锁,并将本地的NameNode切换为active状态