HDFS 分布式存储原理
数据的冗余存储
作为分布式文件系统的核心组件,HDFS 必须解决容错与可用性问题。其核心手段是多副本冗余存储,通常将同一个数据块的多个副本分布到不同的数据节点上。例如,数据块 1 可能存放在节点 A 和 C,数据块 2 存放在 A 和 B。这种设计带来了三个显著优势:
- 加快数据传输速度:当多个客户端同时访问同一文件时,可以从不同副本并行读取,显著提升吞吐量。
- 便于检查数据错误:网络传输中采用多副本比对,能更容易发现并定位传输错误。
- 保证数据可靠性:即使单个数据节点失效,也不会导致数据丢失。
数据存取策略
数据存取策略直接影响分布式文件系统的读写性能,是 HDFS 设计的重点。
数据存放
为了平衡性能与可靠性,HDFS 引入了机架感知的数据放置策略。集群通常由多个机架组成,机架间通信需经过交换机,而机架内通信带宽更大。
HDFS 默认每个数据节点位于不同机架,这虽然限制了单机架内的带宽利用,但换来了更高的可靠性:一个机架故障不影响其他机架数据。默认冗余因子为 3,放置逻辑如下:
- 第一个副本放在发起写请求的节点(集群内)或随机选择空闲节点(集群外)。
- 第二个副本放在不同机架的节点上。
- 第三个副本放在与第一个副本相同机架的其他节点上。
- 更多副本则随机选择。
数据读取
客户端可通过 API 获取自身及数据节点的机架 ID。读取时,先从名称节点获取副本位置列表,然后优先选择与客户端同机架的副本进行读取;若无匹配,则随机选择一个副本。
数据复制
HDFS 采用流水线复制策略以提升效率。客户端写入文件时,先切分为块并向名称节点请求写入。名称节点返回数据节点列表,客户端将数据写入第一个节点,随后该节点接收数据后自动转发给列表中的下一个节点,形成一条复制流水线。文件写完即完成所有副本复制。
数据错误与恢复
HDFS 视硬件故障为常态,设计了完善的容错机制。
名称节点出错
名称节点存储元数据(FsImage 和 EditLog),一旦损坏会导致系统失效。保护机制包括:
- 将元数据同步到远程文件系统(如 NFS)。
- 运行第二名称节点辅助恢复。 实际生产中常结合两者:从 NFS 获取备份,利用第二名称节点恢复,并将其提升为主名称节点。
数据节点出错
数据节点定期向名称节点发送'心跳'。若失联,节点被标记为'死机',数据不可读。名称节点会监控副本数量,若低于冗余因子,立即启动新副本复制。HDFS 的独特之处在于可动态调整冗余数据的位置。
数据出错
网络或磁盘错误可能导致数据损坏。客户端读取时会使用 MD5 或 SHA-1 校验。创建文件时,客户端会将校验信息写入隐藏文件。读取时先校验,若出错则请求其他节点并重报名称节点重新复制。
总结
HDFS 通过多副本冗余存储实现高可靠与高性能。存取策略上,基于机架感知优化带宽与容灾,写入走流水线,读取走就近原则。故障恢复方面,针对名称节点、数据节点及数据块分别采取了元数据备份、心跳检测与校验重传机制,确保系统在廉价硬件上的稳定运行。


