在之前的文章:大数据系列:一文初识Hdfs

大数据系列2:Hdfs的读写操作 中Hdfs的组成、读写有简单的介绍。

在里面介绍Secondary NameNode和Hdfs读写的流程。

并且在文章结尾也说了,Secondary NameNode并不是我常说的HA,(High Availability)

本文承接之前的内容,对Hdfs的HA实现做个简单的介绍。


NameNode的重要性

先来看看Hdfs读写的流程图:

可以看到无论是读还是写,我们都必须和存储元数据的NameNode进行交互。

一旦NameNode出问题,整个集群的读写基本上就凉凉了。

所以,在设计的时候本就有做一些容错的措施。


容错的措施

如果NameNode除了问题,整个文件Hdfs将不可用。

摄像一个场景:

如果以为某种原因我们运行NameNode的机器被删除。

此时所有Hdfs的文件都回丢失,因为我们虽然在DataNode中存储了文件的NameNode信息,但是我们无法通过这些NameNode重新构建文件。

所以让NameNode有一定抗拒错误的能力是很重要的。

Hadoop本身提供了两种机制。


备份元数据

第一种机制:

将Hdfs元数据中持久化状态的文件做多个备份。

Hadoop 可以进行相关的配置,把这些持久的状态备份到多个文件系统。这个过程是同步且原子的 。

一般都是配置为本分到本例磁盘,同时远程NFS 挂载

Secondary NameNode

第二种机制:

运行一个Secondary NameNode,负责定期合并名称namespace iamgeedit log,以防止edit log变得过大。

合并流程如下,详细过程之前有介绍过,此处不累赘:


存在问题

虽然有两个方式让Hdfs有一定的容错能力,但是还是存在一些问题。

Secondary NameNode拥有一个合并的namespace iamge像的副本,在NameNode失败时可以使用该iamge

但是Secondary NameNode中的状态是滞后于NameNode的,如果NameNode是宕机的情况下,数据丢失必不可少。

此时通常的做法是将NFS上的NameNode元数据文件复制到Secondary NameNode,并将其作为新的NameNode运行。

因为NFS中的与NameNode的元数据是同步的,所以可以通过NFS中的数据恢复。

在多个文件系统上复制NameNode元数据和使用Secondary NameNode创建checkpoints的组合可以防止数据丢失。

然而这中组合的机制并不能提供Hdfs的高可用性。

主要原因是这种方式恢复太耗时间了。

NameNode是唯一的存储了文件与Blcok映射关系的元数据存储库

,一旦它罢工,所有的Client的作业包括Mapreduce、读、写、列出文件无法进行。

在新的NameNode上线之前,整个集群处于停止服务的状态

如果NameNode要重新上线服务需要经过一下的步骤:

  1. 加载明明空间到内存
  2. 重放edit log
  3. DataNode接收足够的NameNode报告并离开安全模式。

在具有许多文件和NameNode的大型集群上,NameNode的冷启动所需的时间可能是30分钟或更长。

这么拉垮可不太能接受,无论是日常运维还是计划停机之类的操作。

所以,归根结底就是NameNode仍然是存在单点故障(SPOF,Single Point Of Failure)

下面就看看怎么解决这个问题。


HDFS high availability (HA)

一般情况下会有两个场景和HA息息相关。

  1. 在出现计划外事件(如服务器宕机)的情况下,在重新启动NameNode之前,集群将不可用。
  2. 有计划的维护事件,例如NameNode机器上的软件或硬件升级,将导致集群停机。

为了解决上述的问题,Hadoop 提供了HDFS high availability (HA)的支持。

通过active-standby的方式配置两个NameNode(3.0后可以支持超过两个),在Active/Passive动配置中使用热备份。

在机器崩溃的情况下,实现快速故障转移到新的NameNode

或者出于计划维护的目的,允许管理员发起优雅的故障转移。

为了实现这个目标,在架构层面需要做一些改变:

  1. NameNode建必须要通过一些高可用的共享内存共享edit log,一旦standby NameNode接管工作的时候,它通过读取共享edit log 直至结尾以保持它的状态与active NameNode一致,然后继续读取由active NameNode写入的新条目。
  2. DataNodes必须向两个NameNode发送NameNode报告,因为NameNode映射关系是存储在NameNode的内存而不是磁盘。
  3. 客户端必须使用一种机制来处理NameNode失效问题,让用户对于NameNode的切换是透明的。(就是不需要用户自己去切换NameNode
  4. standby NameNode应该承担之前Secondary NameNode的角色,定期为active NameNode 的命名空间创建检查点。

在典型的HA集群中,会配置两个或更多的NameNodes,但是在任何时候,都只能有一个NameNode处于活动状态,其他NameNode处于备用状态。

Active状态的NameNode负责集群中的所有Client的操作,

Standby状态的NameNode仅需要保存足够的状态的即可。

有两种实现方式


Quorum Journal Manager (QJM)

QJM是一个专用的HDFS实现,设计的唯一目的是提供高度可用的编辑日志,并且是大多数HDFS安装的推荐选择。

QJM作为一组journalnodes(JNs)独立守护进程运行,每次编辑都必须写入大部分JNs节点。

为了使备节点与主节点保持状态同步,两个节点都与JNs进程通信。

Active NameNode执行任何关于名称空间修改时,它会持久地记录修改记录到大部分的JNs

通常,有三个journal节点,因此系统可以容忍其中一个节点的丢失。

尽管这种方式类似ZooKeeper工作方式,但是必须说明的是QJM实现没有使用ZooKeeper

同时还要注意,HDFS的HA确实使用了ZooKeeper来选择active NameNode,后续会介绍

standby NameNode能够从JNs中读取edits ,并不断监视它们对edit log的修改。

standby NameNode````看到这edits时,它将它们应用到自己的名称空间。

standby NameNode必须持有集群中NameNode位置的最新信息。

所以,DataNodes需要配置所有NameNode的位置,并向所有NameNode发送NameNode 位置信息和心跳。

因为standby NameNode 在内存中有最新的状态:最新的edit log和最新的NameNode映射

所以Active NameNode发生故障时,standby NameNode可以很快接管(在几十秒内)。

实际观察到的故障转移时间要长一些(大约一分钟左右),因为系统需要保守地判断active NameNode是否发生了故障。


NFS

QJM方共享不同,edit log记录到JNs不同,

此处的共享内存一般使用过一个支持NFS(Network File System:网络文件系统)的NAS(Network Attached Storage:网络附属存储)创建应共享文件,通常会挂载在每隔一个NameNode的机器上,NameNode可以对其进行读、写操作。

但是,目前只支持一个共享edit目录。

因此,系统的可用性受到共享edit目录的可用性的限制,

为了消除所有单点故障,共享编辑目录需要有冗余。

具体来说,就是到存储的多条网络路径,以及存储本身的冗余(磁盘、网络和电源)。

所以,建议使用高质量的专用NAS设备作为共享存储服务器,而不是简单的Linux服务器。


故障转移和规避

HA集群中,standby NameNode还执行名称空间状态检查点操作,

因此在HA集群中没有必要运行 Secondary NameNode, CheckpointNode, or BackupNode

同时无论是QJM还是NFS中,

在同一时刻只有一个NameNode处于Active是至关重要的。

否则,名称空间状态将很快在两者之间出现分歧(脑裂),可能导致数据丢失或其他不正确的结果。

为了避免这个情况,同一时间只允许一个NameNode 对 JournalNodes 或 NFS的共享内存写入。

在故障转移期间,即将成为Active状态的NameNode将接管向共享eidt文件写入数据的角色,

这将有效地阻止其他NameNode继续处于Active状态,从而允许新的Active状态安全地进行故障转移。

但是要如何实现呢?


故障转移

从active NameNodestandby NameNode```` 的过渡由系统中称为故障转移控制器(failover controller)的新实体进行管理。

可以理解为active NameNode挂了standby NameNode上位的过程

有各种各样的故障转移控制器,但是默认的实现是使用ZooKeeper来确保只有一个NameNodeactive的。

每个NameNode运行一个轻量级的故障转移控制器进程,

它的任务是监视它的NameNode是否出现故障(使用一个简单的心跳机制),

并在NameNode出现故障时触发故障转移。

故障转移也可以由管理员手动启动,

例如,在例行维护的情况下。

这被称为优雅的故障转移( graceful failover),因为故障转移控制器为两个NameNode安排了有序的角色转换。

但是,

在意料之外的故障转移的情况下,不可能确保失败的NameNode已经停止运行。

例如,网络或网络分区速度较慢的情况下,

即使以前active NameNode仍然在运行

也可能会触发故障转移。

为了避免这种情况,HA实现了确保以前active NameNode不会造成任不良影响的方法称为规避(fencing)。


规避

JNs一次只允许一个NameNode写入编辑日志;

但是,以前活跃的NameNode仍然可能向客户端提供过时的读请求,

因此可以设置一个SSH 规避命令来杀死NameNode进程。

对于使用NFS文件的共享edit log,因为很难控制一次只允许一个NameNode写入,

需要更强有力地规避方法,一般可以选择如下方法:

  1. 撤销NameNode对共享存储目录的访问(通常使用特定于供应商的NFS命令)
  2. 通过远程管理命屏蔽相应网络端口(port)
  3. 做绝一点可以通过一个叫做“一枪爆头”方式进行规避(STONITH,short the other node in the head),通过一个特定的供电单元对相应的NameNode进行断电操作。

这就是推荐使用QJM的主要原因。

有了上述只是储备,我们很容易就可以把这个架构图画出来,以QJM为例

那么转移过程大致如下:


客户端故障转移

对于客户端而言,我们要让用户对于故障转移是无感的。

可以通过配置文件实现一个故障转移

在配置文件中通过配置几个参数实现故障转移:

dfs.nameservices:Hdfs逻辑名称

<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>

dfs.ha.NameNodes.[nameservice ID]:nameservice中每个NameNode的唯一标识符

<property>
<name>dfs.ha.``NameNode``s.mycluster</name>
<value>nn1,nn2, nn3</value>
</property>

dfs.NameNode.rpc-address.[nameservice ID].[name node ID]:每个NameNode监听的完全限定RPC地址

<property>
<name>dfs.``NameNode``.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.``NameNode``.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
<property>
<name>dfs.``NameNode``.rpc-address.mycluster.nn3</name>
<value>machine3.example.com:8020</value>
</property>

更多的配置可以查看

NameNode HA With QJM

NameNode HA With NFS


关于HA暂时介绍到这里,后续有空再进行详细的介绍。

之后会写一下关于Yarn的文章,感兴趣可以关注【兔八哥杂谈】

大数据谢列3:Hdfs的HA实现的更多相关文章

  1. 大数据(3) - 高可用 HDFS HA

    HDFS HA高可用 1 HA概述 1)所谓HA(high available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制 ...

  2. 大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  3. 【大数据】Hadoop的高可用HA

    第1章 HA高可用 1.1 HA概述 1)所谓HA(high available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障(single point of fa ...

  4. 大数据系列2:Hdfs的读写操作

    在前文大数据系列1:一文初识Hdfs中,我们对Hdfs有了简单的认识. 在本文中,我们将会简单的介绍一下Hdfs文件的读写流程,为后续追踪读写流程的源码做准备. Hdfs 架构 首先来个Hdfs的架构 ...

  5. 大数据 - hadoop基础概念 - HDFS

    Hadoop之HDFS的概念及用法 1.概念介绍 Hadoop是Apache旗下的一个项目.他由HDFS.MapReduce.Hive.HBase和ZooKeeper等成员组成. HDFS是一个高度容 ...

  6. 大数据【二】HDFS部署及文件读写(包含eclipse hadoop配置)

    一 原理阐述 1' DFS 分布式文件系统(即DFS,Distributed File System),指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.该系统架构 ...

  7. 大数据开发实战:HDFS和MapReduce优缺点分析

    一. HDFS和MapReduce优缺点 1.HDFS的优势 HDFS的英文全称是 Hadoop Distributed File System,即Hadoop分布式文件系统,它是Hadoop的核心子 ...

  8. 大数据:Hadoop(HDFS 的设计思路、设计目标、架构、副本机制、副本存放策略)

    一.HDFS 的设计思路 1)思路 切分数据,并进行多副本存储: 2)如果文件只以多副本进行存储,而不进行切分,会有什么问题 缺点 不管文件多大,都存储在一个节点上,在进行数据处理的时候很难进行并行处 ...

  9. 我眼中的大数据(二)——HDFS

    Hadoop的第一个产品是HDFS,可以说分布式文件存储是分布式计算的基础,也可见分布式文件存储的重要性.如果我们将大数据计算比作烹饪,那么数据就是食材,而Hadoop分布式文件系统HDFS就是烧菜的 ...

随机推荐

  1. 第十章 Seata--分布式事务

    承接上篇 ,终于我们迎来了最后一章 第九章 Nacos Config–服务配置,第十章 Seata–分布式事务,感谢你能学习到这 !废话不多说,撸码 10.1 分布式事务基础 10.1.1 事务 事务 ...

  2. Dotnet Core多版本API共存的优雅实现

    API升级,新旧版本的API共存,怎么管理呢?   一.前言 最近,单位APP做了升级,同步的,API也做了升级. 升级过程中,出现了一点问题:API升级后,旧API也需要保留,因为有旧的APP还在使 ...

  3. 在vue cli3.0 里面下载less,下载成功了还是提示没有 需要下载

    今天正好新建了一个项目,在用less的时候就各种花样报错提示我: Failed to resolve loader: less-loaderYou may need to install it.Err ...

  4. Ubuntu Server 16.04.1 LTS 64位 搭建LNMP环境

    安装配置 Nginx 为了确保获得最新的 Nginx,先使用sudo apt-get update命令更新源列表.安装 Nginx,输入命令:sudo apt-get install nginx. 启 ...

  5. Cys_Control(六) MTreeView

    说明:由于Cefsharp浏览器项目需要各类控件,故之后的一些定义控件样式会参照Edge浏览器深色主题样式开发 一.查看TreeView原样式 1.通过Blend查看TreeView原有样式 < ...

  6. 【探索之路】机器人篇(3)-给mwRobot建立模型

    在创建一个mwRobot_description程序包那一节中,我们添加了依赖roscpp  rospy std_msgs 和 urdf , 现在我们再添加一个xacro依赖. 如何添加依赖? 打开程 ...

  7. select机制

    select机制 函数作用: 在一段时间指定的时间内,监听用户感兴趣的文件描述符上可读.可写和异常事件. 函数原型: #include <sys/time.h> #include < ...

  8. noip2016自测报告

    随便测了一下2016的提高组,发现自己还是太菜了... day1 T1:玩具谜题 一个模拟题,打挂了,只有95分,错的很傻逼 code: #include<bits/stdc++.h> u ...

  9. idea多模块启动

    2018版本的idea 原文链接http://zhhll.icu/2020/04/07/idea/idea%E4%B9%8B%E5%A4%9A%E6%A8%A1%E5%9D%97%E5%90%AF%E ...

  10. 算法历练之路——入学考试(JAVA)

    入学考试 时间限制: 1Sec 内存限制: 128MB 提交: 42 解决: 18 题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界 上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断 ...