带你了解HDFS的Namenode 高可用机制
作者:大象教程 发布时间:2023-12-08 10:20:45
目录
HDFS NameNode 高可用
Hadoop Namenode 高可用架构
Namenode 高可用的实现
隔离(Fencing)
QJM共享存储
HDFS NameNode 高可用
在 Hadoop 2.0.0 之前,一个集群只有一个Namenode,这将面临单点故障问题。如果 Namenode 机器挂掉了,整个集群就用不了了。只有重启 Namenode ,才能恢复集群。另外正常计划维护集群的时候,还必须先停用整个集群,这样没办法达到 7 * 24小时可用状态。Hadoop 2.0 及之后版本增加了 Namenode 高可用机制,下面详细介绍。
Hadoop Namenode 高可用架构
Hadoop 2.0 克服了 Namenode 单点故障问题,即在一个集群中有2个 Namenode 节点,一个是活动的Namenode节点(Active Namenode),即主节点,一个是备用 Namenode(Passive Namenode),即备用节点,而且支持热备份和故障切换。
活动 Namenode:负责处理集群中所有客户端请求。
备用 Namenode:备用节点,拥有和活动的 Namenode 一样的元数据。在活动 Namenode 失效后,会接管它的工作。
活动 Namenode 和备用 Namenode 之间是如何同步数据的呢?即他们是怎么保持一致性的,主要有下面几点:
活动和备用 Namenode 两者总是同步的,例如,他们存储着一样的元数据,这可以把集群恢复到系统奔溃时的状态。而且基于此还能实现自动故障切换。
同一时间,集群只能有一个活动的 Namenode 节点,否则,两个 Namenode 会导致数据发生错乱并且无法恢复。我们把这种情况称为“脑裂”现象,即一个集群被分成两个小集群,并且两边都认为自己是唯一活动的集群。Zookeeper 社区对这种问题的解决方法叫做 fencing,中文翻译为隔离,也就是想办法把旧的 活动 NameNode 隔离起来,使它不能正常对外提供服务,使集群始终只有一个活动的 Namenode。
了解完 Hadoop 高可用架构之后,让我们来看一下 Hadoop Namenode 高可用是怎么实现的。
Namenode 高可用的实现
这里主要介绍通过隔离(fencing)和Quorum Journal Manager(QJM)共享存储实现的 HDFS 高可用。
隔离(Fencing)
隔离(Fencing)是为了防止脑裂,就是保证在任何时候HDFS只有一个Active NN,主要包括三个方面:
共享存储fencing:确保只有一个NN可以写入edits。QJM中每一个JournalNode中均有一个epochnumber,匹配epochnumber的QJM才有权限更新 JN。当 Namenode 由 standby 状态切换成 active 状态时,会重新生成一个 epochnumber,并更新 JN 中的 epochnumber,以至于以前的 Active Namenode 中的QJM 中的 epoch number 和 JN 的 epochnumber 不匹配,故而原 Active Namenode上的 QJM 没法往 JN 中写入数据(后面会介绍源码),即形成了 fencing。
客户端f encing:确保只有一个 Namenode 可以响应客户端的请求。
DataNode fencing:确保只有一个 Namenode 可以向 Datanode 下发命令,譬如删除块,复制块,等等。
QJM 的 Fencing 方案只能让原来的 Active Namenode 失去对 JN 的写权限,但是原来的 Active Namenode 还是可以响应客户端的请求,对 Datanode 进行读。对客户端和 DataNode 的 fence 是通过配置 dfs.ha.fencing.methods 实现的。
Hadoop 公共库中有两种Fencing实现:sshfence、shell
sshfence:ssh到原Active NN上,使用fuser结束进程(通过tcp端口号定位进程 pid,该方法比 jps 命令更准确)。
shell:即执行一个用户事先定义的shell命令(脚本)完成隔离。
QJM共享存储
Qurom Journal Manager(QJM)是一个基于 Paxos 算法实现的 HDFS 元数据共享存储的方案。QJM 的基本原理就是用 2N+1 台 JournalNode 存储 EditLog,每次写数据操作有大多数(>=N+1)返回成功时即认为该次写成功,数据不会丢失。这个算法所能容忍的是最多有 N 台机器挂掉,如果多于 N 台挂掉,这个算法就失效了。这个原理是基于 Paxos 算法的。
用QJM的方式来实现HA的主要好处有:
不需要配置额外的高共享存储,这样对于基于商用硬件的云计算数据中心来说,降低了复杂度和维护成本;
不在需要单独配置 fencing 实现,因为 QJM 本身内置了 fencing 的功能;
不存在单点故障问题;
系统鲁棒性的程度是可配置的( QJM 基于 Paxos 算法,所以如果配置 2N+1 台 JournalNode 组成的集群,能容忍最多 N 台机器挂掉);
QJM 中存储日志的 JournalNode 不会因为其中一台的延迟而影响整体的延迟,而且也不会因为 JournalNode 的数量增多而影响性能(因为 Namenode 向 JournalNode 发送日志是并行的)。
来源:https://hadoopdoc.com/hdfs/hdfs-namenode-ha


猜你喜欢
- 如何使用Office Chart 9.0 制作图表?代码如下:chart90.asp<HTML><HEAD><
- 这几天在一机多卡的环境下,用pytorch训练模型,遇到很多问题。现总结一个实用的做实验方式:多GPU下训练,创建模型代码通常如下:os.e
- class Account(object): "一个简单的类" account_type="Basic&quo
- replace()最简单的算是能力就是简单的字符替换。示例代码如下: <script language="javascrip
- 先看看Zeplin 的颜色色值显示示例原有处理方式因为我会 Python (仅限于终端输入 python 然后当做计算器算,或者用 hex(
- 网上我也见到一些分栏效果,也有一个jquery的插件jquery.splitter.js, 但是他们基本都没有解决一个问题:如果页面上有if
- 背景借助django-admin,可以快速得到CRUD界面,但若需要创建多选标签字段时,需要对表单进行调整示例model.py一个tag(标
- python实现12306余票查询我们说先在浏览器中打开开发者工具(F12),尝试一次余票的查询,通过开发者工具查看发出请求的包余票查询界面
- 一、Jenkins 是什么?Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。二、准备工作安
- 前序在Python中,集合(Set) 是一个无序、不重复的序列,它不支持索引。集合一般用于元素去重或者一些数学中的操作像union,inte
- 首先想到的就是contains,contains用法如下:select * from students where contains(add
- 如下所示:# coding: utf-8import osimport psutilimport timedef write_pid():
- 这是一个系列文章,主要分享python的使用建议和技巧,每次分享3点,希望你能有所收获。1 如何创建指定长度且有特定值的list不推荐方式l
- 本文实例讲述了Python实现MySQL操作的方法。分享给大家供大家参考,具体如下:1. 安装MySQLdb.从网站下载Mysql for
- eval() 函数用来执行一个字符串表达式,并返回表达式的值。eval函数功能:将字符串str当成有效的表达式来求值并返回计算结果。eval
- MySQL的ALTER命令是非常有用的,当想改变表的名称,表的字段,或者如果要添加或删除一个现有的表中的列。让我们开始创建一个表名为test
- Vue baseurl配置最近的一个vue项目,没有config文件夹,配置baseurl废了很大劲,终于找到了方法,感天动地o(╥﹏╥)o
- 开发过程中,我们经常会遇到代码回滚的情况。正常人都知道,git 回滚有两大宝:git revertgit reset当我们在本地开发,还未
- 一、复制原理主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新.当一个从服务器连接主
- 在Linux下安装Oracle数据库是一件较为麻烦的事情。由于Linux的安装过程中可能会选择不同的安装包,会导致Oracle安装过程中缺失