一、问题描述

  由于namenode 是HDFS的大脑,而这个大脑又是单点,如果大脑出现故障,则整个分布式存储系统就瘫痪了。HA(High Available)机制就是用来解决这样一个问题的。碰到这么个问题,首先本能的想到的就是冗余备份,备份的方式有很多种,前辈们设计的有元数据备份方案,secondary namenode以及avatarnode等方案。而这些方案中最有优势的自然是能够让HDFS以最短的时间完成故障切换的方案。也就是我们今天要讨论的avatarnode。

  二、基本结构

  

  primary:负责正常业务namenode,也就是为client提供元数据查询和操作。

  standby:热备的namenode,完全备份primary的元数据,并对primary做checkpoint(一种元数据持久化机制,后面会介绍到)。

  NFS:网络文件服务器,primary会将日志实时同步一份到该服务器,来保证primary出故障时备份元数据的完整性。

  三、数据持久化机制——checkpoint

  primary管理着所有的元数据,通常元数据都保存在内存里,这样对元数据的访问能够高效。但是有个隐患,就是如果primary节点宕机了,或者掉电了,那么所有的元数据就一去不复返了。如果我们能够把元数据在内存里保存一份,同时在硬盘上也保存一份,那么即使掉电也能将数据再恢复过来。

  checkpoint机制就是将元数据实时在硬盘上保存一份的机制。

  首先介绍几个关键概念:

  edits:日志文件,记录引发元数据改变的操作。

  fsimage:元数据的镜像文件,可以理解为元数据保存在磁盘上的一个副本。

  问题1:fsimage代表的是某一时刻的元数据镜像,元数据在不断改变,那么这个镜像是如何实时更新的呢?

  问题2:如何在保证primary namenode正常对外服务的情况下生成fsimage?

  

  checkpoint步骤如下:

  第一步:secondary namenode请求namenode停止使用edits,暂时记录在edits.new文件中

  第二步:secondary namenode从namenode复制fsimage、edits到本地

  第三步:secondary namenode合并fsimage、edits为fsimage.ckpt

  第四步:secondary namenode发送fsimage.ckpt到namenode

  第五步:namenode用新的fsimage覆盖旧的fsimage,用新的edits覆盖旧的edits

  第六步:更新checkpoint时间

  到这里fsimage更新完毕,即保证了primary正常服务,也完成了fsimage的更新

  四、avatarnode元数据的一致性

  checkpoint只是保证了元数据的持久化,但是如果primary出现故障,修复后还是要花大量的时间来加载fsimage,如何让standby在内存中就和primary保持元数据同步,就是一个高可用的HDFS需要解决的问题。

  namenode的元数据其实包括两个部分:

  第一部分:目录树,目录树管理着HDFS中存储的所有的文件信息。

  第二部分:块数据和datanode的对应关系

  

  只要能够保证以上两部分的数据一致了,那么元数据的一致性问题就解决了。

  第一部分:primary将日志实时同步到NFS上,而standby可以实时读取NFS上的日志,通过日志回放,可以解决目录树信息一致的问题。

  第二部分:快数据和datanode的对应关系,是所有datanode想namenode汇报总结出来的,那么让所有的datanode向两个namenode汇报,就可以解决块数据和datanode的对应关系一致性问题。

  问题:新引入的NFS会带来新的单点问题。据facebook工程师统计,这个单点故障率非常之低,他们在四年中之碰到一次。

  到这里avatarnode原理基本讲完,但是实际应用中还存在几个问题

  1、HDFS是如何快速检测到primary出现故障的?

  2、standby是如何迅速从备用机切换到primary的?

HDFS原理分析之HA机制:avatarnode原理的更多相关文章

  1. SpringBoot原理—分析SpringBoot启动机制(starter机制)

    一:前言使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程.本文的目的就是一步步分析springboot的启动过 ...

  2. Spring 事件监听机制及原理分析

    简介 在JAVA体系中,有支持实现事件监听机制,在Spring 中也专门提供了一套事件机制的接口,方便我们实现.比如我们可以实现当用户注册后,给他发送一封邮件告诉他注册成功的一些信息,比如用户订阅的主 ...

  3. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  4. (转)Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  5. 消息队列NetMQ 原理分析1-Context和ZObject

    前言 介绍 NetMQ是ZeroMQ的C#移植版本,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. 当前有2个版本正在维护,版本3 ...

  6. 消息队列NetMQ 原理分析2-IO线程和完成端口

    消息队列NetMQ 原理分析2-IO线程和完成端口 前言 介绍 目的 IO线程 初始化IO线程 Proactor 启动Procator线程轮询 处理socket 获取超时时间 从完成端口获取处理完的状 ...

  7. 消息队列NetMQ 原理分析3-命令产生/处理和回收线程

    消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...

  8. 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe

    消息队列NetMQ 原理分析4-Socket.Session.Option和Pipe 前言 介绍 目的 Socket 接口实现 内部结构 Session Option Pipe YPipe Msg Y ...

  9. 消息队列NetMQ 原理分析5-StreamEngine、Encord和Decord

    消息队列NetMQ 原理分析5-StreamEngine,Encord和Decord 前言 介绍 目的 StreamEngine 发送数据 接收数据 流程分析 Encoder V2Encoder V1 ...

随机推荐

  1. Partition List,拆分链表

    问题描述: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  2. [Vue]webpack的require与require.context

    1.require 1.1完整路径的require语句: require('tools'); //preset alias tools require('./js/main'); 1.2带表达式的 r ...

  3. Android6.0------权限申请RxPermissions

    前面写了Android6.0权限介绍和权限单个,多个申请,用的是纯Java代码,本文主要说的是借助第三方库来实现权限申请. 借助第三方库 RxPermissions来申请6.0权限. RxPermis ...

  4. Kotlin------数据类型和语法

    今天简单的来介绍Kotlin的基本语法.编程语言大多相通的,会基础学起来都很快,理论都一样,实现的代码语言不一样而已. 数值类型 Kotlin 处理数值的方法和 java 很相似,但不是完全一样.比如 ...

  5. 【BZOJ3144】切糕(网络流,最小割)

    [BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...

  6. 二十七 Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP

    设置代理ip只需要,自定义一个中间件,重写process_request方法, request.meta['proxy'] = "http://185.82.203.146:1080&quo ...

  7. 二十四 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

  8. UVA-11294 Wedding (2-SAT)

    题目大意:一张长桌,n对夫妻,编号为0~n,这些人要坐在长桌两侧,每对夫妻不能坐在同一侧.其中,有2*m个人相互讨厌,编号为0的夫妻中的妻子不愿意让对面那一侧中有两个相互吵过架的人,找一种排座位方案. ...

  9. 大白话,讲编程之《ES6系列连载》汇总

    如果你经历过2,3年前的前端开发,你一定感受过兼容IE6,7的痛苦,一定用过网页三剑客的dreamweaver编写html,面试的时候面试官一定会问你:会用PS切图吗? 刚开始的时候你发现,web前端 ...

  10. IOS-网络(网页开发-UIWebView,HTML,CSS,JavaScript,OC和JS代码互调)

    一.网页基础 // // ViewController.m // IOS_0218_网页开发1 // // Created by ma c on 16/2/18. // Copyright © 201 ...