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

151 阅读5分钟

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

课程目录

1.元数据高可用

2.数据存储高可用

3.元数据高扩展性

4.数据存储高扩展性

1.元数据服务高可用

1.1 高可用的需求

1.1.1 服务高可用的需求

故障类型

  • 硬件故障
  • 软件故障
  • 人为故障

灾难:数据中心级别不可用

  • 机房断电
  • 机房空调停机
  • 机房间网络故障、拥塞

1.1.2 高可用的衡量

服务可用性指标

  • MTTR
  • MTTF
  • MTBF

image.png

1.1.3 可用性的年化

image.png

1.1.4 高可用的形式

服务高可用

  • 热备份
  • 冷备份

故障恢复操作

  • 人工切换
  • 自动切换

1.2 HDFS主备同步实现

1.2.1 HDFS NameNode高可用架构

组件介绍

  • AcliveNamenode:主节点,提供服务,生成日志
  • StandbyNamenode:备节点,消费日志
  • ZooKeeper:为自动选主提供统一协调服务
  • BookKeeper:提供日志存储服务
  • ZKFC:NameNode探活、触发主备切换
  • HA Client:提供了自动切换的客户端
  • edit log:操作的日志

围绕三个问题来看高可用

  • 节点状态如何保存
  • 操作日志如何同步
  • 如何做到自动切换

image.png

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

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

组件

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

1.2.3 NameNode状态持久化

FSlmage和EditLog

image.png

Checkpoint机制

image.png

1.2.4 NameNode操作日志的生产消费

  • Active生产,Standby(可能有多个)消费
  • 物理日志与逻辑日志

日志系统

  • 高可用
  • 高扩展性
  • 高性能
  • 强一致(有序)

image.png

1.2.5 NameNode块状态维护

回顾

  • DataNode Heartbeat
  • DataNode Block Report

区别

  • Aclive即接收,也发起变更
  • Standby只接收,不发起变更

Content Stale状态

  • 主备切换后,避免DN的不确定状态

1.3 HDFS自动主备切换

1.3.1 分布式协调组件-ZooKeeper

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

  • HA核心机制:Watch

1.3.2 自动主备切换流程-Server侧

ZKFailoverController

作为外部组件,驱动HDFS NameNode的主备切换

  • 轮询探活
  • 脑裂问题
  • Fence机制

1.3.3 自动主备切换流程-Client侧

  • 核心机制:StandbyException
  • Client自动处理

1.4 日志系统BookKeeper简介

1.4.1 BookKeeper架构

BookKeeper

  • 低延时
  • 持久性
  • 强一致性
  • 读写高可用 对比:日志系统和文件系统的复杂度

1.4.2 Quorum机制

  • Quorum机制:多副本一致性读写
  • 场景:多副本对象存储,用版本号标识数据新旧
  • 规则

image.png

  • 思考:日志场景比对象保存更简单

1.4.3 BookKeeper Quorum

Sloppy Quorum机制

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

  • Write Quorum:写入副本数
  • Ack Quorum:响应副本数

1.4.4 BookKeeper Ensemble

Ensemble机制

Round-Robin Load Balancer

  • 第一轮:1,2,3
  • 第二轮:2,3,4
  • 第三轮:3,4,1
  • 第四轮:4,1,2 优势:数据均衡

2.数据存储高可用

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

2.1.1 回到单机存储-RAID

特点

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

2.1.2 RAID方案讲解

  • RAID 0:条带化

image.png

  • RAID 1:冗余

image.png

  • RAID 3:容错校验

image.png

2.2 HDFS的数据高可用机制

2.2.1 HDFS多副本

优点

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

2.2.2 Erasure Coding原理

  • HDFS版本的RAID 2/3
  • 业界常用的Reed Solomon算法

2.2.3 HDFS Erasure Coding

和多副本比较

  • 读写速度
  • 成本
  • 修复速度
  • 读写路径的实现

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

2.3.1 网络架构

  • 机架(Rack):放服务器的架子
  • TOR(Top of Rack):机架顶部的交换机
  • 数据中心(Data Center):集中部署服务器的场所

2.3.2 副本放置策略-机架感知

trade-off:一个本地、一个远端

2.4 案例:字节跳动的HDFS多机房容灾方案简介

2.4.1 案例:字节跳动的HDFS多机房实践

多机房解决的问题

  • 容量问题
  • 容灾问题

2.4.2 多机房容灾实践

多机房部署的组件

  • ZooKeeper
  • BookKeeper
  • NameNode
  • DataNode

容灾期间的策略

  • 容灾期间,限制跨机房写入
  • 容灾期间,限制跨机房副本复制

3.元数据高扩展性

3.1 元数据扩展性挑战

3.1.1 元数据节点扩展性的挑战

image.png

scale up vs scale out

  • 扩容单个服务器的能力
  • 部署多个服务器来服务

挑战

  • 名字空间分裂
  • DataNode汇报
  • 目录树结构本身复杂

3.1.2 常见的Scale Out方案

image.png

3.2 社区的解决方案

3.2.1 社区解决方案-BlockPool

解决DN同时服务多组NN的问题

文件服务分层

  • NameNode
  • Block Storage

用blockpool来区分DN的服务

  • 数据块存储
  • 心跳和块上报

3.2.2 社区解决方案-viewfs

Federation架构:将多个不同集群组合起来,对外表现像一个集群一样

  • 局限性:运维复杂

3.3 字节跳动的NNProxy方案

3.3.1 字节跳动的NNProxy

NNProxy是ByteSance自研的HDFS代理层,提供了路由服务。

  • NNProxy所在系统上下游

image.png

3.3.2 NNProxy路由规则保存

回顾:三种数据路由方式

  • 服务端侧
  • 路由层
  • 客户端侧

考虑点

  • 扩展性
  • 运维性

3.3.3 NNProxy路由转发实现

路径最长的匹配规则

  • /
  • /home
  • /user/bob
  • /user/tiger/warehouse
  • /user/tiger/dump

3.4 案例:小文件问题

image.png

4.存储数据高扩展性

4.1 超大集群的长尾问题

4.1.1 延迟的发布和长尾延迟

image.png

4.1.2 尾部延迟放大

木桶原理

尾部延迟放大:访问的服务变多,尾部的请求就会越发的慢。

如何变慢

  • 固定延迟阈值
  • 固定延迟百分位

4.1.3 长尾问题的表现-慢节点

  • 慢节点:读取速度过慢,导致客户端阻塞。

image.png

  • 集群扩大10倍,问题扩大N(>10)倍

4.2 超大集群的可靠性问题

4.2.1 超大集群下的数据可靠性

image.png

  • 推论:必然有部分数据全部副本在损坏的机器上,发生数据丢失

4.2.2 Copyset

原理:减少了副本放置的组合数,从而降低副本丢失的概率。

4.3 超大集群的不均匀问题

4.3.1 超大集群的负载均衡和数据迁移

image.png

4.3.2 数据写入不均

数据的不均匀

  • 节点容量不均匀
  • 数据新旧不均匀
  • 访问类型不均匀
  • 资源负载不均匀

4.3.3 DN冷热不均

数据的不均匀

  • 节点容量不均匀
  • 数据新旧不均匀
  • 访问类型不均匀
  • 资源负载不均匀

4.3.4 负载均衡和数据迁移的典型场景

image.png

4.4 数据迁移工具速览

4.4.1 数据迁移工具-跨NN迁移

image.png

4.4.2 数据迁移工具-Balancer

image.png