大数据谢列3:Hdfs的HA实现

在之前的文章:大数据系列:一文初识Hdfs
大数据系列2:Hdfs的读写操作 中Hdfs的组成、读写有简单的介绍。

在里面介绍Secondary NameNode和Hdfs读写的流程。
并且在文章结尾也说了,Secondary NameNode并不是我常说的HA,(High Availability)。

本文承接之前的内容,对Hdfs的HA实现做个简单的介绍。

NameNode的重要性

先来看看Hdfs读写的流程图:

大数据谢列3:Hdfs的HA实现

大数据谢列3:Hdfs的HA实现

可以看到无论是读还是写,我们都必须和存储元数据的NameNode进行交互。

一旦NameNode出问题,整个集群的读写基本上就凉凉了。

所以,在设计的时候本就有做一些容错的措施。

容错的措施

如果NameNode除了问题,整个文件Hdfs将不可用。

摄像一个场景:
如果以为某种原因我们运行NameNode的机器被删除。

此时所有Hdfs的文件都回丢失,因为我们虽然在DataNode中存储了文件的NameNode信息,但是我们无法通过这些NameNode重新构建文件。

所以让NameNode有一定抗拒错误的能力是很重要的。

而Hadoop本身提供了两种机制。

备份元数据

第一种机制:
将Hdfs元数据中持久化状态的文件做多个备份。

Hadoop 可以进行相关的配置,把这些持久的状态备份到多个文件系统。这个过程是同步且原子的 。
一般都是配置为本分到本例磁盘,同时远程NFS 挂载

Secondary NameNode

第二种机制:
运行一个Secondary NameNode,负责定期合并名称namespace iamge和edit log,以防止edit log变得过大。

合并流程如下,详细过程之前有介绍过,此处不累赘:

大数据谢列3:Hdfs的HA实现

存在问题

虽然有两个方式让Hdfs有一定的容错能力,但是还是存在一些问题。

Secondary NameNode拥有一个合并的namespace iamge像的副本,在NameNode失败时可以使用该iamge。

但是Secondary NameNode中的状态是滞后于NameNode的,如果NameNode是宕机的情况下,数据丢失必不可少。

此时通常的做法是将NFS上的NameNode元数据文件复制到Secondary NameNode,并将其作为新的NameNode运行。

因为NFS中的与NameNode的元数据是同步的,所以可以通过NFS中的数据恢复。

在多个文件系统上复制NameNode元数据和使用Secondary NameNode创建checkpoints的组合可以防止数据丢失。

然而这中组合的机制并不能提供Hdfs的高可用性。

主要原因是这种方式恢复太耗时间了。

NameNode是唯一的存储了文件与Blcok映射关系的元数据存储库
,一旦它罢工,所有的Client的作业包括Mapreduce、读、写、列出文件无法进行。
在新的NameNode上线之前,整个集群处于停止服务的状态

如果NameNode要重新上线服务需要经过一下的步骤:

加载明明空间到内存

重放edit log

从DataNode接收足够的NameNode报告并离开安全模式。

在具有许多文件和NameNode的大型集群上,NameNode的冷启动所需的时间可能是30分钟或更长。

这么拉垮可不太能接受,无论是日常运维还是计划停机之类的操作。

所以,归根结底就是NameNode仍然是存在单点故障(SPOF,Single Point Of Failure)

下面就看看怎么解决这个问题。

HDFS high availability (HA)

一般情况下会有两个场景和HA息息相关。

在出现计划外事件(如服务器宕机)的情况下,在重新启动NameNode之前,集群将不可用。

有计划的维护事件,例如NameNode机器上的软件或硬件升级,将导致集群停机。

为了解决上述的问题,Hadoop 提供了HDFS high availability (HA)的支持。

通过active-standby的方式配置两个NameNode(3.0后可以支持超过两个),在Active/Passive动配置中使用热备份。

在机器崩溃的情况下,实现快速故障转移到新的NameNode,
或者出于计划维护的目的,允许管理员发起优雅的故障转移。

为了实现这个目标,在架构层面需要做一些改变:

NameNode建必须要通过一些高可用的共享内存共享edit log,一旦standby NameNode接管工作的时候,它通过读取共享edit log 直至结尾以保持它的状态与active NameNode一致,然后继续读取由active NameNode写入的新条目。

DataNodes必须向两个NameNode发送NameNode报告,因为NameNode映射关系是存储在NameNode的内存而不是磁盘。

客户端必须使用一种机制来处理NameNode失效问题,让用户对于NameNode的切换是透明的。(就是不需要用户自己去切换NameNode)

standby NameNode应该承担之前Secondary NameNode的角色,定期为active NameNode 的命名空间创建检查点。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssyys.html