OPPO 数据湖统一存储技术实践

star2017 1年前 ⋅ 7651 阅读

图片

作者简介:Xiaochun OPPO 存储架构师

导读: OPPO 作为一家智能终端制造公司,有着数亿的终端用户,手机 、IoT 设备产生的数据源源不断,设备的智能化服务需要我们对这些数据做更深层次的挖掘。海量的数据如何低成本存储、高效利用是大数据部门必须要解决的问题。目前业界流行的解决方案是数据湖,本文介绍的 OPPO 自研数据湖存储系统 CBFS 在很大程度上可解决目前的痛点。本文将从以下几点为大家展开介绍:

  • 简述数据湖存储技术
  • OPPO 数据湖存储 CBFS 的架构设计
  • 数据湖存储 CBFS 的关键技术
  • 数据湖存储 CBFS 的未来展望

01 数据湖简述

数据湖定义:一种集中化的存储仓库,它将数据按其原始的数据格式存储,通常是二进制 blob 或者文件。一个数据湖通常是一个单一的数据集,包括原始数据以及转化后的数据(报表,可视化,高级分析和机器学习等)。

1. 数据湖存储的价值

图片

对比传统的 Hadoop 架构,数据湖有以下几个优点:

  • 高度灵活:数据的读取、写入和加工都很方便,可保存所有的原始数据
  • 多重分析:支持包括批、流计算,交互式查询,机器学习等多种负载
  • 低成本:存储计算资源独立扩展;采用对象存储,冷热分离,成本更低
  • 易管理:完善的用户管理鉴权,合规和审计,数据“存管用”全程可追溯

2. OPPO 数据湖整体解决方案

图片

OPPO 主要从三个维度建设数据湖:最底层的湖存储,采用的是 CBFS,它是一种同时支持 S3、HDFS、POSIX 文件 3 种接入协议的低成本存储;中间层是实时数据存储格式,采用了 iceberg;最上层可支持各种不同的计算引擎。

3. OPPO 数据湖架构特点

图片

早期大数据存储特点是流计算和批计算的存储放在不同的系统中,升级后的架构统一了的元数据管理,批、流计算一体化;同时提供统一的交互查询,接口更友好,秒级响应,并发度高,同时支持数据源 Upsert 变更操作;底层采用大规模低成本的对象存储作为统一的数据底座,支持多引擎数据共享,提升数据复用能力。

02 数据湖存储 CBFS 架构

图片

我们的目标是建设可支持 EB 级数据的数据湖存储,解决数据分析在成本、性能和体验的挑战,整个数据湖存储分成六个子系统:

  • 协议接入层:支持多种不同的协议(S3、HDFS、Posix 文件),可做到数据用其中一种协议写入,用另外两种协议也可直接读到
  • 元数据层:对外呈现文件系统的层次命名空间和对象的扁平命名空间,整个元数据是分布式的,支持分片,线性可扩展
  • 元数据缓存层:用来管理元数据缓存,提供元数据访问加速能力
  • 资源管理层:图中的 Master 节点,负责了物理资源(数据节点,元数据节点)以及逻辑资源(卷/桶,数据分片,元数据分片)的管理
  • 多副本层:支持追加写和随机写,对大对象和小对象都比较友好。该子系统一个作用是作为持久化的多副本存储;另一个作用是数据缓存层,支持弹性副本,加速数据湖访问,后续再展开
  • 纠删码存储层:能显著降低存储成本,同时支持多可用区部署,支持不同的纠删码模型,轻松支持 EB 级存储规模

接下来,会重点分享下 CBFS 用到的关键技术,包括高性能的元数据管理、纠删码存储、以及湖加速。

03 CBFS 关键技术

1. 元数据管理

图片

文件系统提供的是层次命名空间视图,整个文件系统的逻辑目录树分成多层,如右图所示,每个元数据节点(MetaNode)包含成百上千的元数据分片(MetaPartition),每个分片由 InodeTree(BTree)和 DentryTree(BTree)组成,每个 dentry 代表一个目录项,dentry 由 parentId 和 name 组成。在 DentryTree 中,以 PartentId 和 name 组成索引,进行存储和检索;在 InodeTree 中,则以 inode id 进行索引。使用 multiRaft 协议保障高可用性和数据一致性复制, 且每个节点集合会包含大量的分片组,每个分片组对应一个 raft group;每个分片组隶属于某个 volume;每个分片组都是某个 volume 的一段元数据范围(一段 inode id ); 元数据子系统通过分裂来完成动态扩容;当一分片组资源(性能、容量)紧接临近值时,资源管理器服务会预估一个结束点,并通知此组节点设备,只服务到此点之前的数据,同时也会新选出一组节点,并动态加入到当前业务系统中。

单个目录支持百万级别容量,元数据全内存化,保证优秀的读写性能,内存元数据分片通过 snapshot 方式持久化到磁盘以作备份及恢复使用。

图片

而对象存储提供的是扁平命名空间;以访问 objectkey 为/bucket/a/b/c 的对象为例,从根目录开始,通过”/”分隔符层层解析,找到最后一层目录(/bucket/a/b)的 Dentry,最后找到的/bucket/a/b/c 对于的 Inode,此过程涉及多次节点间交互,层次越深,性能较差;因此我们引入 PathCache 模块用于加速 ObjectKey 解析,简单做法是在 PathCache 中对 ObjectKey 的父目录(/bucket/a/b)的 Dentry 做缓存;分析线上集群我们发现,目录平均大小约为 100,假设存储集群规模在千亿级别,目录条目也才 10 亿个,单机缓存效率很高,同时可通过节点扩容来提升读性能;在同时支持"扁平"和"层次"命名空间管理的设计,与业界其他系统相比,CBFS 实现得更简洁,更高效,无需任何转换即可轻松实现一份数据,多种协议访问互通,且不存在数据一致性问题。

2. 纠删码存储

图片

降低存储成本的关键技术之一是纠删码(Erasure Code, 简称 EC),简单介绍一下纠删码原理:将 k 份原始数据,通过编码计算得到新的 m 份数据,当 k+m 份数据丢失任意的不多于 m 份时,通过解码可还原出原始数据(原理有点像磁盘 raid);相比传统的多副本存储, EC 的数据冗余度更低,但数据耐久性(durability)更高;其实现也有多种不同方式,多数基于异或运算或者 Reed-Solomon(RS)编码,我们的 CBFS 也采用了 RS 编码。

图片

计算步骤:

  • 编码矩阵B∈R^{(k+m)×k},上面 n 行是单位阵 I,下方 m 行是编码矩阵;k+m 个数据块组成的向量,包含原始的数据块和 m 个校验块;
  • 当某块丢失时:从矩阵 B 删除该块对应的行,得到新的矩阵 B',然后左边乘上 B'的逆矩阵,即可恢复丢失的块,详细计算过程大家可线下阅读相关资料。

图片

普通的 RS 编码存在一些问题:以上图为例,假设 X1~X6 ,Y1~Y6 为数据块,P1 和 P2 为校验块,若其中任意一块丢失,需要读其余 12 个块才能修复数据,磁盘 IO 损耗大,数据修复所需带宽高,在多 AZ 部署时,问题尤为明显;



微软提出的 LRC 编码,通过引入局部校验块来解决该问题,如图所示,在原来全局校验块 P1 和 P2 的基础上,新增 2 个局部校验块 PX 和 PY,假设 X1 损坏,只需读取与其关联 X1~X6 共 6 个块即可修复数据。统计表明,在数据中心,一个条带在一定时间内单块盘故障的概率是 98%,2 个盘同时损坏的概率是 1%,因此 LRC 在大多数场景可大幅提升数据修复效率,但缺点是其非最大距离可分编码,无法做到像全局 RS 编码那样损失任意 m 份数据能把所有的丢修复回来。

① EC 类型

图片

  • 离线 EC:整个条带 k 个数据单元都写满后,整体计算生成 m 校验块
  • 在线 EC:收到数据后同步拆分并实时计算校验块后,同时写入 k 个数据块和 m 个校验块

② CBFS 跨 AZ 多模式在线 EC

图片

CBFS 支持了跨 AZ 多模式条带的在线 EC 存储,针对不同的机房条件(1/2/3AZ)、不同大小的对象、不同的服务可用性和数据耐久性需求,系统可灵活配置不同的编码模式

以图中“1AZ-RS”模式为例,6 个数据块加 3 个校验块单 AZ 部署;2AZ-RS 模式,采用了 6 个数据块加 10 个校验块 2AZ 部署,数据冗余度为 16/6=2.67;3AZ-LRC 模式,采用 6 个数据块,6 个全局校验块加 3 个局部校验块模式;同一个集群内同时支持不同的编码模式。

③ 在线 EC 存储架构

图片

包含几个模块:

  • Access: 数据访问接入层,同时提供 EC 编解码能力
  • CM:集群管理层,管理节点,磁盘,卷等资源,同时负责迁移,修复,均衡,巡检任务,同一个集群支持不同 EC 编码模式并存
  • Allocator:负责卷空间分配
  • EC-Node:单机存储引擎,负责数据的实际存储

④ 纠删码写

图片

  • 流式收取数据
  • 对数据切片生成多个数据块,同时计算校验块
  • 申请存储卷
  • 并发向各个存储节点分发数据块或校验块

数据写入采用简单的 NRW 协议,保证最小写入份数即可,这样在常态化的节点及网络故障时,请求也不会阻塞,保障可用性;数据的接收、切分、校验块编码采取异步流水线方式,也保障高吞吐和低时延。

⑤ 纠删码读

图片

数据读取也采取了 NRW 模型,以 k=m=2 编码模式举例,只要正确读到 2 个块(不论是数据块还是校验块), 即可快速 RS 解码计算得到原始数据并;此外为提升可用性和降低时延,Access 会优先读临近或低负载的存储节点 EC-Node。

可以看到,在线 EC 结合 NRW 协议确保了数据的强一致性,同时保障高吞吐和低时延,很适合大数据业务模型。

3. 数据湖访问加速

图片

数据湖架构带来显著的收益之一是成本节约,但存算分离架构也会遇到带宽瓶颈和性能挑战,因此我们也提供了一系列访问加速技术:

① 多级缓存能力

  • 第一级缓存:本地缓存,其与计算节点同机部署,支持元数据和数据缓存,支持内存、PMem、NVme、HDD 不同类型介质,特点是访问时延低,但容量少
  • 第二级缓存:分布式缓存,副本数目弹性可变,提供位置感知能力,支持用户/桶/对象级的主动预热和被动缓存,数据淘汰策略也可配置

多级缓存策略在我们的机器学习训练场景有不错的加速效果。

② 谓语下推操作

另外存储数据层还支持了谓语下推操作,可显著减少存储与计算节点间大量的数据流动,降低资源开销并提升计算性能;

数据湖加速有还很多细致的工作,我们也在持续完善的过程中。

04 未来展望

目前 CBFS-2.x 版本已开源,支持在线 EC、湖加速、多协议接入等关键特性的 3.0 版本预计将于 2021 年 10 月开源;后续 CBFS 会增加存量 HDFS 集群直接挂载(免数据搬迁),冷热数据智能分层等特性,以便支持大数据及 AI 原架构下存量数据平滑入湖。


本文地址:https://www.6aiq.com/article/1629152485752
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: