1.1 HDFS关键特性
1.1.1 HDFS高可用性
NameNode中存储的是元数据信息(FSImage)和操作日志(EditLog),客户端对HDFS的任何读写操作都需要从NameNode获取元数据后才可以进行后续操作。NameNode的健康情况直接影响着整个存储系统的使用。如果NameNode出现故障,所有客户端将无法操作HDFS上的数据。
在Hadoop 2.x中,增加了对HDFS高可用性(High Availability,HA)的支持,很好地解决了上述单点NameNode的故障问题。架构如图2-1所示,在这个架构中,HDFS的可靠性主要体现在使用ZooKeeper来实现主备NameNode。两台NameNode形成互备,一台处于Active状态,称为主NameNode,其功能和非高可用下的NameNode节点类似,用于接收客户端的RPC请求并提供服务。另一台处于Standby状态,称为备用NameNode,主要用作同步主NameNode上的元数据并作为它的热备。当主NameNode失效,备用NameNode会快速接管来自客户端的请求,恢复HDFS服务。
Hadoop3.X中允许用户运行多个备用NameNode,但是主NameNode始终只有一个,剩余的都是备用NameNode。这种架构下,集群可以容忍多个NameNode节点的故障。
图 2-1 HDFS高可用架构
1.1.2 元数据持久化
HDFS元数据(描述文件)持久化由FSImage和Editlog两个文件组成,EditLog:记录用户的操作日志,用以在FSImage的基础上生成新的文件系统镜像。FSImage:用以阶段性保存文件镜像。
随着HDFS运行进行持续更新,元数据持久化的过程如图2-2所示。首先在HDFS 第一次格式化后,NameNode(即图中的Active NameNode)就会生成fsimage和editslog两个文件。第二步,备用NameNode(即图中的Standby NameNode)从主用NameNode上下载FSimage,并从共享存储中读取EditLog;第三步,备用NameNode将日志和旧的元数据合并,生成新的元数据FSImage.ckpt;第四步,备用NameNode将元数据上传到主用NameNode;第五步,主用NameNode将上传的元数据进行回滚;最后,循环第一步。
图 2-2 元数据持久化过程