Namenode HA框架

非HA的Namenode架构

一个HDFS集群只存在一个Namenode,Datanode只向一个Namenode汇报 ,Namenode的edit log存储在本地目录

HA架构:

包含两个Namenode,主(active)与备(standby),ZKFC(Zookeeper Failover Controller),ZK, share editlog(可以是NFS和QJM)

editlog
Namenode记录了HDFS的目录文件等元数据,客户端每次对文件的增删改等操作,Namenode都会记录一条日志,叫做editlog

ZKFC
Zookeeper故障转移控制器控制Namenode故障转移过程,每个Namenode对应一个ZKFC

NFS: Network File System
NameNode之间通过NAS进行元数据同步,有一定局限性

QJM: Quorum Journal Manager
(Quorum一致性:w+r>n r>n-w)
由JournalNode(JN)组成,一般是奇数个节点。JournalNode保存共享的编辑日志。每个JournalNode对外有一个简易的RPC接口,以供NameNode读写EditLog到JN本地。

流程:

集群启动后,一个Namenode处于active状态,并提供服务,处理客户端和datanode请求,并把editlog写到share editlog(JournalNode)和本地。

另一个Namenode处于Standby状态,它启动时从fsimage(File System Image)(保存了HDFS中文件名称,目录结构,文件权限等信息)加载HDFS元数据到内存,然后周期性地从share editlog(JournalNode)获取editlog,保持与active的状态同步。

为了实现standby在active挂掉后迅速提供服务,需要Datanode同时向两个Namenode发送心跳(block report 块状态报告)(健康状态和块位置),因为Namenode启动中最费时的工作是处理所有的datanode的block report。

ZKFC与ZK通信,通过ZK选主,ZKFC通过RPC让Namenode转换为active或standby。

NN HA

防止脑裂

  • 使用QJM实现共享同存储的fencing,以确保只有一个Namenode能写成功

  • Datanode fencing,只有一个Namenode能命令Datanode

  • 客户端fencing,确保只有一个Namenode能相应客户端请求,让访问standby的Namennode的客户端直接失败。

你可能感兴趣的:(Namenode HA框架)