9 HadoopHA

一、背景

​ 在Hadoop集群中,NameNode是唯一负责存储元数据到数据块的映射的,如果NameNode挂掉,那么hdfs将不能使用,所以为了保证集群的可靠性,Hadoop2.0中提出了高可用的概念

二、原理

2.1 高可用原理

  1. 设置两个NameNode,一个正常工作(active),另一个充当active的热备(standby)

  2. active的namenode把edits的修改写入到日志管理器 (QJM,quorum journal manager) 中

  3. standby的namenode读取qjm中的日志,并且合并edits和fsimage

  4. 在高可用的hadoop中,每个NameNode都有对应的zkfc,如果zkfc1检测到自己的NameNode发生了假死,那么就会通知另一个zkfc2

  5. zkfc2强行杀死发生假死的NameNode

  6. zkfc2**本节点的NameNode,并切换为Active

    注:假死是指zkfc连接不上NameNode从而认为NameNode死亡,但是其他客户端可能可以连接到NameNode,为了防止脑裂的情况,必须把active的NameNode杀死,让其真正死亡

9 HadoopHA

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状态