文档章节

hadoop 2.4 namenode ha 源码分析(ZKFailoverController)

东方神剑
 东方神剑
发布于 2014/11/04 19:16
字数 737
阅读 590
收藏 0

ZKFailoverController是整个HA的协调者。下面我们将分析几个实际的问题。

1.怎么协调选举的?怎么选举出来active的?

2.active宕机后,做了什么事情,如何切换的?

下面,我们来分析第一个问题 怎么协调选举的?怎么选举出来active的?




步骤1:参看NameNode源码,可以看出,对于使用HA的NN来说,进入Standby是必须的。 升级除外

protected HAState createHAState(StartupOption startOpt) { 
    if (!haEnabled || startOpt == StartupOption.UPGRADE) { 
      return ACTIVE_STATE; 
    } else { 
      return STANDBY_STATE; //standby状态     } 
  }


步骤2:此时的HealthMonitor监控NN,发现是HEALTH的状态,会执行:

if (healthy) { 
     //设置状态,用于通知回调函数         enterState(State.SERVICE_HEALTHY); 
      }

enterState会通知回调函数,进行处理。对于HEALTH状态的开始执行选举方法。

elector.joinElection(targetToData(localTarget));


通过创建零时节点,来抢占节点,获取Active

createLockNodeAsync();

对于创建节点,会触发ZK的EVENT时间。

对于事件的处理,见源码部分:

public synchronized void processResult(int rc, String path, Object ctx, 
      String name) { 
    if (isStaleClient(ctx)) return; 
    LOG.debug("CreateNode result: " + rc + " for path: " + path 
        + " connectionState: " + zkConnectionState + 
        " for " + this); 
    Code code = Code.get(rc);//为了方便使用,这里自定义了一组状态     if (isSuccess(code)) {//成功返回,成功创建zklocakpath节点       // we successfully created the znode. we are the leader. start monitoring       if (becomeActive()) {//要将本节点上的NN变成active         monitorActiveStatus();//继续监控节点状态       } else { 
        reJoinElectionAfterFailureToBecomeActive();//失败,继续选举尝试       } 
      return; 
    } 
    if (isNodeExists(code)) {//节点存在,说明已经有active,wait即可       if (createRetryCount == 0) { 
        // znode exists and we did not retry the operation. so a different         // instance has created it. become standby and monitor lock.         becomeStandby(); 
      } 
      // if we had retried then the znode could have been created by our first       // attempt to the server (that we lost) and this node exists response is       // for the second attempt. verify this case via ephemeral node owner. this       // will happen on the callback for monitoring the lock.       monitorActiveStatus();//不过努力成为active的动作不能停       return; 
    } 
    String errorMessage = "Received create error from Zookeeper. code:"
        + code.toString() + " for path " + path; 
    LOG.debug(errorMessage); 
    if (shouldRetry(code)) { 
      if (createRetryCount < maxRetryNum) { 
        LOG.debug("Retrying createNode createRetryCount: " + createRetryCount); 
        ++createRetryCount; 
        createLockNodeAsync(); 
        return; 
      } 
      errorMessage = errorMessage 
          + ". Not retrying further znode create connection errors."; 
    } else if (isSessionExpired(code)) { 
      // This isn't fatal - the client Watcher will re-join the election       LOG.warn("Lock acquisition failed because session was lost"); 
      return; 
    } 
    fatalError(errorMessage); 
  }


对于获取Active的机器,调用becomeActive()方法

 private synchronized void becomeActive() throws ServiceFailedException { 
    LOG.info("Trying to make " + localTarget + " active..."); 
    try { 
      HAServiceProtocolHelper.transitionToActive(localTarget.getProxy( 
          conf, FailoverController.getRpcTimeoutToNewActive(conf)), 
          createReqInfo()); 
      String msg = "Successfully transitioned " + localTarget + 
          " to active state"; 
      LOG.info(msg); 
      serviceState = HAServiceState.ACTIVE; 
      recordActiveAttempt(new ActiveAttemptRecord(true, msg)); 
    } catch (Throwable t) { 
      String msg = "Couldn't make " + localTarget + " active"; 
      LOG.fatal(msg, t); 
       
      recordActiveAttempt(new ActiveAttemptRecord(false, msg + "\n" + 
          StringUtils.stringifyException(t))); 
      if (t instanceof ServiceFailedException) { 
        throw (ServiceFailedException)t; 
      } else { 
        throw new ServiceFailedException("Couldn't transition to active", 
            t); 
      }


通过对RPC进过一系列的调用,最终执行NameNode

 synchronized void transitionToActive() 
      throws ServiceFailedException, AccessControlException { 
    namesystem.checkSuperuserPrivilege(); 
    if (!haEnabled) { 
      throw new ServiceFailedException("HA for namenode is not enabled"); 
    } 
    state.setState(haContext, ACTIVE_STATE); 
  }


OVER


2.active宕机后,做了什么事情,如何切换的?

active宕机后或者异常会导致ZK节点的消失或监控状态的UNHEALTH,这些都会导致新一轮的选举,原理同上。


下一步我们会分析NameNode的共享存储Journal的实现原理,以及和NameNode的交互过程。

本文转载自:http://my.oschina.net/hadooper/blog/339930

共有 人打赏支持
东方神剑

东方神剑

粉丝 65
博文 126
码字总数 93166
作品 0
朝阳
程序员
私信 提问
NameNode HA的实现原理

NameNode HA架构概述 实现架构: 组件描述: Active NN和Standby NN:两台 NameNode 形成互备,一台处于 Active 状态,另外一台处于 Standby 状态,只有主 NameNode 才能对外提供读写服务。 ...

JPblog
2017/12/26
0
0
hadoop2.2.0集群的HA高可靠的最简单配置

hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作。在hadoop1时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。这是hadoop1中的单点...

蓝狐乐队
2014/04/28
0
0
Hadoop手把手逐级搭建,从单机伪分布到高可用+联邦(4)Hadoop高可用+联邦(HA+Federation)

第四阶段: Hadoop高可用+联邦(HA+Federation) 0. 步骤概述 1. 为高可用保存hadoop配置 1.1 进入$HADOOP_HOME/etc/目录 1.2 备份hadoop高可用配置,供以后使用 1.3 查看$HADOOP_HOME/etc/目录...

bigablecat
01/05
0
0
Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析

关于NameNode高可靠需要配置的文件有core-site.xml和hdfs-site.xml 关于ResourceManager高可靠需要配置的文件有yarn-site.xml 逻辑结构: NameNode-HA工作原理: 在一个典型的HA集群中,最好...

九劫散仙
2015/11/11
0
0
Hadoop 2.0中单点故障解决方案总结

项目构建 Hadoop 1.0内核主要由两个分支组成:MapReduce和HDFS,众所周知,这两个系统的设计缺陷是单点故障,即MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题,该问题在很长时间...

jackwxh
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

以太坊PHP离线交易开发包

EthTool开发包适用于希望采用裸交易的PHP以太坊应用开发,主要包含以下特性: 支持裸交易部署/调用合约 内置etherscan和infura支持 keystore生成与读取,兼容geth/parity 采用裸交易的一个好...

笔阁
15分钟前
0
0
SRE的含义及与 DevOps 如何关联?

虽然站点可靠性工程师(site reliability engineer SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题...

linuxCool
16分钟前
1
0
月入3万之一个程序员的转行坎坷历程

陈年往事 “我月入3万,怎么会少少了你一个鸡蛋啊?” 这是2017年9月左右的一个新闻,一位煎饼摊大妈因和顾客争执时脱口而出这样一句话而走红。当时还上了各大新闻的头条。 互联网兴起今天,...

苏南-首席填坑官
38分钟前
1
1
OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
今天
335
7
Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部