HDFS的高可用和高扩展 | 青训营笔记

145 阅读7分钟

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

元数据高可用

  • 高可用: 系统在困境(adversity,比如硬件故障、软件故障、人为错误)中仍可正常工作(正确完成功能,并能达到期望的性能水准)
  • 容灾: 在相隔较远的异地,建立两套或多套功能相同的系统,互相之间可以进行健康状态监视和功能切换,当一处系统因意外(如火灾、地震等)停止工作时,整个应用系统可以切换到另一处,使得该系统功能可以继续正常工作。

高可用衡量指标

image.png

MTTR(Mean Time To Repair): 平均修复时间,系统能多快恢复。
MTTF(Mean Time To Failure): 平均失效时间,运行到故障间的时间,一般用于不可修复的系统(制造业)。
MTBF(Mean Time Between Failures): 平均无故障时间,两次故障间的间隔,一般用于可修复的系统(软件)。

高可用形式

备份方式分为冷备份和热备份

  • 冷备份:备份服务的数据,可以和数据归档相结合。在主服务故障时,利用备份的数据重启。
  • 热备份:主服务和备服务同时运行,在主服务故障时,随时可以切换到备服务。

切换方式由人工和自动两种方式

  • 人工切换:在故障发生时,运维人员接收报警后,手动执行服务切主操作。一般较慢,难以满足全年不可用时间的目标。

  • 自动切换:通过探活组件、分布式共识协议等手段,系统能自动发现主服务的故障,并切换到备份不符。

HDFS NameNode高可用架构

image.png

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

NameNode 状态持久化

  • FSImage 文件:较大的状态记录文件,是某一时刻 NN 全部需要持久化的数据的记录。大小一般在 GB 级别。
  • EditLog 文件:是某段时间发生的变更日志的存储文件。大小一般在 KB~MB 级别。

image.png

  • checkpoint 机制:将旧的 FSImage 和 EditLog 合并生成新的 FSImage 的流程,在完成后旧的数据可以被清理以释放空间。

image.png ZooKeeper
ZooKeeper 是广泛使用的选主组件,它通过 ZAB 协议保证了多个 ZK Server 的状态一致,提供了自身的强一致和高可用。一般用于选主、协调、元数据存储。

BookKeeper

image.png

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

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

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

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

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

image.png

数据存储高可用

单机存储 RAID
将多个廉价、不可靠、低性能、容量小的磁盘组装在一起,提供高可靠、高性能、大容量逻辑磁盘服务的一组磁盘列阵方案。
特点: 廉价、高性能、大容量、高可用

  • RAID 0 :将数据分块后按条带化的形式分别存储在多个磁盘上,提供大容量、高性能。
  • RAID 1:将数据副本存储在多个磁盘上,提供高可靠。
  • RAID 3:在数据分块存储的基础上,将数据的校验码存储在独立的磁盘上,提供高可靠、高性能。

image.png Erasure Coding
将数据分段,通过特殊的编码方式存储额外的校验块,并条带化的组成块,存储在 DN 上。

  • 条带化:原本块对应文件内连续的一大段数据。条带化后,连续的数据按条带(远小于整个块的单位)间隔交错的分布在不同的块中。
  • Reed Solomon 算法
  • 成本更低:多副本方案需要冗余存储整个块,EC 方案需要冗余存储的数据一般更少。

image.png

元数据高拓展性

扩展性方案有scale up 和scale out。

image.png 常见的scale out 方案

image.png partition 方法

  • 水平分区和垂直分区:水平分区指按 key 来将数据划分到不同的存储上;垂直分区指将一份数据的不同部分拆开存储,用 key 关联起来。partition 一般用于水平分区,又称 shard。
  • 常用于 KV 模型,通过 hash 或者分段的手段,将不同类型 key 的访问、存储能力分配到不同的服务器上,实现了 scale out。
  • 重点:不同单元之间不能有关联和依赖,不然访问就难以在一个节点内完成。例如 MySQL 的分库分表方案,难以应对复杂跨库 join。

一些社区解决方案

  • blockpool     将文件系统分为文件层和块存储层,对于块存储层,DN 集群对不同的 NN 提供不同的标识符,称为 block pool。解决了多个 NN 可能生成同一个 block id,DN 无法区分的问题。
  • viewfs 邦联架构的一种实现,通过客户端配置决定某个路径的访问要发送给哪个 NN 集群。缺点是客户端配置难以更新、本身配置方式存在设计(例如,只能在同一级目录区分;已经划分的子树不能再划分)。

字节的NNProxy
NNProxy是ByteDance 自研的 HDFS 代理层,于 2016 年开源,主要提供了路由管理、RPC 转发,额外提供了鉴权、限流、查询缓存等能力。开源社区有类似的方案 Router Based Federation,主要实现了路由管理和转发。

总结

高可用是指系统无中断地执行其功能的能力,代表系统的可用性程度。高扩展表示系统的扩展能力,流量高峰时能否在短时间内完成扩容,更平稳地承接峰值流量。本节课对HDFS的高可用和高扩展深入的进行了原理分析,能更好的让我们理解其运行机制。