HDFS HA支持多Standby节点机制

本文介绍了Hadoop 3.0中HDFS HA支持多Standby节点的实现机制,包括Zkfc的选举、Checkpoint元数据同步、Bootstrap过程和Block token id的构造。在多Standby节点情况下,HDFS通过改造Zkfc的选举逻辑、优化元数据同步策略,确保系统的高可用性。同时,文章强调了在配置多Standby时数量不宜过多,以避免锁竞争和带宽使用问题。
摘要由CSDN通过智能技术生成

前言


在现有的HDFS中,为了保证其高可用性,社区在早些年就已经完成HDFS的HA机制,也就是One Active,One Standby。在此种情况下,HDFS能够容忍其中一个节点出现失败的情况。这套HA机制的实现的确给用户带来了很大的帮助,基于此特性,我们可以做很多集群上的热操作,比如热迁移NameNode,或者滚动升级HDFS等等。可能唯一让人感觉还不是最好的一点是,它不能容忍更多失败的情况,比如2个NameNode都发生失败的情况。在其他的一些分布式系统中,例如Zookeeper,它的内部就可以容忍其中2节点出现崩溃的情况,当它启动了5个节点的时候。在HDFS内部的block副本设计上,也是保证了3副本的设计理念,同样可以容忍2个副本损坏的情况。所以我们不禁开始联想,在HDFS中什么时候也能容忍更多的出错情况?更具体地说,就是在只有一个Active NameNode情况下,同时有多个Standby NameNode。这样的话,HDFS的HA特性看上去就非常的强大了。本文我们就来好好聊聊这个话题。

HDFS多Standby节点机制概述


前面的铺垫内容说了这么多,那么到底目前是否已经有多Standby节点的实现机制呢?答案是有的,但是它还没有发布,目标发布版本Hadoop 3.0.又是在3.0版本,之前本人介绍了许多很棒的特性都是在这个版本发布的(比如HDFS EC),大家敬请期待这个版本吧。社区JIRA HDFS-6440(Support more than 2 NameNodes)最终实现了HA中支持多Standby的特性。本文是我阅读完此JIRA上的设计文档以及代码实现后所写的总结性文章,更多设计细节可以查看原文档。

在之前HDFS的HA的设计实现中,其实已经帮我们实现了许多在未来可能有多Standby节点出现的情况。所以在这里,我们只需要在原来One Active,One Standby完善的机制下,做局部的修改,来满足多Standby的情况即可。以下为几个需要修改的点:

  • Zkfc的Active选举,此时不是只有另外一个可选节点,而是很多个Standby节点。
  • Checkpoint过程以及Active NameNode上的Fsimage同步问题,之前都是一个Standby NameNode定期发给Active NameNode,这个时候有多个Standby,怎么办。
  • Bootstrap过程。之前都是向另外一个Active NameNode进行bootstrap,而现在有多个节点。
  • Block token id的生成。

主要为以上4点,其中第2点最为重要,因为涉及到元数据的更新同步,逻辑也作为复杂。在下一小节中,我们将会针对这4点做详细的分析。

多Standby节点细节实现


此小节将会针对以上提出的4点展开分析,下面首先是zkfc相关的改造。

Zkfc的选举


与原先的HA机制相比,多Standby的情况会造成锁竞争的加剧,因为每个Standby节点上的zkfc进程都要尝试获取锁,然后才会将自己的状态切到Active。所以在此建议的Standby数量不宜过多,3~5个足够了。还有当进行手动切换的时候,这个时候要保证其他节点此时不发生切换动作。

Checkpoint元数据同步过程


先来回顾一下原先HA机制的元数据同步过程:

Standby节点周期性的读取JournalNode上的editlog,等到了一次checkpoint周期,然后做一次checkpoint,然后将新的fsimage同步到Active节点。

在这个如果是多个Standby节点的情况,这个处理过程就没有那么简单了,下面几个是主要要解决的问题:

  • 这么多个Standby节点,每个节点上都有自己的fsimage,该选哪个作为最终上传镜像文件的节点呢?
    答:选择元数据最新的Standby,评判标准是看当前最新的txid。
  • 如果Active节点当前已经同步了最新fsimage,而Standby节点又将稍老的fsimage同步过去,怎么办?
    答:Active节点会进行比较,如果的确是老的fsimage,会给出失败的回复应答。

以上两点在后面代码实现的部分会有具体的体现。

Bootstrap过程


我们知道bootstrap的用处一般是在集群开始搭建时,将Active上的fsimage等元数据同步到当前的节点上,然后启动当前节点。而在当前多Standby节点的变化是,由向原来另外一个Active获取元数据变为同时向多个其他节点抓取元数据,直到有一个节点能抓取到元数据为止。

Block token id的构造


在block token id的生成中,会根据当前NameNode index下标来生成serialNo序列号数字,然后将此数字应用到token id的生成。生成代码如下:

   public synchronized void setSerialNo(int serialNo) {
     this.serialNo = (serialNo & LOW_MASK) | (nnIndex << 31); 
   }

但是原先的处理逻辑,只适用于2个NameNode的情况,也就是下标0和1的情况。在多个Standby出现的情况,NameNode的下标就有可能出现2,3,4等情况。因此此逻辑也需要进行修改。具体改动可见HDFS-6440上的设计文档。

多Standby情况下的Checkpoint同步


因为在多Standby情况下的checkpoint,fsmage同步过程最为复杂,此节我们从源代码实现层面来学习一下其中的过程,主要涉及以下2个类的改造:

  • StandbyCheckpointer:Standby NameNode上专门控制做checkpoint以及上传fsimage到Active NameNode的服务。
  • ImageServlet:NameNode服务请求处理类,里面包含了fsimage上传请求的处理逻辑。

我们首先进入StandbyCheckpointer类,

HDFSHA(High Availability)机制是为了提供对Hadoop分布式文件系统的高可用性而设计的。HA机制主要通过以下两个关键组件来实现: 1. NameNode HA:在传统的HDFS架构中,NameNode是HDFS的关键组件,负责管理文件系统的命名空间和数据块的元数据。在HA机制中,引入了Active NameNode和Standby NameNode两个角色,以确保高可用性。 - Active NameNode:负责处理客户端的读写请求,并维护文件系统的元数据。它是主要的NameNode角色。 - Standby NameNode:作为备用节点,定期从Active NameNode同步命名空间和元数据。在Active NameNode发生故障时,Standby NameNode可以快速接管成为Active NameNode。 2. JournalNodes:JournalNodes是一组节点,用于存储HDFS的编辑日志。编辑日志记录了对文件系统的所有修改操作。Active NameNode将修改操作写入JournalNodes,并Standby NameNode从JournalNodes读取这些修改操作,以保持与Active NameNode的同步。 HA机制的工作原理如下: 1. 在HA配置中,Active NameNode和Standby NameNode运行在不同的机器上,并且它们共享相同的配置和元数据。 2. 当客户端发起写操作时,Active NameNode处理请求并将修改操作写入本地编辑日志和JournalNodes。 3. Standby NameNode定期从JournalNodes读取编辑日志,并将这些修改操作应用到自己的命名空间和元数据上。 4. Standby NameNode与Active NameNode之间通过心跳机制进行通信,以了解Active NameNode的状态。如果Standby NameNode检测到Active NameNode不可用,它会尝试接管成为新的Active NameNode。 通过NameNode HA机制HDFS可以实现高可用性,即使在NameNode发生故障时也能保持文件系统的正常运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值