首页 > BigData, HDFS > HDFS ZKFC手记

HDFS ZKFC手记

1.基本原理

zk的基本特性:
(1) 可靠存储小量数据且提供强一致性
(2) ephemeral node, 在创建它的客户端关闭后,可以自动删除
(3) 对于node状态的变化,可以提供异步的通知(watcher)

zk在zkfc中可以提供的功能:
(1) Failure detector: 及时发现出故障的NN,并通知zkfc
(2) Active node locator: 帮助客户端定位哪个是Active的NN
(3) Mutual exclusion of active state: 保证某一时刻只有一个Active的NN

2. 模块

(1) ZKFailoverController(DFSZKFailoverController): 驱动整个ZKFC的运转,通过向HealthMonitor和ActiveStandbyElector注册回调函数的方式,subscribe HealthMonitor和ActiveStandbyElector的事件,并做相应的处理
(2) HealthMonitor: 定期check NN的健康状况,在NN健康状况发生变化时,通过回调函数把变化通知给ZKFailoverController
(3) ActiveStandbyElector: 管理NN在zookeeper上的状态,zookeeper上对应node的结点发生变化时,通过回调函数把变化通知给ZKFailoverController
(4) FailoverController: 提供做graceful failover的相关功能(dfs admin可以通过命令行工具手工发起failover)

3. 系统架构

zkfc-arch
如上图所示,通常情况下Namenode和ZKFC同布署在同一台物理机器上, HealthMonitor, FailoverController, ActiveStandbyElector在同一个JVM进程中(即ZKFC), Namenode是一个单独的JVM进程。如上图所示,ZKFC在整个系统中有几个重要的作用:
(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

4. 线程模型

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,做出相应的变化

5. 类关系图

zkfc_class

6. 参考资料

(1) https://issues.apache.org/jira/secure/attachment/12521279/zkfc-design.pdf
(2) http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/

分类: BigData, HDFS 标签: , , ,
  1. xinghaixu
    2013年6月18日21:11 | #1

    哈哈,小武哥,好久没更新了呢。工作应该很忙吧。

  2. 2013年6月22日04:17 | #2

    恩,是比较忙。@xinghaixu

  3. 大迷糊
    2013年10月18日13:15 | #3

    你好,当Active Namode挂掉之后,ZKFC监控到之后,Standby Namenode会自动变成Active,是吗?

  4. 2013年10月20日23:12 | #4

    恩,整个过程是自动的。@大迷糊

  5. 大迷糊
    2013年10月21日09:56 | #5

    正常情况下,datanode同时向active namenode和standby namenode同步信息是吗,我的active namenode挂掉之后,standby namenode可以变成active namenode,但是datanode变得不稳定,查看日志发现:他会连接我那台挂掉的机器,为什么啊?麻烦帮忙解决,谢谢。

  6. 2013年10月23日21:00 | #6

    1. datanode向namenode report的内容都是同时发往active/standby的;2. 连接这个问题应该是目前的实现机制所致,目前datanode是通过配置文件来读取namenode地址的,读取的时候datanode并不知道哪个namenode是active, 哪个是standby,所以只能两个都试@大迷糊

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.