Hadoop-HA节点介绍

设计思想
- hadoop2.x启用了主备节点切换模式(1主1备)
- 当主节点出现异常的时候,集群直接将备用节点切换成主节点
- 要求备用节点马上就要工作
- 主备节点内存几乎同步
- 有独立的线程对主备节点进行监控健康状态
- 需要有一定的选举机制,帮助我们确定主从关系
- 我们需要实时存储日志的中间件
ActiveNameNode(ANN)
- Active NameNode 的功能和原理的NN的功能是一样的
- 接受客户端请求,查询数据块DN信息
- 存储数据的元数据信息
- 数据文件:Block:DN的映射关系
- 工作
- 启动时:接受DN的block汇报
- 运行时:和DN保持心跳(3s,10m30s)
- 存储介质
- 完全基于内存
- 优点:数据处理效率高
- 缺点:数据的持久化(日志edits+快照fsimage)
StandbyNameNode(SNN)
- Standby NameNode:NN的备用节点
- 他和主节点做同样的工作,但是它不会发出任何指令
- 存储:数据的元数据信息
- 数据文件:Block:DN的映射关系
- 它的内存数据和主节点内存数据几乎是一致的
- 工作:
- 启动时:接受DN的block汇报
- 运行时:和DN保持心跳(3s,10m30s)
- 存储介质
- 完全基于内存
- 优点:数据处理效率高
- 缺点:数据的持久化
- 合并日志文件和镜像
- 当搭建好集群的时候,格式化主备节点的时候,ANN和SNN都会会默认创建
- fsimage_000000000000000
- 当我们操作HDFS的时候ANN会产生日志信息
- edits_inprogress_0000000000001
- 主节点会将日志文件中新增的数据同步到JournalNode集群上
- 所以只需要snn有操作的日志信息,就可以合并fsImage与edits信息,理论上是一直在合并数据
- fsimage -->初始化创建
- edits-->从JournalNode集群上定时同步
- 只要同步到edits文件,就开始于fsimage合并
- 当达到阈值的时候,直接拍摄快照即可
- SNN将合并好的Fsimage发送给ANN,ANN验证无误后,存放到自己的目录中
- 当搭建好集群的时候,格式化主备节点的时候,ANN和SNN都会会默认创建
DataNode (DN)
- 存储
- 文件的Block数据
- 介质
- 硬盘
- 启动时:同时向两个NN汇报Block信息
- 运行中同时和两个NN节点保持心跳机制
Quorum JournalNode Manager (QJM)

- Quorum JournalNode Manager 共享存储系统,NameNode通过共享存储系统实现日志数据同
步。 - JournalNode是一个独立的小集群,它的实现原理和Zookeeper的一致( Paxos)
- ANN产生日志文件的时候,就会同时发送到 JournalNode的集群中每个节点上
- JournalNode不要求所有的jn节点都接收到日志,只要有半数以上的(n/2+1)节点接受收到日
志,那么本条日志就生效 - SNN每间隔一段时间就去QJM上面取回最新的日志
- SNN上的日志有可能不是最新的
- HA集群的状态正确至关重要,一次只能有一个NameNode处于活动状态。
- JournalNode只允许单个NameNode成为作者。在故障转移期间,将变为活动状态的NameNode
将承担写入JournalNodes的角色,这将有效地防止另一个NameNode继续处于活动状态,从而使 新的Active节点可以安全地进行故障转移。
Zookeeper Failover Controler(ZFKC)
- Failover Controller(故障转移控制器)
- 对 NameNode 的主备切换进行总体控制,能及时检测到 NameNode 的健康状况
- 在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换
- 为了防止因为NN的GC失败导致心跳受影响,ZKFC作为一个deamon进程从NN分离出来

- 启动时:
- 当集群启动时,主备节点的概念是很模糊的
- 当ZKFC只检查到一个节点是健康状态,直接将其设置为主节点
- 当zkfc检查到两个NN节点是的健康状态,发起投票机制
- 选出一个主节点,一个备用节点,并修改主备节点的状态
- 运行时:
- 由 ZKFailoverController、HealthMonitor 和 ActiveStandbyElector 这 3 个组件来协同实现主备切换
- ZKFailoverController启动的时候会创建 HealthMonitor 和 ActiveStandbyElector 这两
个主要的内部组件 - HealthMonitor 主要负责检测 NameNode 的健康状态
- ActiveStandbyElector 主要负责完成自动的主备选举,内部封装了 Zookeeper 的处理逻
辑
- ZKFailoverController启动的时候会创建 HealthMonitor 和 ActiveStandbyElector 这两
- 由 ZKFailoverController、HealthMonitor 和 ActiveStandbyElector 这 3 个组件来协同实现主备切换

- 主备节点正常切换
- NameNode 在选举成功后,ActiveStandbyElector会在 zk 上创建一个
ActiveStandbyElectorLock 临时节点,而没有选举成功的备 NameNode 中的
ActiveStandbyElector会监控这个节点 - 如果 Active NameNode 对应的 HealthMonitor 检测到 NameNode 的状态异常时,
ZKFailoverController 会主动删除当前在 Zookeeper 上建立的临时节点
ActiveStandbyElectorLock - 如果是 Active 状态的 NameNode 所在的机器整个宕掉的话,那么跟zookeeper连接的客户
端线程也挂了,会话结束,那么根据 Zookeepe的临时节点特性,ActiveStandbyElectorLock 节点会自动被删除,从而也会自动进行一次主备切换 - 处于 Standby 状态的 NameNode 的 ActiveStandbyElector 注册的监听器就会收到这个节点
的 NodeDeleted 事件,并创建 ActiveStandbyElectorLock 临时节点,本来处于 Standby 状
态的 NameNode 就选举为Active NameNode 并随后开始切换为 Active 状态。
- NameNode 在选举成功后,ActiveStandbyElector会在 zk 上创建一个
Zookeeper
- 为主备切换控制器提供主备选举支持。
- 辅助投票
- 和ZKFC保持心跳机制,确定ZKFC的存活
脑裂 Brain-split
- 定义
- 脑裂是Hadoop2.X版本后出现的全新问题,实际运行过程中很有可能出现两个namenode同
时服务于整个集群的情况,这种情况称之为脑裂。
- 脑裂是Hadoop2.X版本后出现的全新问题,实际运行过程中很有可能出现两个namenode同
- 原因
- 脑裂通常发生在主从namenode切换时,由于ActiveNameNode的网络延迟、设备故障等问
题,另一个NameNode会认为活跃的NameNode成为失效状态,此时StandbyNameNode会
转换成活跃状态,此时集群中将会出现两个活跃的namenode。因此,可能出现的因素有网
络延迟、心跳故障、设备故障等。、
- 脑裂通常发生在主从namenode切换时,由于ActiveNameNode的网络延迟、设备故障等问
- 脑裂场景
- NameNode 可能会出现这种情况,NameNode 在垃圾回收(GC)时,可能会在长时间内整 个系统无响应
- zkfc客户端也就无法向 zk 写入心跳信息,这样的话可能会导致临时节点掉线,备NameNode 会切换到 Active 状态
- 这种情况可能会导致整个集群会有同时有两个Active NameNode
- 脑裂问题的解决方案是隔离(Fencing)
- 第三方共享存储:任一时刻,只有一个 NN 可以写入
- DataNode:需要保证只有一个 NN 发出与管理数据副本有关的命令
- Client需要保证同一时刻只有一个 NN 能够对 Client 的请求发出正确的响应。
- 每个NN改变状态的时候,向DN发送自己的状态和一个序列号。
- DN在运行过程中维护此序列号,当failover时,新的NN在返回DN心跳时会返回自己
的active状态和一个更大的序列号。DN接收到这个返回是认为该NN为新的active。 - 如果这时原来的active(比如GC)恢复,返回给DN的心跳信息包含active状态和原来
的序列号,这时DN就会拒绝这个NN的命令。
- 解决方案
- ActiveStandbyElector为了实现 fencing,当NN成为ANN之后创建Zookeeper临时节点
ActiveStandbyElectorLock,创建ActiveBreadCrumb 的持久节点,这个节点里面保存了这个Active NameNode的地址信息(node-01) - Active NameNode的 ActiveStandbyElector在正常的状态下关闭 Zookeeper Session 的时
候,会一起删除这个持久节点 - 但如果 ActiveStandbyElector在异常的状态下关闭,那么由于 /hadoop-
ha/${dfs.nameservices}/ActiveBreadCrumb 是持久节点,会一直保留下来,后面当另一个
NameNode 选主成功之后,会注意到上一个 Active NameNode 遗留下来的这个节点,从而
会回调 ZKFailoverController的方法对旧的 Active NameNode 进行 fencing。- 首先尝试调用这个旧 Active NameNode 的 HAServiceProtocol RPC 接口的
transitionToStandby 方法,看能不能把它转换为 Standby 状态 - 如果 transitionToStandby 方法调用失败,那么就执行 Hadoop 配置文件之中预定义的
隔离措施- sshfence:通过 SSH 登录到目标机器上,执行命令 fuser 将对应的进程杀死
- shellfence:执行一个用户自定义的 shell 脚本来将对应的进程隔离
- 首先尝试调用这个旧 Active NameNode 的 HAServiceProtocol RPC 接口的
- 在成功地执行完成 fencing 之后,选主成功的 ActiveStandbyElector 才会回调
ZKFailoverController 的 becomeActive 方法将对应的 NameNode 转换为 Active 状态,开始 对外提供服务
- ActiveStandbyElector为了实现 fencing,当NN成为ANN之后创建Zookeeper临时节点
Hadoop-HA节点介绍的更多相关文章
- Hadoop HA 搭建
Hadoop HA 什么是 HA HA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点.通常 ...
- hadoop ha 读取 activce状态的活动节点
方式一 package com.xxx.hadoop; import com.sun.demo.jvmti.hprof.Tracker; import com.sun.xml.bind.util.Wh ...
- Hadoop技术之Hadoop HA 机制学习
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:温球良 导语 最近分享过一次关于Hadoop技术主题的演讲,由于接触时间不长,很多技术细节认识不够,也没讲清楚,作为一个技术人员,本 ...
- hadoop HA 详解
NameNode 高可用整体架构概述 在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDFS NameNode 和 JobTracker 都存在着单点问题,这其中以 NameNode ...
- 基于zookeeper的高可用Hadoop HA集群安装
(1)hadoop2.7.1源码编译 http://aperise.iteye.com/blog/2246856 (2)hadoop2.7.1安装准备 http://aperise.iteye.com ...
- hadoop HA分布式集群搭建
概述 hadoop2中NameNode可以有多个(目前只支持2个).每一个都有相同的职能.一个是active状态的,一个是standby状态的.当集群运行时,只有active状态的NameNode是正 ...
- 1、hadoop HA分布式集群搭建
概述 hadoop2中NameNode可以有多个(目前只支持2个).每一个都有相同的职能.一个是active状态的,一个是standby状态的.当集群运行时,只有active状态的NameNode是正 ...
- hadoop HA+Federation(高可用联邦)搭建配置(一)
hadoop HA+Federation(高可用联邦)搭建配置(一) 标签(空格分隔): 未分类 介绍 hadoop 集群一共有4种部署模式,详见<hadoop 生态圈介绍>. HA联邦模 ...
- Hadoop HA集群 与 开发环境部署
每一次 Hadoop 生态的更新都是如此令人激动 像是 hadoop3x 精简了内核,spark3 在调用 R 语言的 UDF 方面,速度提升了 40 倍 所以该文章肯定得配备上最新的生态 hadoo ...
- 使用Nginx+Lua代理Hadoop HA
一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNo ...
随机推荐
- 2022-3-10内部群每日三题-清辉PMP
1.一位项目经理得知,由于持续的罢工,该项目的进口设备尚未被海关放行.项目经理首先应该怎么做? A.执行定性风险分析 B.执行定量风险分析 C.与团队一起审查风险影响 D.实施风险应对计划 2.一位团 ...
- mongoDB日常操作01
//serialno_info.i,查看历史最大值db.serialno_info.find({'_id':'define_picture'})//查看文件记录有序id条数db.fs.files.fi ...
- C语言所有的数据类型
整型数据类型:char 1 字节 -128 到 127 或 0 到 255unsigned char 1 字节 0 到 255signed char 1 字节 -128 到 127int 2 或 4 ...
- Typora怎么让左边的标题折叠
点击文件选择偏好设置->在选择外观->选中侧边栏的大纲视图允许折叠和展开 效果
- libevent学习之入门--[01]概述与安装
网上关于libevent的介绍不在少数,我相信目前看到我这篇博客时已经基本了解libevent是用来做什么的,有什么功能,在此就不重复介绍了.我会按照我学习的过程来完整记录整个库的所有核心内容和具体应 ...
- Netty基本编写
一. public class Server { public static void main(String[] args) throws Exception { //1 创建线两个程组 //一个是 ...
- nkIO方法
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scan ...
- 类继承(c++ primer plus)课后习题
第一题: // base class class Cd { // represents a CD disk private: char performers[50]; char label[20]; ...
- 字典:求和计数(return知识巩固)
野餐用品计数 之前写过一段,字符在字符串中出现次数的代码 import pprint message = 'It was a bright cold day in April, ' \ 'and th ...
- 三级菜单python编码及高级编码
# -*- coding: utf-8 -*- # @Time : 2020/7/31 0:13 # @Author : Breeze # @FileName: 三级菜单.py menu = { '北 ...