高可用架构图

先上一张搜索来的图。

如上图,HDFS的高可用其实就是NameNode的高可用。

上一篇里,SecondaryNameNode是NameNode单节点部署才会有的角色,它只帮助NameNode完成日志合并的工作,在NameNode出现问题时不能顶上去。

在高可用里,不再有SecondaryNameNode这个角色,Hadoop2.x版本支持NameNode的一主一备,3.x版本支持一主多备,由备机完成日志合并任务。某个时点只有主NameNode对外提供服务。

总结一下,在一个高可用的HDFS集群里,至少需要这么几个角色:

  • DataNode,存数据的节点,没它就不能叫文件系统了
  • NameNode,有两个或多个,主节点状态是Active,备节点状态是Standby,备节点来同步、合并、推送主节点的FsImage
  • 共享存储,存放的是主节点的实时日志,备节点从共享存储里异步同步日志,官方有QJM和NFS两种实现

为了实现NameNode的自动切换,还需要这两个角色:

  • Zookeeper,分布式协调器,NameNode选主用的
  • ZKFS,Zookeeper客户端,监控NameNode状态,并与Zookeeper保持长连接,与NameNode在一台机器上部署

高可用原理

它的高可用步骤如下:

  1. 在配置文件中配置多个NameNode属于同一个cluster,启动hdfs后,NameNode通过zookeeper选主
  2. 客户端通过dfs.client.failover.proxy.provider.[clusterID]配置的策略去访问NameNode,通常是向所有的NameNode发送请求来判断哪个是主节点
  3. 客户端对主NameNode发起的操作会同步写入共享存储,这里不直接写入其他NameNode是为了避免由于NameNode故障引起响应超时
  4. DataNode把文件的Block信息发送给所有的NameNode
  5. 备NameNode按照时间间隔或者日志文件大小来合并主NameNode的FsImage
  6. 如果主节点的NameNode或者ZKFS挂了
    1. 如果主NameNode挂了,本机的ZKFS会将ZK集群的锁释放,并回调其他ZKFS的方法,通知它们来拿锁。拿到锁的ZKFS连接一下原来的主NameNode,发现确实挂了,再把本机的NameNode状态由Standby修改为Active。
    2. 如果ZKFS挂了,ZKFS与ZK的TCP连接会断掉。ZK集群将删除该ZKFS持有的锁,并回调其他ZKFS的方法,通知它们来拿锁。拿到锁的ZKFS连接一下原来的主NameNode,发现它还活着,ZKFS先把原来的主NameNode降级为Standby,再把本机的NameNode升为Active。

高可用环境搭建

Hadoop的官方文档讲的很详细,参考 《用QJM实现HDFS的高可用》

HDFS联邦

一个主NameNode里存放的元数据毕竟容量有限,在数据量大的时候,很可能无法满足需要。

HDFS联邦机制类似于HDFS的分片存储,把所有元数据分散在多个NameNode里,互相没有交集。

那么客户端怎么知道要访问的数据该连接哪一个NameNode呢?这涉及到在多个NameNode之上增加一个抽象层的问题,由抽象层来确定到底该访问哪一个NameNode。

大数据学习(03)——HDFS的高可用的更多相关文章

  1. 大数据学习笔记——HDFS理论知识之编辑日志与镜像文件

    HDFS文件系统——编辑日志和镜像文件详细介绍 我们知道,启动Hadoop之后,在主节点下会产生Namenode,即名称节点进程,该节点的目录下会保存一份元数据,用来记录文件的索引,而在从节点上即Da ...

  2. 入门大数据---基于Zookeeper搭建Kafka高可用集群

    一.Zookeeper集群搭建 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本 Zooke ...

  3. 入门大数据---基于Zookeeper搭建Spark高可用集群

    一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...

  4. 大数据学习之HDFS基本API操作(下)06

    hdfs文件流操作方法一: package it.dawn.HDFSPra; import java.io.BufferedReader; import java.io.FileInputStream ...

  5. 大数据学习之HDFS基本API操作(上)06

    package it.dawn.HDFSPra; import java.io.FileNotFoundException; import java.io.IOException; import ja ...

  6. 大数据学习之hdfs集群安装部署04

    1-> 集群的准备工作 1)关闭防火墙(进行远程连接) systemctl stop firewalld systemctl -disable firewalld 2)永久修改设置主机名 vi ...

  7. 大数据学习笔记——HDFS写入过程源码分析(2)

    HDFS写入过程注释解读 & 源码分析 此篇博客承接上一篇未讲完的内容,将会着重分析一下在Namenode获取到元数据后,具体是如何向datanode节点写入真实的数据的 1. 框架图展示 在 ...

  8. 大数据学习笔记——HDFS写入过程源码分析(1)

    HDFS写入过程方法调用逻辑 & 源码注释解读 前一篇介绍HDFS模块的博客中,我们重点从实践角度介绍了各种API如何使用以及IDEA的基本安装和配置步骤,而从这一篇开始,将会正式整理HDFS ...

  9. 大数据学习之HDFS基本命令操作05

    1)hdfs的客户端 1.网页形式->测试用 http://192.168.40.11:50070/dfshealth.html#tab-overview 2.命令行形式->测试用 3.企 ...

  10. 大数据学习之HDFS的工作机制07

    1:namenode+secondaryNameNode工作机制 2:datanode工作机制 3:HDFS中的通信(代理对象RPC) 下面用代码来实现基本的原理 1:服务端代码 package it ...

随机推荐

  1. Java安全之Fastjson内网利用

    Java安全之Fastjson内网利用 0x00 前言 在打Fastjson的时候,基本上都是使用JNDI注入的方式去打,也就是 JdbcRowSetImpl 链分析的链去打,但是遇到一些不出网的情况 ...

  2. C#WebApi的创建与发布

    VS中新建项目-Web-ASP.NET Web应用程序 然后确定,选择空模版就可以了,勾上Webapi(也可以选择webapi模板,这样生成的文件比较多) 添加好之后Controllers和Model ...

  3. 最佳实践丨使用Rancher轻松管理上万资源不是梦!

    前 言 Rancher 作为一个开源的企业级 Kubernetes 集群管理平台.你可以导入现有集群,如 ACK.TKE.EKS.GKE,或者使用 RKE.RKE2.K3s 自定义部署集群. 作为业界 ...

  4. Vue(11)组件化的基本使用

    前言 有时候有一组html结构的代码,并且这个上面可能还绑定了事件.然后这段代码可能有多个地方都被使用到了,如果都是拷贝来拷贝去,很多代码都是重复的,包括事件部分的代码都是重复的.那么这时候我们就可以 ...

  5. [HTML]图像标签<img>的用法、属性及路径问题

    图像标签:<img>        用法:<img src = "图像地址"> 图像标签的属性 属性 说明 src 指明图像的地址(分为相对路径和绝对路径两 ...

  6. 乘风破浪,Windows11官方原装4K壁纸,前卫的艺术数字设计

    Windows11预览版官方壁纸 默认主题Windows Windows.zip 月轮主题ThemeA ThemeA.zip 艺术石主题ThemeB ThemeB.zip 日升主题ThemeC The ...

  7. (转发)forward与(重定向)redirect的区别

    (转发)forward与(重定向)redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服 ...

  8. 在一个py脚本中调用另外一个py脚本中的类或函数

    1.两个文件在同一目录,直接import即可 2.两个文件在不同目录 在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路 ...

  9. ctf Decode

    这题其实没啥好说的,就是直接解,听学长说好像网上有现成的轮子可以用,我太年轻了,手动写了个decode函数. 也成功得到了flag.嘿嘿开心

  10. bash的RANDOM变量生成的是真正的随机数吗

    static void seedrand () { struct timeval tv; gettimeofday (&tv, NULL); sbrand (tv.tv_sec ^ tv.tv ...