高可用性课程笔记 | 青训营笔记

146 阅读4分钟

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

元数据高可用

高可用的需求

服务可用性指标

  • MTTR:Mean Time To Recovery
  • MTTF:Mean Time To Fix
  • MTBF:Mean Time Between Failures

可用性 A = MTBF/(MTBF+MTTR)

要做到高可用需要系统的自动决策,因为人的反应更慢

NameNode 容易成为故障中的单点(Single Point of Failure),因为 NN 是中心化的

HDFS 主备同步实现

重要组件

ActiveNamenode:主节点,提供服务,是日志的生产者

StandbyNamenode:备节点,日志的消费者

ZooKeeper:为自动选主提供统一协调服务

BookKeeper:提供日志存储服务

ZKFC:NameNode 探活、触发主备切换(Hadoop 生态圈的遗留组件,更新的系统可能会将其融入到元数据节点里)

HA Client:提供了自动切换的客户端

edit log:操作的日志

理论基础 - 状态机复制和日志

状态机复制是实现容错的常规方法

组件:

  • 状态机及其副本
  • 变更日志
  • 共识协议

NN 操作日志的生产消费

  • FSImage 文件:较大的状态记录文件,是某一时刻 NN 全部需要持久化的数据的记录。大小一般在 GB 级别。
  • EditLog:系统不会立即把 Log 应用到 FSImage 上,因为开销比较大,因此系统会定期应用 EditLog,形成 CheckPoint

NameNode 块状态维护

  • DN Heartbeat:DN 定期向 NN 发送心跳包
  • DN Block Report:DN 定期向 NN 进行全量块上报,让 NN 能够维护块信息

Active 接收到信息后要发起变更,Standby 也要接收信息但不发起变更

Content Stale 状态:主备切换后,Standby 不能立即要求 DN 做删除之类的操作

HDFS 自动主备切换

分布式协调组件:ZooKeeper

一般用于提供选主、协调、元数据存储

使用它的组件:

  • HDFS、YARN、HBase
  • Kafka、ClickHouse

HA 核心机制:Watch(让客户端可以去监控到 ZK 上存储的节点,发生变化的时候 ZK 会通知)

ZKFC:ZKFailureController:作为外部组件,驱动 HDFS Namenode 的主备切换

  • 轮询探活

  • 脑裂问题

    • 若发现过去的 Active 出现问题,ZKFC 还要再次向 Active 发请求确认状态
    • 避免有多个节点都认为自己是 Active,各写各的日志
  • Fence 机制

    • 阻止多个节点各自写日志
    • 若发现 Active 进程还活着却不能提供服务,就会直接发送指令 kill 掉进程

自动主备切换流程 - Client 侧

核心机制 StandbyException

Client 配置中要存若干节点,若 Client 给 Standby 发请求, Standby 会返回 StandbyException,Client 会自动找其他节点

日志系统 BookKeeper

  • 低延时
  • 持久性
  • 强一致性
  • 读写高可用

Quorum 机制

多数派机制

机制:多副本一致性读写

多副本对象存储,用版本号标识数据新旧

BookKeeper Quorum

是一个更宽松的 Quorum 机制

Sloppy Quorum

日志场景:顺序追加、只写

Write Quorum:写入副本数

Ack Quorum:相应副本数

可以让 Ack Quorum 小于 Write Quorum,即不要求所有 Write 都响应成功

BookKeeper Ensemble 机制

主要目的:解决扩容问题

Round-Robin Load Balancer

优势:数据均衡

数据存储高可用

单机存储的数据高可用机制

回到单机存储 - RAID

  • 廉价
  • 高性能
  • 大容量
  • 高可用

RAID 方案

  • RAID 0:条带化
  • RAID 1:冗余
  • RAID 3:容错校验

HDFS 的数据高可用机制

HDFS 多副本

HDFS 版本的 RAID 1

优点:

  • 读写路径简单
  • 副本修复简单
  • 高可用

数据出现问题时向 NN 汇报,NN 从另一个 DN 上找一份复制过去

Erasure Coding 方案(纠错码)

可视为 HDFS 版本的 RAID 2/3

比起多副本方案不需要占用那么多空间

业界常用 Reed Solomon 算法、

图:直接保存的 EC 和条带化保存的 EC 的区别,条带化后当数据损坏时不需要复制整个块,条带化也可使数据分散,查一个数据可以同时从多个盘上读,加快读取速度

EC 和多副本比较:

  • 顺序读的场景读写速度更快了,但点查场景可能反而导致额外开销
  • 成本更低(比如上面的纠删码,比起多副本只需要三分之一的存储成本)
  • 修复速度还是多副本更快
  • 读写路径的实现还是 EC 更复杂

考虑网络架构的数据高可用

初识网络架构

  • Server
  • 机架 Rack:放服务器的架子
  • TOR(Top of Rack):机架顶部的交换机
  • POD(Point of Delivery):数据中心的一个物理区域
  • Data Center:集中部署服务器的场所

机架感知

一个 TOR 故障会导致整个机架不可用