早期的HDFS 2.0.0,Namenode 是单点的,挂了就全玩儿完。
为了保证HDFS 的高可用,通常会配置两个Namenode,以active/standby 的模式运行,而zkfc 和zk 负责状态管理。
zkfc 是一个独立进程,通常与namenode 跑在同一台机器,运行在zk 与namenode 之间,入口类为DFSZKFailoverController。
zkfc 包含HealthMonitor 和ActiveStandbyElector 两个主要模块。
zkfc 通过createLockNodeAsync 在zk 中创建一个EPHEMERAL znode,此模式znode 的特点是临时性,当创建者与zk 的session 中断后,此znode 即被删除。
session 中断是有一个timeout 的,zk 配置文件中的maxSessionTimeOut 和minSessionTimeOut 两个配置项,意思是zkClient 的连接请求带过来一个sessionTimeout 参数,这个参数在这个[min, max] 区间才合法,否则就取对应的边界值。
这个znode 相当于一把独占锁,谁成功创建谁就有权成为active namenode。
ActiveStandbyElector::processResult -> becomeActive 然后通过RPC(HAServiceProtocolHelper.transitionToActive)通知namenode 进程切换为active。
为了避免双active 的情况发生,在becomeActive 之前,需要fenceOldActive,也是通过RPC(transitionToStandby) 通知原active namenode 切换为standby。
HealthMonitor 会启动一个后台轮询线程,调用doHealthChecks 检查所对应的namenode 的状态,然后通过verifyChangedServiceState 函数处理是否需要切换namenode 模式。
Hi, This is a test post~
To be & Not to be