非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。
防止脑裂
使用QJM实现共享同存储的fencing,以确保只有一个Namenode能写成功
Datanode fencing,只有一个Namenode能命令Datanode
客户端fencing,确保只有一个Namenode能相应客户端请求,让访问standby的Namennode的客户端直接失败。