这是我参与「第四届青训营 」笔记创作活动的的第13天
一.元数据高可用
1.高可用的衡量
- 服务可用性指标:MTTR MTTF(平均故障的时间) MTBF(两次故障的时间)
- 可用性的年化:
全年不可用时间:
可用性 99.9%,全年8.76小时不可用
可用性 99.99% 全年52.6小时不可用
可用性 99.999% 全年5.26小时不可用
2.高可用的形式
服务高可用:
- 热备份:有两个相同的服务,如果一个服务故障,切换到另一个服务(较好)
- 冷备份:将服务中关键数据备份,将备份在别的服务重启 故障恢复操作:人工的反应、决策时间都长
- 人工切换
- 自动切换 人工的反应、决策时间都更长,高可用需要让系统自动决策。 HDFS的设计中,采用了中心化的元数据管理节点NameNode。 NameNode容易成为故障中的单点。
3.HDSF NameNode高可用架构
组件介绍
- ActiveNamenode:主节点,提供服务,生产日志
- StandbyNameNode:备节点,消费日志
- ZooKeeper:为自动选主提供统一协调服务
- BookKeeper:提供日志存储服务
- ZKFC:NameNode探活、触发主备切换
- HA Client:提供了自动切换的客户端
- editlog:操作的日志
4.状态机复制和日志
状态机复制是实现容错的常规方法
组件:
- 状态机以及其副本
- 变更日志
- 共识协议
5.NameNode状态持久化
Checkpoint机制
FSimage和EditLog
6.NameNode操作日志的生产消费
Active生产,Standby(可能有多个)消费
物理日志与逻辑日志
日志系统
- 高可用
- 高拓展性
- 高性能
- 强一致
7.NameNode块状态维护
区别
- Active即接收,也发起变更
- Standby只接收,不发起变更 Content Stale状态 主备切换后,避免DN的不确定状态
8.ZooKeeper:分布式协调组件,一般用于提供选主、协调、元数据存储
使用它的组件:HDFS、yarn、hbase、kafaka、clickhouse
9.自动主备切换流程:Serve侧
ZKFailoverController作为外部组件,驱动HDFS NameNode的主备切换
脑裂问题
轮询探活
Fence机制
10.自动主备切换流程:Client侧
核心机制:StanbyException
11.Bookeeper架构
BooKeeper存储日志
- 低延时
- 持久性
- 强一致性
- 读写高可用
对比:日志系统和文件系统的复杂度
12.Quorum机制:多副本一致性读写
场景:多副本对象存储,用版本号标识数据新旧
规则:
13.BookKeeper Quorum
Sloppy Quorum机制
日志场景:顺序追加、只写
Write Quorum:写入副本数
Ack Quorum:响应副本数
14.BookKeeper Ensemble
Ensemble机制
Round-Robin Load Bnalancer
第一轮:1,2,3
第二轮:2,3,4
第三轮:3,4,1
第四轮:4,1,2
优势:数据均衡
二.数据存储高可用
1.单机存储:RAID
特点:廉价、高性能、大容量、高可用
2.RAID 方案讲解
RAID 0:条带化
RAID 1:冗余
RAID 3:容错校验
3.HDFS多副本
HDFS版本的RAID 1:
- 读写路径简单
- 副本修复简单
- 高可用
4.Erasure Coding原理
HDFS版本的RAID 2/3
业内常用的Reed Solomon算法:
5.HDFS Erasure Coding
HDFS版本的RAID 2 和多副本比较:
- 读写速度
- 成本
- 修复速度
- 读写路径的实现 如图,为直接保存的EC和Stripe(条带化)后保存的EC
6.网络架构
- 机架(Rack):放服务器的架子
- TOR(Top of Rack):机架顶部的交换机
- 数据中心(Data Center):集中部署服务器的场所
7.副本放置策略:机架感知
8.字节跳动的HDFS多机房实践
- 多机房解决的问题:容灾问题、容量问题
- HDFS双机房放置的设计
- 写入时,每个数据块在两个机房至少各有一个副本,数据实时写入到两个机房
- 读取时,优先读取本地的副本,避免了大量的跨机房读取。
9.多机房容灾实践
多机房部署的组件:
- ZooKeeper
- BookKeeper
- NameNode
- DataNode 容灾期间的策略:
- 容灾期间,限制跨机房写入
- 容灾期间,限制跨机房副本复制
三.元数据高拓展性
1.元数据节点拓展性的挑战
- HDFS NameNode是个集中式服务,部署在单个机器上,内存和磁盘的容量、CPU的计算力都不能无限扩展
- scale up:扩容单个服务器的能力
- scale out:部署多个服务器来服务
- 挑战:名字空间分裂、DataNode汇报、目录树结构本身复杂
2.常见的Scale Out方案
三种数据路由方式:
- 服务侧端
- 路由层
- 客户端侧
3.社区解决方案:BlockPool
解决DN同时服务多组NN的问题 文件服务分层:Namespace Block Storage