0%

HDFS NameNode HA 实现综述

通过 JN 集群共享 NN 节点状态,通过 ZKFC 选举active NN,自动监控 NN 节点状态,自动切换


转载来源

1
2
3
作者:lipeng_bigdata
链接:https://blog.csdn.net/lipeng_bigdata/article/details/53637562
来源:CSDN

原理

HDFS 中 NameNode 等的 HA 是基于 ZooKeeper 实现的

它应用了ZooKeeper集群的如下功能或特性

  1. 只要半数以上节点还存活,就继续能对外提供服务
  2. ZooKeeper通过Paxos算法提供了leader选举功能,其它follower learn leader
  3. ZooKeeper提供了watcher机制,只要ZooKeeper上znode增减,或内容发生变化,或其子znode有增减,客户端都可以通过注册的watcher获得通知
  4. ZooKeeper提供了持久化节点和临时节点,尤其是临时节点EPHEMERAL,其在ZooKeeper客户端连接断掉后,会自动删除

正是基于ZooKeeper的上述特性,HDFS的NameNode实现了HA,
NameNode的状态大致可分为Active和Standby两种,
NameNode竞争在ZooKeeper指定路径上注册临时节点,
将自己的host、port、nameserviceId、namenodeId等数据写入节点,
哪个NameNode争先写入成功,哪个就成为Active NameNode。
然后,会有后台工作线程周期性检查NameNode状态,
并在一定条件下(比如Active NameNode节点发生故障等)发生竞选,
由NameNode再去竞争,实现故障转移和状态切换。

上述就是HDFS NameNode HA实现的大体思路。

而HDFS NameNode HA的架构和实现细节是怎么样的?下面我来介绍下。

实现

首先上一张Hadoop HDFS NameNode HA的设计图,如下:

简单描述下这张图

首先,NameNode(NN)、DataNode(DN)均是HDFS中的组件或节点,NN有两个,分为Active和Standby状态,DN有多个,DN周期性向Active和Standby做数据块汇报

其次,处于中间位置的,实现HDFS NameNode HA最关键的组件是FailoverController,它是运行在NameNode节点上的守护进程,将Active NN节点的信息通过竞争的方式注册到ZooKeeper上,并实现以下三个基本功能

1) 有一个后台线程,周期性的检查NameNode的健康状况,即粗的红色拐弯箭头的Monitor Health,触发状态选举等

2) 定期保持与ZooKeeper的心跳,完成Leader选举(即Active节点选举)和检查Active NN ZNode节点状态等工作,即最上面与ZooKeeper交互的蓝色箭头

3) 向NameNode发送一些命令,完成状态切换

所以,NN HA 的主体思路就是

1、NN竞争在ZooKeeper上注册,即create一个临时节点,写入NN的host、port、nameserviceId、namenodeI等信息,那个写入成功,那个就是Active状态;

2、注册成功后,通过create后的watcher机制,FailoverController会发送命令给各个NN,让其确定各自状态和职责;

3、Monitor Health会周期性连接NN,检查NN状态,并由可能触发重新选举,即重复1-2;

4、FailoverController会与ZooKeeper保持心跳,注册的临时节点消失后,也会触发重新选举。

那么,HDFS 是如何实现 NameNode HA 的呢?对应上图,Hadoop 中实现了以下模型

上图的三个关键组件即是:

1、DFSZKFailoverController(继承自抽象类ZKFailoverController):ZKFC,故障转移控制器,守护进程,负责总体故障转移和命令发布;

2、ActiveStandbyElector:Active、Standby选举器,实现选举功能;

3、HealthMonitor:健康监视器,实现NN状态的定时监控。

上述组件各自是如何实现的,可以参阅下方链接