概述
客户端在向hdfs发送读写请求的时候,首先会访问hdfs的namenode。namenode告诉该文件路径在哪个datanode或者应该将这个文件写到哪个datanode。也就是namenode管理着hdfs集群的所有元数据信息。而且这些信息元数据信息都是保存在内存中的。一般namenode的机器内存比较大。
这样有一个问题:元数据在内存中,如果宕机了怎么办?存在文件里?如果只是在文件里,namenode又无法满足性能要求(因为每个请求都要先请求namenode)。
需要在内存和文件中都有。内存中的数据用于应对访问请求,文件中的数据用于恢复。
namenode
namenode的元数据有3类:
- 内存中的元数据
- fsimage 镜像文件。保存在磁盘。相当于内存中的镜像文件。
- edits文件。用于每次元数据发生变更时的变更日志的保存。
namenode还有一个editsInProcessing文件,用于记录所有对元数据的写操作。namenode会经常将editsInProcessing的数据合并到内存。
namenode会定时的将fsimage和edits文件进行合并操作。而namenode的负载已经很高了,因此增加了一个secondaryNameNode来做这件事。
secondaryNameNode每3600s(可配置)或者edits文件变更了1百万次,就会往namenode发送checkpoint请求:namenode会将edtisInProcessing文件(每次对元数据的写操作都是追加这个文件)进行滚动生成新的edits文件,从namenode同步最新的fsimage和所有edits文件到secondaryNameNode,然后secondaryName开始合并操作,合并之后,回传给namenode。
datanode
datanode负责具体的数据存储。
datanode启动之后,会自动发现namenode,然后向namenode注册自己。