HDFS-Hadoop NameNode高可用机制

目录
  • 1 - 为什么要高可用
  • 2 - NameNode 的高可用发展史
  • 3 - HDFS 的高可用架构
    • 3.1 Standby 和 Active 的命名空间保持一致
    • 3.2 同一时刻只有一个 Active NameNode
  • 4 - HDFS 高可用的实现原理
    • 4.1 隔离(Fencing)- 预防脑裂
    • 4.2 Qurom Journal Manager 共享存储
  • 5 - 其他补充
    • 5.1 QJM 的 Fencing 方案
    • 5.2 - HDFS 高可用组件简介
      • 5.2.1 ZKFailoverController
      • 5.2.2 HealthMonitor
      • 5.2.3 ActiveStandbyElector
  • 参考资料

1 - 为什么要高可用

在 Hadoop 中,NameNode 扮演着至关重要的角色 —— 整个 HDFS 文件系统的元数据信息都由 NameNode 管理,一旦 NameNode 进程出现异常,或者维护 NameNode 所在节点的时候,都会导致 HDFS 集群不可用。

所以 NameNode 的可用性直接决定了 Hadoop 集群的可用性。

2 - NameNode 的高可用发展史

在 Hadoop 2.0 以前,每个 HDFS 集群只有一个 NameNode,一旦这个节点不可用,则整个 HDFS 集群将处于不可用状态 —— 即,HDFS 2.0 以前,NameNode 存在单点故障风险。

与典型的 HA(High Availability,高可用)方案一样(参考:常见的六种容错机制),HDFS 2.0 开始支持的 HA,就是 在 HDFS 集群中同时运行两个 NameNode。

一个处于 Active(活跃)状态:负责集群中所有客户端的操作(修改命名空间、删除备份数据块等操作);

另一个处于 Standby(备份)状态:充当从服务器,和 Active NameNode 有相同的命名空间和元数据。

当 Active NameNode 停止服务时,Standby NameNode 能够快速进行故障切换,以保证 HDFS 集群服务不受影响。

3 - HDFS 的高可用架构

看图:

Standby NemeNode 是如何做到故障切换的?换句话说,它和 Active NameNode 之间的数据是如何保持一致的?

3.1 Standby 和 Active 的命名空间保持一致

它们存储着一样的元数据,可以把集群恢复到系统奔溃时的状态 —— 这是实现自动故障切换的基础。

为了使备份节点与活动节点的数据保持同步,两个节点都需要同一组独立运行的节点来通信,HDFS 中把这样的节点称为 JournalNode。

1)第一关系链的一致性,即 Active NameNode 和 Standby NameNode 的命名空间状态的一致性:

a)Active NameNode 会定期地把 修改命名空间或删除备份数据块等操作 记录到 EditLog,同时写到 JN 的多数节点中。

b)Standby NameNode 会一直监听 JN 上 EditLog的变化,如果 editlog 有改动,Standby NameNode 就会读取 editlog 并与当前的命名空间合并。

c)Active NameNode 出现故障时,Standby NameNode 会保证已经从 JN 上读取了所有 editlog 并与命名空间合并,然后才会从 Standby 切换为 Active。

2)第二关系链的一致性,即数据块的存储信息的一致性:

为了使故障切换能够尽快执行成功,就要保证 Standby NameNode 也 实时保存了数据块的存储信息,HDFS 中是这样做的:

DataNode 会同时向两个 NameNode 发送心跳以及块的存储信息。

这样以来,发生故障切换时,Standby NameNode 就可以直接切换到 Active 状态(它和旧 Active 节点的元数据完全一致),而不需要等待所有的 DataNode 汇报全量数据块信息 —— 这也是热备功能。

需要注意:Standby NameNode 只会更新数据块的存储信息,并不会向 DataNode 发送复制或删除数据块的指令,这些指令只能由 Active NameNode 发送。

3.2 同一时刻只有一个 Active NameNode

如果两个 NameNode 都是活跃状态,那么这个集群就会被分成2个小集群,它们都认为自己是唯一活动的集群。这就是著名的“脑裂”现象。

脑裂的 HDFS 集群很可能造成数据错乱、丢失数据块,还可能向 DataNode 下发错误的指令,这些错误都很难恢复。

4 - HDFS 高可用的实现原理

这里主要介绍通过隔离(fencing)和 Quorum Journal Manager(QJM)共享存储实现的 HDFS 高可用。

4.1 隔离(Fencing)- 预防脑裂

预防脑裂的常见方案就是 Fencing,即隔离,思路是把旧的 Active NameNode 隔离起来,使它不能正常对外提供服务,使集群在任何时候都只有一个 Active NameNode。

HDFS 提供了 3 个级别的隔离(Fencing):

1)共享存储隔离:同一时间只允许一个 NameNode 向 JournalNode 写入 EditLog 数据。

2)客户端隔离:同一时间只允许一个 NameNode 可以响应客户端的请求。

3)DataNode 隔离:同一时间只允许一个 NameNode 向 DataNode 下发命名空间相关的命令,例如删除块,复制块等。

4.2 Qurom Journal Manager 共享存储

在 HDFS 的 HA 架构中还有一个非常重要的部分:Active NameNode 和 Standby NameNode 之间如何共享 EditLog 文件。

解决思路是:Active NameNode 将日志文件写到共享存储上,Standby NameNode 实时地从共享存储读取 EditLog 文件,然后合并到 Standby NameNode 的命名空间中。一旦 Active NameNode 发生错误,Standby NameNode 就可以立即切换到Active状态。

HDFS 2.6 开始,提供了一个叫做 Qurom Journal Manager(QJM)的共享存储方案,来解决 HA 架构中元数据的共享存储问题。

QJM 基于 Paxos 算法实现,基本原理是:HDFS 集群中有 2n+1 台 JournalNode,EditLog 保存在 JN 的本地磁盘上;

每个 JournalNode 都允许 NmaeNode 通过它的 RPC 接口读写 EditLog 文件;

当 NmaeNode 向共享存储写入 EditLog 文件时,它会通过 QJM 向集群中所有的 JournalNode 并行发送写 EditLog 文件的请求,当有一半以上(>=n+1)的 JN 返回写操作成功时,就认为这次写操作成功了。

每次写数据操作有多数(>=n+1)JN 返回成功,就认为这次写操作成功了。

由此我们可以知道,这个 QJM 必须也是高可用的,否则 HDFS 的高可用就无法保障。

QJM 实现 HA 的主要好处:

  • 不存在单点故障问题;
  • 不需要配置额外的共享存储,降低了复杂度和维护成本;
  • 不需要单独配置 Fencing 实现(见文末#5.1节),因为 QJM 本身就内置了 Fencing 的功能;
  • 系统的鲁棒性程度是可配置的( QJM 基于 Paxos 算法,配置 2n+1 台 JournalNode,最多能容忍 n 台机器同时挂掉);
  • QJM 中存储日志的 JournalNode 不会因为其中一台的延迟而影响整体的延迟,而且也不会因为 JournalNode 的数量增多而影响性能(因为 NameNode 向 JournalNode 发送日志是并行的)。

关于 QJM 的具体工作原理,后面有机会了专门讲讲。

5 - 其他补充

5.1 QJM 的 Fencing 方案

QJM 的 Fencing 只能让原来的 Active NN 失去对 JN 的写权限,但是原来的 Active NN 还是可以响应客户端的请求,对 DataNode 进行读操作。

对客户端和 DataNode 的隔离是通过配置 dfs.ha.fencing.methods 实现的,Hadoop 公共库中有两种 Fencing 实现:

shell:即执行一个用户事先定义的 shell 命令或脚本来完成隔离。

sshfence:ssh 到原 Active NN 上,使用 fuser 结束进程(通过 TCP 端口号定位进程 pid,比 jps 命令更准确)。

5.2 - HDFS 高可用组件简介

5.2.1 ZKFailoverController

是基于 ZooKeeper 的故障转移控制器,它负责控制 NameNode 的主备切换,ZKFailoverController 会监测NameNode 的健康状态,当发现 Active NameNode 出现异常时会通过 ZooKeeper 进行一次新的选举,完成 Active 和 Standby 状态的切换。

5.2.2 HealthMonitor

周期性调用 NameNode 的 HAServiceProtocol RPC 接口(monitorHealth 和 getServiceStatus),监控 NameNode 的健康状态并向 ZKFailoverController 反馈。

5.2.3 ActiveStandbyElector

接收 ZKFailoverController 的选举请求,通过 ZooKeeper 自动完成主备选举,选举完成后回调 ZKFailoverController 的主备切换方法对 NameNode 进行 Active 和 Standby 状态的切换。

参考资料

//www.jb51.net/article/220423.htm

//www.jb51.net/article/220415.htm

以上就是Hadoop NameNode高可用机制的详细内容,更多关于Hadoop NameNode高可用的资料请关注我们其它相关文章!

(0)

相关推荐

  • Hadoop之NameNode Federation图文详解

    一. 前言 1.NameNode架构的局限性 (1)Namespace(命名空间)的限制 由于NameNode在内存中存储所有的元数据(metadata),因此单个NameNode所能存储的对象(文件+块)数目受到NameNode所在JVM的heap size的限制.50G的heap能够存储20亿(200million)个对象,这20亿个对象支持4000个DataNode,12PB的存储(假设文件平均大小为40MB).随着数据的飞速增长,存储的需求也随之增长.单个DataNode从4T增长到36

  • Hadoop中namenode和secondarynamenode工作机制讲解

    1)流程 2)FSImage和Edits nodenode是HDFS的大脑,它维护着整个文件系统的目录树,以及目录树里所有的文件和目录,这些信息以俩种文件存储在文件系统:一种是命名空间镜像(也称为文件系统镜像,File System Image,FSImage),即HDFS元数据的完整快照,每次NameNode启动的时候,默认会加载最新的命名空间镜像,另一种是命令空间镜像的编辑日志(Edit log). FSImage文件其实是文件系统元数据的一个永久性检查点,但并非每一个写操作都会更新这个文件

  • 带你了解HDFS的Namenode 高可用机制

    目录 HDFS NameNode 高可用 Hadoop Namenode 高可用架构 Namenode 高可用的实现 隔离(Fencing) QJM共享存储 HDFS NameNode 高可用 在 Hadoop 2.0.0 之前,一个集群只有一个Namenode,这将面临单点故障问题.如果 Namenode 机器挂掉了,整个集群就用不了了.只有重启 Namenode ,才能恢复集群.另外正常计划维护集群的时候,还必须先停用整个集群,这样没办法达到 7 * 24小时可用状态.Hadoop 2.0

  • HDFS-Hadoop NameNode高可用机制

    目录 1 - 为什么要高可用 2 - NameNode 的高可用发展史 3 - HDFS 的高可用架构 3.1 Standby 和 Active 的命名空间保持一致 3.2 同一时刻只有一个 Active NameNode 4 - HDFS 高可用的实现原理 4.1 隔离(Fencing)- 预防脑裂 4.2 Qurom Journal Manager 共享存储 5 - 其他补充 5.1 QJM 的 Fencing 方案 5.2 - HDFS 高可用组件简介 5.2.1 ZKFailoverCo

  • 详细讲解HDFS的高可用机制

    目录 互斥机制 写流程 读流程 恢复流程 在Hadoop2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,每个HDFS集群只有一个namenode,一旦这个节点不可用,则整个HDFS集群将处于不可用状态. HDFS高可用(HA)方案就是为了解决上述问题而产生的,在HA HDFS集群中会同时运行两个Namenode,一个作为活动的Namenode(Active),一个作为备份的Namenode(Standby).备份的Namenode的命名空间与活动的Namenode是实时同步的

  • 基于 ZooKeeper 搭建 Hadoop 高可用集群 的教程图解

    一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂,故下面先进行讲解: 1.1 高可用整体架构 HDFS 高可用架构如下: 图片引用自: https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-hi

  • centos7搭建hadoop2.10高可用(HA)

    本篇介绍在centos7中搭建hadoop2.10高可用集群,首先准备6台机器:2台nn(namenode);4台dn(datanode):3台jns(journalnodes) IP hostname 进程 192.168.30.141 s141 nn1(namenode),zkfc(DFSZKFailoverController),zk(QuorumPeerMain) 192.168.30.142 s142 dn(datanode), jn(journalnode),zk(QuorumPee

  • mongodb3.4集群搭建实战之高可用的分片+副本集

    前言 最近因为工作的原因,在学习使用mongodb数据库,mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置服务器等. 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server.shard.replica set. mongos,数据库集群请求的入口,

  • LVS+Keepalived构建高可用负载均衡配置方法(配置篇)

    一. LVS简介    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能.使用LVS技术要达到的目标是:通过

  • 设计高可用和高负载的网站系统的几个注意事项

    其实要设计一个高可用.高负载的系统还是有一定的规矩可循的,其手段无外乎向上扩展(Sacle Up 硬件扩展)或者向外扩展(Scale Out 软件扩展),这两种方案在某一阶段时期,会显著改善网站的性能,但不久之后,问题依旧.本文参考网上相关资料,试图提供一个可行的 "有限" 解决方案. 早期 1. 对业务应用进行垂直分割,将不同的业务边界划分出来.程序员常说的 "多层体系" 只是纵向解决了不同编程层次的划分,相对于业务而言,并没有做出什么处理.现在 SOA 大行其道

  • MySQL数据库的高可用方案总结

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法发微博,发微信等.一般而言,衡量高可用做到什么程度可以通过一年内服务不可用时间作为参考,要做到3个9的可用性,一年内只能累计有8个小时不可服务,而如果要做到5个9的可用性,则一年内只能累计5分钟服务中断.所以虽说每个公司都说自己的服务是7*24不间断的,但实际上能做到5个9的屈指可数,甚至根本做不到

  • haproxy+keepalived实现高可用负载均衡(理论篇)

    HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当 前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,并且能通过允许.拒绝.交换.增加.修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则. 我现在用HAProxy主要在于它有以下优点,这里我

随机推荐