一、概述

用户使用 HDFS 的时候,会将每个 DataNode 数据目录所在的本地目录挂载到某块独立的盘上,以此来完全利用节点的存储空间。所以如果某块盘突然发生了硬件故障导致写文件失败,这块盘将会被 HDFS 检测出来,并加入到坏盘列表,其上的数据也将被完全拷贝一份。也就是说,DataNode从此刻开始就完全不会用这块盘了。由此可见,HDFS对于坏盘的检测还是非常看重的,毕竟谁也不想把数据放在坏了的磁盘上吧。DiskChecker服务并不是一个周期性的定时任务,它只会在可能有坏盘出现的场景中被启动,然后执行。在这点上,如果你没有仔细研究过它的原理,可能会很容易被它的名称所误解。

二、架构设计

HDFS 为了保证 DataNode 上数据的完整性与一致性,在 DataNode 上启动了三大磁盘目录扫描服务 DiskChecker、DirectoryScanner 和VolumeScanner。

2.1. DiskChecker: 坏盘检测

检测的级别是每个磁盘,检测的对象是 FsVolume,FsVolume 对应一个存储数据的磁盘。通过检测文件目录的访问权限以及目录是否可创建来判断目录所属磁盘的好坏,如果是坏盘,则此块盘将会被移除,上面的所有块都将被重新复制。

2.2. DirectoryScanner: 目录扫描

对每块盘上的目录做扫描,使之与内存中维护的块信息同步。比如存储在磁盘上的块已经没有了,则内存中的块信息也应该被移除。

2.3. VolumeScanner: 磁盘目录扫描服务

从名称上来看,VolumeScanner 与 DirectoryScanner 比较类似,但是 VolumeScanner 才是真正意义上的块检查服务。它会对已发现的”可疑块” 做检查,判断此块是否为损坏块,如果是,则会将其汇报给 NameNode。

三、实现