当一个NameNode被成功切换为Active状态时,它会在ZK内部创建一个临时的znode,在znode中将会保留当前Active NameNode的一些信息,比如主机名等等。当Active NameNode出现失败或连接超时的情况下,监控程序会将ZK上对应的临时znode进行删除,znode的删除事件会主动触发到下一次的Active NamNode的选择。
因为ZK是具有高度一致性的,它能保证当前最多只能有一个节点能够成功创建znode,成为当前的Active Name。
现在查看zookeeper的znode信息:
[root@node1 ~]# /etc/init.d/zookeeper-client
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[cluster, controller_epoch, brokers, zookeeper, hadoop-ha, admin, isr_change_notification, consumers, config, hbase]
[zk: localhost:2181(CONNECTED) 2] get /hadoop-ha
cZxid = 0x100000002
ctime = Tue Dec 05 19:43:07 EST 2017
mZxid = 0x100000002
mtime = Tue Dec 05 19:43:07 EST 2017
pZxid = 0x700000017
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha
[myCluster]
[zk: localhost:2181(CONNECTED) 4]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
HDFS HA自动切换机制的核心对象是ZKFC,也就是我们平常在NameNode节点上会启动的ZKFC进程。
在ZKFC的进程内部,运行着3个对象服务:
HealthMonitor:监控NameNode是否不可用或是进入了一个不健康的状态。
ActiveStandbyElector:控制和监控ZK上的节点的状态。
ZKFailoverController:协调HealMonitor和ActiveStandbyElector对象,处理它们发来的event变化事件,完成自动切换的过程。
通常情况下Namenode和ZKFC同布署在同一台物理机器上, HealthMonitor, FailoverController, ActiveStandbyElector在同一个JVM进程中(即ZKFC), Namenode是一个单独的JVM进程。
(1) Monitor and try to take active lock: 向zookeeper抢锁,抢锁成功的zkfc,指导对应的NN成为active的NN; watch锁对应的znode,当前active NN的状态发生变化导致失锁时,及时抢锁,努力成为active NN
(2) Monitor NN liveness and health: 定期检查对应NN的状态, 当NN状态发生变化时,及时通过ZKFC做相应的处理
(3) Fences other NN when needed: 当前NN要成为active NN时,需要fence其它的NN,不能同时有多个active NN
ZKFC的线程模型总体上来讲比较简单的,它主要包括三类线程,一是主线程;一是HealthMonitor线程; 一是zookeeper客户端的线程。它们的主要工作方式是:
(1) 主线程在启动所有的服务后就开始循环等待
(2) HealthMonitor是一个单独的线程,它定期向NN发包,检查NN的健康状况
(3) 当NN的状态发生变化时,HealthMonitor线程会回调ZKFailoverController注册进来的回调函数,通知ZKFailoverController NN的状态发生了变化
(4) ZKFailoverController收到通知后,会调用ActiveStandbyElector的API,来管理在zookeeper上的结点的状态
(5) ActiveStandbyElector会调用zookeeper客户端API监控zookeeper上结点的状态,发生变化时,回调ZKFailoverController的回调函数,通知ZKFailoverController,做出相应的变化
public enum State {
/**
* 1.The health monitor is still starting up.HealMonitor
* 初始化启动状态
*/
INITIALIZING,
/**
* 2.The service is not responding to health check RPCs.
* 健康检查无响应状态
*/
SERVICE_NOT_RESPONDING,
/**
* 3.The service is connected and healthy.
* 服务检测健康状态
*/
SERVICE_HEALTHY,
/**
* 4.The service is running but unhealthy.
* 服务检查不健康状态
*/
SERVICE_UNHEALTHY,
/**
* 5.The health monitor itself failed unrecoverably and can no longer provide accurate information.
* 监控服务本身失败不可用状态
* /
HEALTH_MONITOR_FAILED;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
HealMonitor对象检测NameNode的健康状况的逻辑其实非常简单:发送一个RPC请求,查看是否有响应。
————————————————
版权声明:本文为CSDN博主「程裕强」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengyuqiang/article/details/78833171