Hadoop之高可用原理

来源:互联网 发布:淘宝店铺怎么快速升钻 编辑:程序博客网 时间:2024/04/29 20:34

我们首先看一下普通的HA, 由于发生故障时需要依赖于管理员手动切换NameNode,由于管理员不可能随时随地监控集群,所以自动主备切换很有必要。


一 HA整体架构

HA总共有2个NameNode, ActiveNameNode和StandbyNameNode

,2个NameNode互为主备,处于Active状态的是主NameNode,处于Standby状态的是备NameNode,只有主NameNode才能对外提供服务。

主备切换有两种方式:

手动切换:配置好了配置文件,我们需要首先启动JournalNode,然后可以看到QuorumPeerMain进程启动;格式化一个NameNode,然后启动2个NameNode和所有DataNode,然后StandbyNameNode进行元数据同步,这时候都是Standby状态,我们需要手动切换某一个NameNode成Active状态

自动切换:通过使用zookeeper来实现NameNode自动切换。通过

执行命令hdfszkfc -formatZK来启动ZKFailoverController组件,并格式化ZooKeeper,如果之前没有在Standby同步元数据还需要同步元数据。

ZKFailoverController主要用于总体控制主备的切换,在启动过程中会初始化HealthMonitor和ActiveStandbyElector组件,并且向这两个组件注册回调函数。

 

HealthMonitor: 主要是监控NameNode的健康状态,一旦检测到NameNode发生变化,就会回调ZKFailoverController的方法进行主备选举

ActiveStandbyElector: 主要是进行自动的主备选举,内部封装了ZK的逻辑,一旦ZK主备选举完成,就会调用ZKFailoverController方法进行主备切换。

 

主备切换流程图示:



二 主备切换源码分析

DFSZKFailoverController: 。,

1首先初始化zookeeper:调用initZK()方法初始化zookeeper,根据配置的zookeeper地址列表,进行初始化,并初始化ActiveStandbyElector,

初始化ActiveStandbyElector,会注册回调ElectorCallbacks,并且创建于zookeeper的连接,注册watcher.而ActiveStandbyElector又实现了StateCallback和StringCallback接口,分别在调用zkCilent.exists和zkClient.create通过processResults对其调用结果处理

2格式化zookeeper:如果带有参数-formatZK,那么此时就会格式化

zookeeper.

3检测是否配置fence

4初始化RPC: 调用initRPC初始化PRC

5初始化HealthMonitor:调用initHM,初始化HealthMonitor.并添加回调,然后以后台进程启动HealthMoinitor,去做健康检查。本质就是检测NameNode的状态,ZKFailoverController接收回调状态,并进行重新选举,如果状态健康,则参加选举,如果不健康,则退出选举。

会删掉zookeeper上znode节点信息,然后注册在ActiveStandbyElector的watcher会检测到删除节点的事件,然后执行     joinElectionInternal去创建临时节点,进行抢锁。

是否创建成功是在processResult中捕获的,如果创建成功,则当前节点转换为Active(becomeActive)

becomeActive时候会判断zookeeper上是否存在原Active NameNode创建的ActiveBreadCrumb节点,如果有则进行fence操作,先由ZK

FailoverController执行gracefulFence,如果不行则执行NodeFence的

fence方法,然后将当前节点信息写入ActiveBreadCrumb节点,并将当前状态转化为Active

之前的ActiveNameNode,HealthMonitor一直循环检测NameNode健康状态,一旦健康之后,将再次加入选举。