共计 4028 个字符,预计需要花费 11 分钟才能阅读完成。
导读
OPPO 是一家智能终端制作公司,有着数亿的终端用户,每天产生了大量文本、图片、音视频等非结构化数据。在保障数据连通性、实时性以及数据安全治理要求的前提下,如何低成本、高效率地充沛开掘数据价值,成为了领有海量数据的公司的一大难题。目前业界的风行解决方案是数据湖,本文介绍的 OPPO 自研的数据湖存储 CBFS 在很大水平上可解决目前的痛点。
▌数据湖简述
数据湖定义:一种集中化的存储仓库,它将数据按其原始的数据格式存储,通常是二进制 blob 或者文件。一个数据湖通常是一个繁多的数据集,包含原始数据以及转化后的数据(报表,可视化,高级剖析和机器学习等)
1. 数据湖存储的价值
比照传统的 Hadoop 架构,数据湖有以下几个长处:
- 高度灵便:数据的读取、写入和加工都很不便,可保留所有的原始数据
- 多重剖析:反对包含批、流计算,交互式查问,机器学习等多种负载
- 低成本:存储计算资源独立扩大;采纳对象存储,冷热拆散,老本更低
- 易治理:欠缺的用户治理鉴权,合规和审计,数据“存管用”全程可追溯
2. OPPO 数据湖整体解决方案
OPPO 次要从三个维度建设数据湖:最底层的湖存储,咱们采纳的是 CBFS,它是一种同时反对 S3、HDFS、POSIX 文件 3 种接入协定的低成本存储;两头一层是实时数据存储格局,咱们采纳了 iceberg;最上层可反对各种不同的计算引擎
3. OPPO 数据湖架构特点
晚期大数据存储特点是流计算和批计算的存储放在不同的零碎中,降级后的架构对立了的元数据管理,批、流计算一体化;同时提供对立的交互查问,接口更敌对,秒级响应,并发度高,同时反对数据源 Upsert 变更操作;底层采纳大规模低成本的对象存储作为对立的数据底座,反对多引擎数据共享,晋升数据复用能力
4. 数据湖存储 CBFS 架构
咱们的指标是建设可反对 EB 级数据的数据湖存储,解决数据分析在老本,性能和体验的挑战,整个数据湖存储分成六个子系统:
- 协定接入层:反对多种不同的协定(S3、HDFS、Posix 文件),可做到数据用其中一种协定写入,用另外两种协定也可间接读到
- 元数据层:对外出现文件系统的档次命名空间和对象的扁平命名空间,整个元数据是分布式的,反对分片,线性可扩大
- 元数据缓存层:用来治理元数据缓存,提供元数据拜访减速能力
- 资源管理层:图中的 Master 节点,负责了物理资源(数据节点,元数据节点)以及逻辑资源(卷 / 桶,数据分片,元数据分片)的治理
- 多正本层:反对追加写和随机写,对大对象和小对象都比拟敌对。该子系统一个作用是作为长久化的多正本存储;另一个作用是数据缓存层,反对弹性正本,减速数据湖拜访,后续再开展。
- 纠删码存储层:能显著升高存储老本,同时反对多可用区部署,反对不同的纠删码模型,轻松反对 EB 级存储规模
接下来,会重点分享下 CBFS 用到的关键技术,包含高性能的元数据管理、纠删码存储、以及湖减速
▌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 编码
计算步骤:
1、编码矩阵,下面 n 行是单位阵 I,下方 m 行是编码矩阵;k+ m 个数据块组成的向量,蕴含原始的数据块和 m 个校验块
2、当某块失落时:从矩阵 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 类型
1、离线 EC:整个条带 k 个数据单元都写满后,整体计算生成 m 校验块
2、在线 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:单机存储引擎,负责数据的理论存储
纠删码写
1、流式收取数据
2、对数据切片生成多个数据块,同时计算校验块
3、申请存储卷
4、并发向各个存储节点散发数据块或校验块
数据写入采纳简略的 NRW 协定,保障最小写入份数即可,这样在常态化的节点及网络故障时,申请也不会阻塞,保障可用性;数据的接管、切分、校验块编码采取异步流水线形式,也保障高吞吐和低时延。
纠删码读
数据读取也采取了 NRW 模型,以 k =m= 2 编码模式举例,只有正确读到 2 个块 (不论是数据块还是校验块), 即可疾速 RS 解码计算失去原始数据并;此外为晋升可用性和升高时延,Access 会优先读邻近或低负载的存储节点 EC-Node
能够看到,在线 EC 联合 NRW 协定为确保了数据的强一致性,同时提供保障高吞吐和低时延,很适宜大数据业务模型。
3. 数据湖拜访减速
数据湖架构带来显著的收益之一是老本节约,但存算拆散架构也会遇到带宽瓶颈和性能挑战,因而咱们也提供了一系列拜访减速技术:
首先是多级缓存能力:
1、第一级缓存:本地缓存,其与计算节点同机部署,反对元数据和数据缓存,反对内存、PMem、NVme、HDD 不同类型介质,特点是拜访时延低,但容量少
2、第二级缓存:分布式缓存,正本数目弹性可变,提供地位感知能力,反对用户 / 桶 / 对象级的被动预热和被动缓存,数据淘汰策略也可配置
多级缓存策略在咱们的机器学习训练场景有不错的减速成果
另外存储数据层还反对了谓语下推操作,可显著缩小存储与计算节点间大量的数据流动,升高资源开销并晋升计算性能;
数据湖减速有还很多粗疏的工作,咱们也在继续欠缺的过程中
▌将来瞻望
目前 CBFS-2.x 版本已开源,反对在线 EC、湖减速、多协定接入等要害个性的 3.0 版本预计将于 2021 年 10 月开源;
后续 CBFS 会减少存量 HDFS 集群间接挂载(免数据搬迁),冷热数据智能分层等个性,以便反对大数据及 AI 原架构下存量数据平滑入湖。
作者简介:
Xiaochun OPPO 存储架构师
更多精彩内容,欢送关注 [OPPO 数智技术] 公众号