HDFS ZKFC实现NameNode自动切换原理

官方文档: https://issues.apache.org/jira/secure/attachment/12521279/zkfc-design.pdf

当一个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]

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;
  }

HealMonitor对象检测NameNode的健康状况的逻辑其实非常简单:发送一个RPC请求,查看是否有响应。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

2018全国大学生软件测试大赛-安恒杯Web测试大赛write up

这里的知识点是当代码中存在$_REQUEST['user_id']里面类似的参数的时候,使用" "、"["、"+"、"."这样的符号的时候回自动转化成"_"从而...

511
来自专栏c#开发者

使用BizTalk实现RosettaNet B2B So Easy

使用BizTalk实现RosettaNet B2B So Easy 最近完成了一个vmi-hub的B2B项目,使用Rosettanet 2.0的标准与一家品牌商...

33714
来自专栏.NET技术

.net core实践系列之SSO-同域实现

SSO的系列还是以.Net Core作为实践例子与大家分享,SSO在Web方面复杂度分同域与跨域。本篇先分享同域的设计与实现,跨域将在下篇与大家分享。

1271
来自专栏Jerry的SAP技术分享

用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办

关于JavaScript的跨域问题(Cross Domain)的讨论, 网上有太多的资源了。国内的程序猿写了非常多的优秀文章,Jerry这里就不再重复了。

1794
来自专栏MessageQueue

Push or Pull?

采用Pull模型还是Push模型是很多中间件都会面临的一个问题。消息中间件、配置管理中心等都会需要考虑Client和Server之间的交互采用哪种模型:

1204
来自专栏IMWeb前端团队

你也能写个 Shadowsocks

本文将教你从0写一个Shadowsocks,无需任何基础,读完本文你就能完成一个轻量级、高性能的 Shadowsocks 代替品。

2.9K14
来自专栏落影的专栏

iOS开发笔记(二)

前言 开发做笔记是好习惯,总结分享是巩固记忆。 遇到问题,思考其背后的原因、原理。 AFNetworking 1、progress回调block,不在主线程;...

3307
来自专栏cs

kali入侵windows

因为我是一个爱好和平的人(捂嘴笑),所以就在虚拟机中,创建二个系统,一个kali,一个windows xp,来进行这次入侵实验,以此迈入hacke的大门。 -...

34710
来自专栏酷玩时刻

自动获取/更新HTTPS证书并实现Nginx代理WSS协议

如果说我比别人看得更远些,那是因为我站在了巨人的肩上-----牛顿 有了轮子就会事半功倍,此篇文章就是站在巨人的肩膀上做一个简单的总结。

742
来自专栏kalifaの日々

python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)

思路 之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就...

3329

扫码关注云+社区