1.冗余备份
HDFS将每个文件存储成一系列数据块(Block),默认块大小为64MB (可配置)。为了容错,文件的所有数据块都会有副本(副本数量即复制因子,可配置)。HDFS的文件都是一次性写入的,并且严格限制为任何时候都只有一个写用户。DataNode使用本地文件系统存储HDFS的数据,但是它对HDFS的文件一无所知,只是用一个个文件存储HDFS的每个数据块。当DataNode启动时,它会遍历本地文件系统,产生一份HDFS数据块和本地文件对应关系的列表,并把这个报告发给NameNode,这就是块报告(Blockreport)。块报告包括了DataNode上所有块的列表。
2.副本存放
HDFS集群一般运行在多个机架上,不同机架上机器的通信需要通过交换机。通常情况下,副本的存放策略很关键,机架内节点之间的带宽比跨机架节点之间的带宽要大,它能影响HDFS的可靠性和性能。HDFS采用机架感知(Rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。通过机架感知,NameNode可以确定每个DataNode所属的机架ID。一般情况下,当复制因子是3的时候,HDFS的部署策略是将一个副本放在同一机架上的另一个节点,一个副本存放在本地机架上的节点,最后一个副本放在不同机架上的节点。机架的错误远比节点的错误少,这个策略可以防止整个机架失效时数据丢失,不会影响到数据的可靠性和可用性,又能保证性能。目前,副本存放策略还正在开发中。图6-2体现了复制因子为3的情况下,各数据块的分布情况。
3.心跳检测
NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,收到心跳包说明该DataNode工作正常。NameNode会标记最近没有心跳的DataNode为死机,不会发给它们任何新的I/O请求。任何存储在死机的DataNode的数据将不再有效,DataNode的死机会造成一些数据块的副本数下降并低于指定值。NameNode会不断检测这些需要复制的数据块,并在需要的时候重新复制。重新复制的引发可能有多种原因,比如DataNode不可用、数据副本的损坏、DataNode上的磁盘错误或复制因子增大等。
4.安全模式
系统启动时,NameNode会进入一个安全模式。此时不会出现数据块的写操作。NameNode会收到各个DataNode拥有的数据块列表对的数据块报告,因此NameNode获得所有的数据块信息。数据块达到最小副本数时,该数据块就被认为是安全的。在一定比例(可配置)的数据块被NameNode检测确认是袁幸之后,再等待若干时间,NameNode自动退出安全模式状态。当检测到副本数不足的数据块时,该块会被复制到其他数据节点,以达到最小副本数。
5.数据完整性检测
多种原因会造成从DataNode获取的数据块有可能是损坏的。HDFS客户端软件实现了对HDFS文件内容的校验和(Checksum)检查,在HDFS文件创建时,计算每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在命名空间下。当客户端获取文件后,它会检査从DataNode获得的数据块对应的校验和是否和隐藏文件中的相同,如果不同,客户端就会认为数据块有损坏,将从其他DataNode获取该数据块的副本。
6.空间回收
文件被用户或应用程序删除时,并不是立即就从HDFS中移走,而是先把芦移动到/trash自录里。只要还在这个目录里,文件就可以被迅速恢复。文件在这个目录鱼的时间是可以配置的,超过了这个时间,系统就会把它从命名空间中删除件的删除操作会引起相应数据块的释放,但是从用户执行删除操作到从系统中看到剩余空间的增加可能会有一个时间延迟。只要文件还在/trash目录里,用户可以取消删除操作。当用户想取消时,可以浏览这个目录并取回文件,这个目录只保存被删除文件的最后副本。这个目录还有一个特性,就是HDFS会使用特殊策略自动删除文件。当前默认的策略是:文件超过6个小时后自动删除,在未来版本里,这个策略可以通过定义良好的接口来配置。
7.元数据磁盘失效
映像文件和事务日志是HDFS的核心数据结构。如果这些文件损坏,将会导致HDFS不可用。NameNode可以配置为支持维护映像文件和事务日志的多个副本,任何对映像文件或事务日志的修改,都将同步到它们的副本上。这样会降低NameNodl处理命名空间事务的速度,然而这个代价是可以接受的,因为HDFS是数据密集,而非元数据密集的。当NameNode重新启动时,总是选择最新的一致的映像文件和事务日志。在HDFS集群中NameNode是单点存在的,如果它出现故障,必须手动干预。目前,还不支持自动重启或切换到另外的NameNode。
8.快照
快照支持存储某个时间的数据复制,当HDFS数据损坏时,可以回滚到过去一个已知正确的时间点。HDFS目前还不支持快照功能。