HDFS 高可用与高扩展性机制分析 | 青训营笔记

128 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

HDFS 的架构

  • HDFS 的主要服务端主要组件是 NameNode 和 DataNode,两者通过定时心跳通信。
  • NameNode(NN)负责维护目录树、文件和块的关系、各个块的副本放置位置等元信息。
  • DataNode(DN)负责维护数据副本,执行 NameNode 下发的副本迁移、副本删除等操作。
  • HDFS Client 属于是胖客户端(fat/rich client),客户端中实现了数据读写的容错等较为复杂的逻辑。

HDFS 的读写路径

  • 数据读取:Client 从 NN 上获取到文件信息和块的位置(getFileInfo+getBlockLocation),从对应 DN 上读取数据。当一个 DN 读取失败时,会去尝试块的其他 DN。
  • 数据写入:Client 要求 NN 创建文件(create),并依次获得不同的 DN 来写入数据块(addBlock)。Client 通过链式写入来同时写入数据到多个 DN。在整个写入完成后,会让 NN 关闭文件(complete)。

HDFS高可用架构

image.png

  • Active NameNode:提供服务的 NameNode 主节点,生产 editlog。
  • Standby NameNode:不提供服务,起备份作用的 NameNode 备节点,消费 editlog
  • editlog:用户变更操作的记录,具有全局顺序,是 HDFS 的变更日志。
  • ZooKeeper:开源的分布式协调组件,主要功能有节点注册、主节点选举、元数据存储。
  • BookKeeper:开源的日志存储组件,存储 editlog
  • ZKFC:和 ZK、NN 通信,进行 NN 探活和自动主备切换。
  • HA Client:处理 StandbyException,在主备节点间挑选到提供服务的主节点。

NameNode块状态维护

Active和Standby区别:Active既接受,也发起变更,Standby只接收,不发起变更

自动主备切换流程

DN需要同时向activeNN和standbyNN汇报信息,但只有activeNN会发出command

高可用日志系统 BookKeeper

  • 高可靠:数据写入多个存储节点,数据写入就不会丢失。
  • 高可用:日志存储本身是高可用的。因为日志流比文件系统本身的结构更为简单,日志系统高可用的实现也更为简单。
  • 强一致:日志系统是追加写入的形式,Client 和日志系统的元数据可以明确目前已经成功的写入日志的序号(entry-id)。
  • 可扩展:整个集群的读写能力可以随着添加存储节点 Bookie 而扩展。

Quorum 协议:基于鸽巢原理,在多个副本间确保高可用、高性能的多副本变更协议

  • 多副本间一般通过 version-id 来描述状态的新旧。
  • 高可用:多个副本确保了高可用(后文会再次介绍多副本高可用)。
  • 高性能:不用等所有副本写入成功,降低了的长尾延迟(后文会再次介绍长尾延迟)。

BookKeeper Quorum 协议:基于 Quorum 的多数派思想来提供高可用、高性能写入的日志写入

  • 日志写入是追加,不是状态变更,只需要确认目前的 entry-id,相对更简单。
  • Write Quorum:一次写入需要写入到的存储节点数。
  • Ack Quorum:一次写入需要收到的响应数,小于 write quorum。
  • 高性能:不用等所有副本写入成功,降低了的长尾延迟(后文会再次介绍长尾延迟)。
  • Ensemble:通过轮询(Round-Robin)来确认 write quorum 实际对应的存储节点实例,可以比较简单的完成副本放置和扩展。

数据高可用

  • RAID阵列
  • Erasure Codeing:将数据分段,通过特殊的编码方式存储额外的校验块,并条带化的组成块,存储在 DN 上。
    • 条带化对于发生损坏进行恢复可以有效减少计算量
  • 机架(Rack):每个机架顶部有一个交换机
  • 多机房容灾
    • 双机房中每个机房都需要写入一个副本才算完成一次写入
    • 容灾期间,限制跨机房的写入,限制跨机房副本

元数据扩展性

扩展性方案

  • scale up:通过单机的 CPU、内存、磁盘、网卡能力的提升来提升系统服务能力,受到机器成本和物理定律的限制。
  • scale out:通过让多台机器组成集群,共同对外提供服务来提升系统服务能力。一般也称为高扩展、水平扩展。

image.png

federation 架构

  • 使得多个集群像一个集群一样提供服务的架构方法,提供了统一的服务视图,提高了服务的扩展性。
  • 文件系统的目录树比 kv 模型更复杂,划分更困难。
  • 邦联架构的难点一般在于跨多个集群的请求,例如 HDFS 的 rename 操作就可能跨多个集群。

blockpool

image.png