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

81 阅读5分钟

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

1. 元数据服务高可用

1.1 高可用的形式

服务高可用

  • 热备份
  • 冷备份

故障恢复时间

  • 人工切换
  • 自动切换

人工的反应、决策时间都更长,高可用需要让系统自动决策。 HDFS的设计中,采用了中心化的元数据管理节点NameNode。 NameNode容易成为故障中的单点(single point of failure)。

1.2 HDFS NameNode高可用架构

组件介绍

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

围绕三个问题来看高可用

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

image.png

1.3 状态机的复杂和日志

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

  • 状态机:一个状态机从“初始”状态开始,每一个输入都被传入转换函数和输出函数,以生成一个新的状态和输出。在新的输入被接收到前,状态保持不变,而输出同时被传输给恰当的接受者。
  • 状态机复制:确定性的状态机具有「处理确定的输入后,状态唯一确定」的特性。状态机复制利用这个特性实现多个相同的状态机副本的同步更新。
  • 变更日志:触发状态机更新的变更操作,具有全局确定的顺序。
  • 共识协议:确保每个副本都能收到相同的日志的共识协议,常见的有 Paxos、Raft、ZAB。


作者:青训营官方账号
链接:juejin.cn/post/712494… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

image.png

1.3 NameNode操作日志的生产消费

目录树和文件信息的更新

Active生产,Standbyi消费

物理日志与逻辑日志

日志系统

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

image.png

1.4 NameNode块状态维护

区别:

  • Action即接受,也发起变更
  • Standby只接受,不发起变更

Content Stale状态

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

image.png

1.5 分布式协调组件-ZooKeeper

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

使用它的组件: HDFS、YARN、HBase Kafka、ClickHouse 等等

HA核心机制:Vatch

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

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

轮询探活:

脑裂问题:

因为网络隔离、进程夯住(例如 Java GC)等原因,旧的 active NN 没有完成下主,新的 active NN 就已经上主,此时会存在双主。client 的请求发给两者都可能成功,但不能保证一致性(两个 NN 状态不再同步)和持久化(只能保留一个 NN 状态)。

Fence机制:

在新 active NN 上主并正式处理请求之前,先要确保旧 active NN 已经退出主节点的状态。一般做法是先用 RPC 状态检测,发现超时或失败则调用系统命令杀死旧 active NN 的进程。image.png

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

核心机制:StandbyException

Client自动处理

1.6 BookKeeper架构

BookKeeper存储日志

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

对比:日志系统和文件系统的复杂度

image.png

1.6.1 Quorum机制

Quorum机制:多副本一致性读写

场景:

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

规则

1.Qr+Qw>Q

2.Qw>Q/2

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

image.png

1.6.2 BookKeeper Quorum

Sloppy Quorum机制

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

Vrite Quorum:写入副本数

Ack Quorum:响应副本数

思考:Client挂掉导致不确认写入 了多少数据,如何恢复?image.png

1.6.3 BookKeeper Ensemble

Ensemble机制

Round-Robin Load Balancer

第一轮:1,2,3

第二轮:2,3,4

第三轮:3,4,1

第四轮:4,1,2

优势:数据均衡image.png

2.数据存储高可用

2.1 单机存储-RAID

RAID0:条带化

RAID1:冗余

RAID3:容错校验

image.png

2.2 HDFS多副本

HDFS版本的RAID1

图:Hadoop的多副本放置

优点:

读写路径简单

副本修复简单

高可用image.png

2.2.1 Erasure Coding原理

HDFS版本的RAID2/3

业界常用Reed Solomon算法

图:Reed Solomon算法原理image.png

2.3 网络架构

Server:一台服务器

机架(Rack):放服务器的架子

TOR(Top of Rack):机架顶部的交换机。

POD(Point of Delivery):数据中心中的一个物理区域

数据中心(Data Center):集中部署服务器的场所

image.png

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

一个TOR故障导致整个机架不可用VS降低跨rack流量

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

image.png

3. 元数据高扩展性

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

HDFS NameNode是个集中式服务,部署在单个机器上,内存和磁 盘的容量、CPU的计算力都不能无限扩展。

scale up vs.scale out

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

挑战:

  • 名字空间分裂
  • DataNode汇报

目录树结构本身复杂image.png

3.1.2 常见的Scale Out方案

KV模型的系统可以使用partition

  • Redis
  • Kafka
  • MySQL(分库分表)

右图:三种数据路由方式

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

image.png

3.2 BlockPool

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

  • 同一个block id在不同的NN上出现

文件服务分层

  • Namespace
  • Block Storage

用blockpool来区分DN的服务

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

image.png