高扩展机制课堂笔记 | 青训营笔记

133 阅读2分钟

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

元数据高扩展性

元数据扩展性挑战

HDFS NN 是集中式服务,部署在单个机器上,单机的处理能力不能无限扩展,所以需要元数据扩展

挑战:

  • 名字空间分裂
  • DN 汇报
  • 目录树结构本身复杂
  • Scale up:扩容单个服务器的能力
  • Scale out:部署多个服务器来服务

常见的 Scale Out 方案

KV 模型的系统可以使用 Partition(按照 KEY 的值不同,让不同的节点处理)

  • Redis
  • Kafka
  • MySQL

图上的三种数据路由方式

  • 服务端侧(分区信息在服务器侧)
  • 路由层(分区信息在路由层)
  • 客户端层(分区信息在客户端)

社区的解决方案

BlockPoll 方案

解决 DN 服务多组 NN 的问题

  • 同一 block id 在不同的 NN 上出现(生成了相同的),DN 就不知道到底要访问哪个数据

文件服务分层

  • Namespace
  • Block Storage

用 blockpoll 区分 DN 的服务(给每个 NN 一个唯一的 ID)(把 Block id 变为 NN ID+Block id)

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

viewfs 方案

Federation(联邦)架构:将多个不同集群组合,对外表现为一个集群

viewfs 通过在 client-side 的配置,指定不同的目录访问不同的 NN

局限性:运维复杂

  • viewfs 挂在路径必须在同一层,不能嵌套
  • 信息保存在 client 端,viewfs 无法控制,要客户自行更新

字节跳动的 NNProxy 方案

主要实现了路由管理和 RPC 转发,以及鉴权、限流、查询缓存等额外功能

路由规则保存

路由信息无论保存在服务端还是客户端都很困难,所以引入了 proxy

路由层实际不保存信息,信息都存在 ZooKeeper 这样的强一致高可用的节点上

路由转发实现

使用最长匹配规则,进一步划分目录树,解决了 viewfs 无法嵌套的问题

案例:小文件问题

大小不到一个 HDFS block 大小的文件过多

  • NameNode 瓶颈
  • I/O 变成小的随机 I/O,数据访问变慢
  • 计算任务启动慢

MapReduce 的 worker 数量过多容易引起小文件问题

解决方案:

  • 后台任务合并小文件
  • Shuffle Service(等于提前做了小文件的合并)