带你了解HDFS的Namenode 高可用机制
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 发送日志是并行的)。
以上就是带你连接hdfs的namenode 高可用机制的详细内容,更多关于hdfs namenode 高可用的资料请关注其它相关文章!