HDFS 的存储原理主要涵盖数据的冗余存储、存取策略以及错误与恢复机制,这些设计共同保障了分布式文件系统的可靠性与高性能。
一、数据的冗余存储
作为分布式文件系统,HDFS 通过多副本机制实现数据冗余,通常将同一个数据块的多个副本分布在不同节点上。这种设计带来了三个核心优势:
- 提升传输速度:当多个客户端并发访问同一文件时,系统可调度它们从不同副本读取数据,有效分散负载。
- 便于错误检测:网络传输中采用多副本校验,能迅速识别数据传输过程中的异常。
- 保障数据可靠:即使个别数据节点失效,其他副本仍能确保数据不丢失。
二、数据存取策略
数据存放、读取和复制策略直接决定了系统的读写性能,是 HDFS 的核心逻辑。
(一)数据存放
为了兼顾可靠性与带宽利用率,HDFS 采用了基于机架(Rack)的放置策略。集群内不同机架间的通信需经过交换机或路由器,而同一机架内的机器通信则无需经过外部网络设备,带宽更大。
默认情况下,HDFS 每个数据块会保留 3 个副本。放置策略如下:
- 第 1 个副本优先放在发起写请求的节点上(集群外请求则选磁盘空闲、CPU 负载低的节点);
- 第 2 个副本放在与第 1 个副本不同的机架上;
- 第 3 个副本放在与第 1 个副本相同机架的其他节点上。
若副本数超过 3 个,则随机选择剩余节点。这种'两同架、一异架'的策略既保证了单机架故障时的数据可用性,又优化了读写效率。
(二)数据读取
客户端读取数据前,会从名称节点获取副本位置列表。通过 API 比对客户端与数据节点的机架 ID,优先选择同机架的副本进行读取。若无同机架副本,则随机选取,以此减少跨机架流量消耗。
(三)数据复制
HDFS 采用流水线复制策略提升效率。写入文件时,数据被切分为块并向名称节点请求写入路径。名称节点返回数据节点列表后,客户端将数据写入第 1 个节点,该节点接收 4KB 数据后立即写入本地并转发给第 2 个节点,依此类推形成流水线。文件写完即意味着所有副本同步完成。
三、数据错误与恢复
HDFS 视硬件故障为常态,设计了完善的容错与恢复机制。
(一)名称节点出错
名称节点存储元数据(FsImage 和 EditLog),一旦损坏将导致系统瘫痪。保护机制包括:
- 将元数据同步备份至远程文件系统(如 NFS);
- 运行第二名称节点辅助恢复。实际生产中常结合两者:先利用远程备份恢复元数据,再启用第二名称节点接管服务。
(二)数据节点出错
数据节点定期向名称节点发送心跳。若失联,节点会被标记为死机,其上的数据块标记为不可读。此时若某数据块副本数低于冗余因子,名称节点会自动触发冗余复制,生成新副本以维持安全水位。
(三)数据出错
网络或磁盘错误可能导致数据损坏。客户端读取时会使用 MD5 或 SHA-1 校验数据块完整性。创建文件时,客户端会将校验信息写入隐藏文件。读取过程中若发现校验失败,客户端会请求其他节点重试副本,并向名称节点报告错误,由系统重新复制该块。
小结
HDFS 通过多副本冗余存储保障可靠性,利用机架感知策略优化读写性能,并结合流水线复制提升效率。在容错方面,针对名称节点、数据节点及数据块本身均设有检测与自动恢复机制,确保系统在廉价硬件环境下稳定运行。


