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 数据。

QJM中每一个JournalNode中均有一个epochnumber,匹配epochnumber的QJM才有权限更新 JN。当 Namenode 由 standby 状态切换成 active 状态时,会重新生成一个 epochnumber,并更新 JN 中的 epochnumber,以至于以前的 Active Namenode 中的QJM 中的 epoch number 和 JN 的 epochnumber 不匹配,故而原 Active Namenode上的 QJM 没法往 JN 中写入数据(后面会介绍源码),即形成了 fencing。

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 高可用组件简介

ZKFailoverController

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

HealthMonitor

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

ActiveStandbyElector

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

参考资料

https://hadoopdoc.com/hdfs/hdfs-namenode-ha

https://blog.csdn.net/u012736748/article/details/79534019

版权声明

作者:瘦风(https://healchow.com)

出处:博客园-瘦风的南墙(https://www.cnblogs.com/shoufeng)

感谢阅读,公众号 「瘦风的南墙」 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注

本文版权归博主所有,欢迎转载,但 [必须在页面明显位置标明原文链接],否则博主保留追究相关人士法律责任的权利。

HDFS 09 - HDFS NameNode 的高可用机制的更多相关文章

  1. HADOOP高可用机制

    HADOOP高可用机制 HA运作机制 什么是HA HADOOP如何实现HA HDFS-HA详解 HA集群搭建 目标: 掌握分布式系统中HA机制的思想 掌握HADOOP内置HA的运作机制 掌握HADOO ...

  2. Hadoop_32_HDFS高可用机制

    1.高可靠概念 HA(High Available):高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动 节点及备用节点 2.Hadoop的HA运作机制: :正式引入 ...

  3. SpringCloud系列十:SpringCloudConfig 高级配置(密钥加密处理(JCE)、KeyStore 加密处理、SpringCloudConfig 高可用机制、SpringCloudBus 服务总线)

    1.概念:SpringCloudConfig 高级配置 2.具体内容 在 SpringCloudConfig 之中考虑到所有配置文件都暴露在远程仓库之中的安全性问题,所以提供有安全访问的处理机制,这样 ...

  4. SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)

    1.概念:Eureka 服务发现框架 2.具体内容 对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操 ...

  5. 从零开始学spring cloud(八) -------- Eureka 高可用机制

    一.Eureka高可用机制介绍 Eureka服务器没有后端存储,但注册表中的服务实例都必须发送心跳以使其注册保持最新(因此可以在内存中完成). 客户端还有一个Eureka注册的内存缓存(因此,他们不必 ...

  6. Redis Sentinel 高可用机制

    内容目录: Sentinel 如何工作的? 核心配置项 怎么选出新 master 的? Sentinel 有多个,具体谁来执行故障转移? Sentinel 是怎么发现 slave 和其他 sentin ...

  7. Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析

    关于NameNode高可靠需要配置的文件有core-site.xml和hdfs-site.xml 关于ResourceManager高可靠需要配置的文件有yarn-site.xml 逻辑结构: Nam ...

  8. Spring Cloud Eureka 注册中心高可用机制

    一.Eureka 正常工作流程 Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据. Eurek ...

  9. 大数据高可用集群环境安装与配置(09)——安装Spark高可用集群

    1. 获取spark下载链接 登录官网:http://spark.apache.org/downloads.html 选择要下载的版本 2. 执行命令下载并安装 cd /usr/local/src/ ...

随机推荐

  1. leetcode 字符串转换整数 (模拟)

    思路分析 1.跟着题意模拟,分成几种情况来看待 2.一种全是空格 3.有可能有空格,然后有符号的 4.有可能有空格,无符号数字 5.有可能有空格,非数字开头 6.最后还需要考虑一个越界的问题,所以要除 ...

  2. mysql学习--MySQL存储引擎对比总结

    一.存储引擎是什么 存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的.MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用.你可以选择适用于服务器. ...

  3. 单片机与PLC的区别?

    单片机顾名思义集成在一个芯片内的计算机系统,又叫单片微控制器,英文:mcu,具有计算机的全部功能.PLC是英文Programmable Logic Controller的简称,翻译过来就是可编程逻辑控 ...

  4. Python单元测试框架unittest之单用例管理(二)

    概述 利用python进行测试时,测试用例的加载方式有2种: 一种是通过unittest.main()来启动所需测试的测试模块,上篇文章就是使用的这种方式: 一种是添加到testsuite集合中再加载 ...

  5. Pandas高级教程之:window操作

    目录 简介 滚动窗口 Center window Weighted window 加权窗口 扩展窗口 指数加权窗口 简介 在数据统计中,经常需要进行一些范围操作,这些范围我们可以称之为一个window ...

  6. Token验证详解

    为什么使用Token验证: 在Web领域基于Token的身份验证随处可见.在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式. 以下几点特性会让你在程序中使用基于To ...

  7. Tomcat网站根目录设置

    直接将war放入到webapps目录下 修改server.xml文件,在Host节点下添加如下代码 <Context path="/" docBase="web&q ...

  8. python + pytest基本使用方法(断言)

    #pytest 的基本用法# 安装: pip install pytest#在当前目录下运行 : 输入 pytest# 1.断言#功能:用于计算a与b相加的和def add(a,b): return ...

  9. 如何访问网络损伤仪WANsim的控制界面

    一台全新的WANsim网络损伤仪的默认IP地址为192.168.1.199.网络损伤仪的控制界面部署在 8080 端口. 所以,我们在成功连接了WANsim之后,只需要在控制电脑上打开谷歌浏览器,访问 ...

  10. @ControllerAdvice全局异常处理不起作用原因及解决办法

    这段时间使用springboot搭建基础框架,作为springboot新手,各种问题都有. 当把前端框架搭建进来时,针对所有controller层的请求,所发生的异常,需要有一个统一的异常处理,然后返 ...