这是我参与「第四届青训营 」笔记创作活动的第三天
元数据高可用
高可用的需求
服务可用性指标
- 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 故障会导致整个机架不可用