写在前面

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见1000个问题搞定大数据技术体系

解答

在这里插入图片描述

解读 NameNode Standby

在 Hadoop2.x出来之前,集群中只有一个 NameNode,所以存在单点故障问题(即使存在 SecondaryNameNode、 CheckpointNode、 BackupNode,但是本质上不能解决单点故障问题)。

在 Hadoop2.x后引入了 High Availability(简称HA)机制,即一个集群中可以存在两个 NameNode( Active和 Standby),两者状态可以随时切换,

但是不能同时处于Active状态,最多允许一个 NameNode处于 Active状态。

所谓单点故障问题,就是 Hadoop集群中对外提供服务的只有一个 NameNode进程。当 NameNode进程出现故障时,会导致整个 Hadoop集群不可用

NameNode Active负责对外提供服务, NameNode Standby不会对外提供服务。

详情可以参考我的另一篇博客——图文详解HDFS的高可用和联邦到底是什么

为了保证两个 NameNode的元数据信息同步, Hadoop官方设计了两种方式,分别是 Network File System(简称NFS)和 Quorum Journal Manager(简称QJM)

在使用命令操作HDFS时, NameNode Active 和 NameNode Standby 之间的数据交互流程如下:

  1. NameNode Active 会把记录写到本地配置目录中,文件名以 edits_xxxxxx 进行命名,并将这些文件上传到NFS或者QJM中。
  2. NameNode Standby 会定期读取NFS或者QJM中最近的 edits_xxxxxx 文件,然后把这些文件和 fsimage_xxxxxx文件合并称为一个新的 fsimage_xxxxxx 文件。
  3. 当合并工作完成后, NameNode Standby 会通知 NameNode Active 获取最新合并的 fsimage_xxxxxx 文件,并替换掉旧的 fsimage_xxxxxx 文件

这样就保证了 Name Node Active和 NameNode Standby元数据信息是实时同步的。

当NameNode Active宕机后, NameNode Standby可以随时切换自己的状态,使当前 Standby 状态变为 Active状态并对外提供正常的服务。

NFS实现方式

NFS实现方式是由 NameNode Active 将最新的 edits_xxxxxx文件写入NFS,然后 NameNode Standby 会从NFS中将数据读取出来。

这种方式存在一定的缺陷,由于数据的传输都是通过网络来实现的,

若 NameNode Active 和 NameNode Standby 的其中一方和 NFS 之间存在网络问题,则会导致元数据信息不同步,其数据共享方式如图所示。

在这里插入图片描述

QJM实现方式

QJM实现方式解决了NFS容错机制不足的问题, NameNode Active 和 NameNode Standby 之间元数据信息共享通过集群中的 JournalNode 来实现。

NameNode Active 会把最近产生的 edits_xxxxxx 文件写到 2m+1 个 JournalNode 中,只要保证有 n+1 个 JournalNode 写入成功即可认定本次操作有效。

然后 NameNode Standby 就可以读取 JournalNode 中的数据进行合并操作。

JournalNode 的数量保持奇数,如3、5、7等、这个和 Zookeeper 的分布式选举算法类似,确保拥有容错机制,使 QJM 这种数据共享方式能够允许 n 个 JournalNode 失败。

在这里插入图片描述

Active & Standby

在 Hadoop 集群中, NameNode Active 和 Name Node Standby 可以随时切换状态。切换方式有两种,即手动切换和自动切换。

手动切换需要使用HA的管理命令来改变 NameNode 的状态,从 Active 到 Standby 或者从 Standby 到 Active。

具体命令如下:

# 查看待切换 NameNode节点的状态
[hadoop@node1 ~]$ hdfs haadmin -getServiceState node1 

# 强制将 node2 节点上的 NameNode Standby 切换为 Active
hadoop@node1 ~]$ hdfs haadmin -transitionToActive --forcemanual node2

# 将 node1 节点上的 NameNode Active 变为 Standby 
[hadoop@node1 ~]$ hdfs haadmin -failover --forcefence --forceactive node1 node2

如果在 Hadoop配置文件中配置了自动切换,当 NameNode Active 宕机时, NameNode Standby 会自动切换成 Active 状态,承担原来 NameNode Active的职责对外提供服务,保证HDFS的正常运行。

Active 和 Standby 在进行自动切换时需要 Zookeeper 来配合。

NameNode Active 和NameNode Standby 会将状态实时存储到 Zookeeper 中。

而 Zookeeper 会实时监听 Active 和 Standby的状态变化,当 Zookeeper 发现 NameNode Active 宕机后,会自动将 NameNode Standby 的状态切换为 Active,实现流程如图所示。

在这里插入图片描述

QJM VS NFS

对比 QJM 和 NFS 这两种实现数据共享的方式,QJM 有以下显著的优势

  1. QJM 本身拥有隔离(Fencing)机制,通过多个 JournalNode 保证了系统的可靠性。
  2. JournalNode消耗的资源很少,不需要额外的机器来启动 JournalNode 进程, 只需从 Hadoop 集群中选择几个节点启动 JournalNode 即可。

综上所述,一般在实际生产环境中会采用 QJM 来实现数据共享。

上一篇 下一篇