文档章节

hadoop 2.4 namenode ha 源码分析(ZKFailoverController)

东方神剑
 东方神剑
发布于 2014/11/04 19:16
字数 737
阅读 574
收藏 0
点赞 0
评论 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

共有 人打赏支持
东方神剑

东方神剑

粉丝 64
博文 126
码字总数 93166
作品 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.7.2 安装 在zkfc 格式化时报错

hadoop的安装环境为centos6.5 64位 [hadoop@node01 hadoop-2.7.2]$ bin/hdfs zkfc -formatZK16/08/12 15:10:07 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your......

驛路梨花醉美
2016/08/12
638
1
Hadoop 2.0中单点故障解决方案总结

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

jackwxh
06/29
0
0
Hadoop手把手逐级搭建,从单机伪分布到高可用+联邦(3)Hadoop高可用(HA)

第三阶段: Hadoop高可用(HA) 0. 步骤概述 1. 为完全分布式保存hadoop配置 1.1 进入$HADOOP_HOME/etc/目录 1.2 备份hadoop完全分布式配置,命名为hadoop-full,供以后使用 1.3 查看$HADOOP_HOM...

bigablecat
01/03
0
0
利用QJM实现HDFS的HA策略部署与验证工作记录分享

1、概述 Hadoop2.X中的HDFS(Vsersion2.0)相比于Hadoop1.X增加了两个重要功能,HA和Federation。HA解决了Hadoop1.X Namenode中一直存在的单点故障问题,HA策略通过热备的方式为主NameNode提供...

zengzhaozheng
07/02
0
0
Setting Up Hadoop NameNode High Availability

Hadoop2.0以后,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,J...

candon123
01/03
0
0
Hadoop2.6.1集群部署之手工切换HA

1. 引言 在生产环境中NameNode的高可用是非常重要的,一旦NameNode宕机,那么整合集群就不能用了,在本篇博客中就主要介绍一下Hadoop2.6.1的HA部署(手动切换),在本篇博客中博主使用五台干...

Liri
2017/12/16
0
0
Hadoop HA 是什么?架构?

Hadoop HA 是什么? Hadoop HA架构详解 1.1 HDFS HA背景 HDFS集群中NameNode 存在单点故障(SPOF)。对于只有一个NameNode的集群,如果NameNode机器出现意外情况,将导致整个集群无法使用,直...

weixin_39915358
05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
16分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
17分钟前
0
0
TensorFlow 拟合异或 one-hot方式

增加隐含层数目 之前是按照计算出的数值按照0.5分为0和1,现在是算出向量,用维度较大的作为结果 import tensorflow as tfimport numpy as np# 网络结构:2维输入 --> 2维隐藏层 --> ...

阿豪boy
19分钟前
0
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
35分钟前
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
52分钟前
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
今天
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
今天
0
0
Linux sar性能分析

Linux使用sar进行性能分析 sar简介 sar命令常用格式 sar常用性能数据分析 整体CPU使用统计-u 各个CPU使用统计-P 内存使用情况统计-r 整体IO情况-b 各个IO设备情况-d 网络统计-n sar日志保存-...

易野
今天
0
0
用 Python 实现打飞机,让子弹飞吧!

所用技术和软件 python 2.7 pygame 1.9.3 pyCharm 准备工作 安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。 下载好使用的素材。 技术实现 初始化 pygame 首先要...

猫咪编程
今天
0
0
MySQL的行锁和表锁

简单总结一下行锁和表锁。 行锁 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁 每次操作锁住整张表。开销小,加锁快;不会出...

to_ln
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部