列存在 OceanBase 数据库架构中的应用与演进

OceanBase 4.3 版本上线了列存功能,以满足实时分析的需求。

本文作为《特性解读:列存技术》的后续,将详细阐述列存技术在OceanBase数据库架构中的应用、发展历程,以及未来的趋势。

一、前言

1970 年,关系模型之父 Codd 提出关系模型,正式开启了数据库的时代。1979 年,Oracle 发布第一个商业数据库版本,数据库技术开始广泛应用于各行各业。在那个数据量还不是特别大、查询也相对简单的年代,单一的数据库系统能够满足用户的需求。

随着时间的推移,数据量急剧增加,查询也变得越来越复杂。单一的数据库已经无法满足用户的事务处理和分析处理需求。因此,Codd 于 1993 年正式提出 OLAP(联机分析处理)概念,并提出了 12 条准则。从此,OLTP(联机事务处理)和 OLAP 开始分道扬镳,在两个领域出现了许多数据库产品。大约十年后的 2005 年,StoneBraker 提出了第一个基于列存的数据库原型 CStore,证明了列存在分析领域的巨大潜力,自此列存储成为 OLAP 数据库的标准配置。然而,值得注意的是,尽管数据库产品在 OLTP 领域主导地位稳固,但在 OLAP 领域,全球技术代表性产品层出不穷,比如 GreenPlum(2006 年)、SnowFlake(2014 年)、DataBrick(2014 年)、ClickHouse(2016 年)等。

尽管 OLTP 和 OLAP 数据库各自在自己的领域占据主导地位,但用户对 OLTP 和 OLAP 的需求却是同时存在的。为了支持业务,用户通常需要使用两套数据库系统,一套用于 OLTP,一套用于 OLAP,并通过数据同步组件进行 OLTP 到 OLAP 的数据同步。然而,这种方式会带来一系列问题:

首先,不仅数据冗余了一份,系统也冗余了一份。尽管面向 OLAP 的系统可以使用相对廉价的存储,但 CPU 和内存的冗余消耗仍然存在。此外,多了一套系统,也意味着增加了一套系统运维的成本。

其次,OLAP 和 OLTP 系统之间的数据同步总会存在延迟,并且很难保证延迟时间。一旦 OLAP 系统或数据同步组件出现问题,数据修复可能需要数天时间,这段时间内 OLAP 的业务就一直处于不可服务的状态。

最后,随着互联网技术的发展,对 OLAP 实时性的要求也越来越高。设想这样一个场景,用户在网上购物下单,线上交易这是再经典不过的 OLTP 场景。而系统希望能够根据用户下单的商品以及其他相关信息,自动推荐出用户可能继续加购的商品以增加成交额,这则是典型的 OLAP 场景。用户在 APP 或者页面上的浏览速度几乎是电光火石之间,等数据同步到 OLAP 系统再进行响应,可能就来不及了。

因此,尽管相比上个世纪,数据库承载的数据量增加了成百上千倍,之前一套简单系统的美好时光还能回来吗?2016 年,Gartner 正式提出了 HTAP(混合事务/分析处理)的概念,成为这个问题最好的答案,即无需增加实体,如果一套系统能够满足大部分的 OLTP 和 OLAP 需求,就不需要搭建两套复杂系统了。

相对来说,行存储更适合 OLTP 类负载,而列存储更适合 OLAP 类负载。一套支持 HTAP 实时分析的数据库通常需要同时支持行存储和列存储。尽管相比分别部署 OLTP 和 OLAP 数据库,使用一套 HTAP 数据库可以解决同步延迟和数据实时性的问题,但数据冗余的问题似乎并没有得到解决。然而,实际上,使用一份数据来实现 HTAP 是可能的,这取决于我们如何看待和使用列存。

二、列存是副本

列存副本方案是一种较为直接的 HTAP 实现方式,它相当于在单一系统内构建了两套独立的引擎:一套基于行存储的引擎面向 OLTP,另一套基于列存储的引擎面向 OLAP。这种方案对用户屏蔽了数据同步的细节,并能提供无延迟的 OLAP 数据访问。Google F1 Lightning 和 PingCAP TiDB 等业内优秀的数据库都采用了类似的方案。

1717380551

如图所示,左侧的三个副本(Node 1/2/3)基于行存储引擎提供 OLTP 能力,而右侧的副本 Node 4 则是一个列存储引擎,提供 OLAP 能力。两个引擎之间通过 Raft/CDC 进行日志数据同步。该方案的优点在于可以提供较好的隔离性,OLAP 引擎的数据访问不会影响 OLTP 引擎本身的稳定性。

当然,这种方式也存在一定的弊端,那就是成本高昂,尤其是对大体量的数据场景非常显著。不仅数据本身会额外冗余一份,用于支持列存引擎的 CPU 和内存也需要冗余,而且运维成本也丝毫没有减少。此外,作为独立的列存引擎,一旦出现问题,也需要专门的人员进行处理。

三、列存是索引

通过列存索引的方式来实现 HTAP,比较典型的代表是 SQL Server。尽管早在 2012 年就推出了 Column Index (列存索引)功能,但当时的版本仅支持只读,无法满足用户的更新需求。直到 2016 年,SQL Server 可更新的列存索引正式发布,这项特性开始为用户提供更加友好的体验。

1717385844

如图所示,SQL Server 内部也单独开发了一套列存存储引擎,与原有的行存引擎并行工作。SQL 层会统一对接底层的不同引擎,如果表是行存的,则使用行存引擎存储数据;如果表上还构建了额外的列存索引,那么就会对这些列存索引使用列存引擎存储。行存和列存可以同时存在,也可以同时构建多个列存索引。这种方式具有很高的灵活度,可以根据需要只针对特定的列构建列存索引,数据冗余程度也远低于列存副本方案。此外,SQL Server 在执行 SQL 语句时可以同时利用列存和行存的能力,极大地提升了执行效率。

具体到实现层面,SQL Server 的列存存储不会按照主键顺序排序,而是类似于堆表的方式进行组织,将固定数量的行组成一个 Row Group。在每个 Row Group 中,每个列都会单独存储到不同的 Segment 中。Row Group 一旦生成便不再修改,删除操作通过 Delete Bitmap 标记完成,更新操作则通过 Delete + Insert 完成。后续的 Insert 操作会被放入 Delta Store,查询时需要将列存数据、Delete Bitmap、Delete Buffer 和 Delta Store 中的数据进行合并得到最终结果。

1717385867

SQL Server 的列存方案很好地解决了延迟、实时性以及成本等问题,但对于索引组织表来说,列存索引仍然在很大程度上依赖于行存,主键约束和唯一键约束的维护也需要依靠行存来完成。不仅如此,Delta Store 和 Delete Bitmap 的维护也并非没有代价,列存索引的引入会对行存 OLTP 的性能造成一定影响。

四、列存是缓存

Oracle 的做法是将列存作为缓存实现 HTAP 混合负载。2013 年,Oracle 发布了 12C 版本,并推出了名为 IMC(In-Memory Column Store)的特性。

1717385910

从严格意义上讲,IMC 更像是基于行存的列存加速缓存,而非完整意义上的列存。Oracle 允许在列、分区、表、表空间等不同粒度上开启 IMC,灵活度很高。如果对某张表的某些列开启了 IMC,Oracle 会将这些列的数据从行存中加载到内存中,并以列存的形式存储。但需要注意的是,数据仍然存储在行存中,列存数据不会直接落盘。后续的增删改等修改操作会通过内部刷新机制更新到列存。在 Oracle 的内存管理中,SGA 中的 Buffer Cache 承担了主要的增删改查等事务操作。如果要开启 IMC,则需要在 Buffer Cache 之外额外分配一块单独的内存区域。

这个做法避免了磁盘数据冗余的代价,也可以向用户提供实时无延迟的 OLAP 能力,并且提供了一定的灵活性,用户可以根据自身需要对列存进行灵活的配置。然而,其问题也很明显,内存的代价并未减少,而且相比于磁盘来说,内存总是更加宝贵,用昂贵的内存来支持 OLAP 能力总体成本较高。此外,OLAP 要处理的数据量通常非常庞大,将所有数据都存储在内存中并不现实。一旦需要访问磁盘,就需要将数据从行存中读出并转换成内存列存。在这种场景下,列存相较于行存可以减少 I/O 代价的优势也就无法体现了。

五、列存是数据

无论是 SQL Server 还是 Oracle,其底层存储引擎都基于 B-Tree。如果我们将视角拓宽到 LSM-Tree,就会发现列存与 LSM-Tree 才是天作之合,产生更显著的化学反应。LSM-Tree 中,数据被划分为 MemTable 和 SSTable 两个部分。MemTable 驻留在内存中,支持动态修改,天然适合行存;而 SSTable 存储在磁盘上不可修改,非常适合用来做列存。在 OceanBase 中,SSTable 又会被细分为转储 SSTable 和基线 SSTable。通常,转储 SSTable 用于存储最近修改的数据,而基线 SSTable 则用于存储较老的数据。

OLTP 类负载以短事务为主,主要包括插入、小范围更新、删除和查询最近的数据。这类负载涉及的数据大多位于 MemTable 和转储 SSTable 中。因此,OceanBase 针对 MemTable 和转储 SSTable 使用行存存储,并对基线 SSTable 增加 Bloom Filter 过滤以阻断大部分空查,同时使用 cache 缓存部分热点列存数据以加速热查,从而确保 OLTP 类负载的性能。

OLAP 类负载以大查询为主,涉及的数据大多位于基线 SSTable 中。对于基线 SSTable 的数据,OceanBase 直接使用列存。但与 SQL Server 不同的是,OceanBase 的列存数据并非无序存储,而是整体按照主键顺序排列。这样一来,即使在列存中处理少量 OLTP 类请求,需要寻找单独一行数据,OceanBase 也能够通过二分法快速定位到目标数据行。很多用户在 POC 阶段评价,这是可以支持 OLTP 业务的列存。

通过这种方式,OceanBase 可以通过一份数据同时兼顾 OLTP 和 OLAP。考虑到相对于转储 SSTable 来说,基线 SSTable 通常占据了数据量的绝大部分,且列存相较于行存具有更高的数据压缩率,OceanBase 的架构可以将成本降至最低。然而,该架构也面临一些挑战:

首先,如何做好 OLTP 和 OLAP 多工作负载的资源隔离是一项极具挑战性的任务。在理想的调度机制下,OLAP 负载可以灵活地从 OLTP 负载处获取资源,并在 OLTP 空载的情况下使用大部分系统资源。这理论上是可以实现的,就像现在大多数数据库都可以部署在 Docker 容器中一样,但很少有人会担心容器对系统资源的隔离能力。然而,这对于特别高等级的隔离需求来说可能还不够。

其次,也可能存在部分查询需求,在基线 SSTable 使用行存时会表现得更好。或者将若干列混合存储在一起,可能会带来更好的查询性能。

六、列存是所有

基于 LSM-Tree 架构,OceanBase 可以将数据做列存存储,以提供最极限的成本节省。但这并不意味着列存存储是 OceanBase 的唯一选择,它还可以作为缓存、索引和副本,为用户提供更高的灵活性和无限的可能性。

○  首先,OceanBase 可以将列存视作缓存,在缓存中存储部分区域的列存数据,以加速热点范围的查询。

○  其次,OceanBase 可以将列存看做索引,在基线 SSTable 中同时存储行存与列存数据,或者做部分列的聚合冗余存储。根据查询需要,查询列存或者行存,或者更合适的列组。

○  再次,OceanBase 可以将列存视为副本,在主副本中使用行存,在只读副本中使用列存,以提供更高等级的资源隔离。

○  最后,可能在不远的未来,除了提供以上的灵活度以外,OceanBase 或许还可以让用户摆脱行存和列存这些底层存储方式的限制,忘掉 OLTP 和 OLAP 等形态,让数据库回归到最初的本质。用户把数据和查询给到数据库,数据库把结果给用户,无论列存还是行存,数据库总是按照最适合负载的形式组织数据,以最快的速度返回结果。当用户觉得查询有些慢又不想做调优时,只需加资源即可。

七、写在最后

以上是我们对列存能力的理解和整体规划,OceanBase 的列存功能已经在 4.3 版本中正式推出,更多强大功能正在研发中。我们希望这些新特性能尽快与大家见面,让更多用户体验到列存在实时分析领域带来的优势和便捷。


本文作者:

1717386085

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]

背景: 使用JavaSEJDBCMySQL技术实现一个物业管理系统,具体要求如下 物业管理系统需求: 需求分析 1.1用户需求分析 在进入系统之前,要进行身份确认,只有用户名和用户密码都相符的用户方可进入本系统,为…

PCL 抛物线回归拟合(Quadratic,二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里仍然是最小二乘法的应用,其推导过程如下所述: 1.二次函数模型: 其中,a、b 和 c 是需要确定的参数。 2.最小二乘法 假设我们有一组数据点 ( x 1 ​ , y

负压实验室设计建设方案

随着全球公共卫生事件的频发,负压实验室的设计和建设在医疗机构中的重要性日益凸显。负压实验室,特别是负压隔离病房,主要用于控制传染性疾病的扩散,保护医护人员和周围环境的安全。广州实验室装修公司中壹联凭借丰富的实验室装修…

k8s 对外服务之 Ingress(七层代理)

一 Ingress 简介 理论方面 1, k8s service 作用 对集群内部: 它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制 对集群外部: 对集群外部,他类似负载均衡器&am…

剪画小程序:AI声音克隆,只需10秒完美复制真人音色

Hello,大家好呀!我是分享声音的克隆。 想象一下,如果你能够复制自己的声音,那么您可以给视频配上自己的声 音,那是多么的有趣啊。 ​编辑 工具:小程序剪画 功能简介:支持多种端口&#xff1…

Vuforia AR篇(七)— 二维码识别

目录 前言一、什么是Barcode ?二、使用步骤三、点击二维码显示信息四、效果 前言 在数字化时代,条形码和二维码已成为连接现实世界与数字信息的重要桥梁。Vuforia作为领先的AR开发平台,提供了Barcode Scanner功能,使得在Unity中实…

【Web API DOM10】日期(时间)对象

一:实例化 1 获取系统当前时间即创建日期对象 const date new Date() console.log(date) 2024年6月5日周三 2 获取指定的时间 以获取2025年6月29日为例 const date new Date(2025-6-29) console.log(date) 二:日期对象方法 1 使用场景&#xf…

QT安装与使用

QT安装与使用 Windows QT安装 1.下载windowsQT安装包 本教程使用的QT版本是:https://download.qt.io/archive/qt/5.12/5.12.9/ 本教程的安装包放在阿里云盘供大家获取。 2.QT安装 如果没有梯子,大家登录QT官网可能会失败,这里可以不需要Q…

Qt 的 d_ptr (d-pointer) 和 q_ptr (q-pointer)解析;Q_D和Q_Q指针

篇一: Qt之q指针(Q_Q)d指针(Q_D)源码剖析---源码面前了无秘密_qtq指针-CSDN博客 通常情况下,与一个类密切相关的数据会被作为数据成员直接定义在该类中。然而,在某些场合下,我们会…

文件编码概念

文件的读取 open()函数: 打开一个已存在的文件,或者创建一个新文件 open(name,mode,encoding) name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径) mode:设置打开文件的模式(访问模式)&am…

关于信号翻转模块(sig_flag_mod)的实现

关于信号翻转模块(sig_flag_mod)的实现 语言 :Verilg HDL 、VHDL EDA工具:ISE、Vivado、Quartus II 关于信号翻转模块(sig_flag_mod)的实现一、引言二、实现信号翻转模块的方法(1)输入接口(2)输出接口&…

MySQL换路径(文件夹)

#MySQL作为免费数据库很受欢迎,即使公司没有使用,自己也可以用。它是一个服务,在点击CtrlAltDelete选择任务管理器后,它在服务那个归类里。 经常整理计算机磁盘分类的小伙伴,如果你们安装了MySQL,并且想移…

【相关概念】经济金融中的Momentum

张张张三丰de思考与总结: 最近做的期货价格泡沫中,一直在说,momentum,momentum,momentum,那么究竟什么是momentum呢? 目前,在有关期货价格泡沫的研究文献中,一般都是研究…

小熊家务帮day13-day14 门户管理(ES搜索,Canal+MQ同步,索引同步)

目录 1 服务搜索1.1 需求分析1.2 技术方案1.2.1 使用Elasticsearch进行全文检索(为什么数据没有那么多还要用ES?)1.2.2 索引同步方案1.2.2.1 Canal介绍1.2.2.1 Canal工作原理 1 服务搜索 1.1 需求分析 服务搜索的入口有两处: 在…

【iOS】UI学习——UITableView

UI学习(四) UITableView基础UITableView协议UITableView高级协议和单元格 UITableView基础 dateSource:数据代理对象 delegate:普通代理对象 numberOfSectionInTableView:获得组数协议 numberOfRowsInSection:获得行数协议 cellForRowAtIndexPath:创建单…

自然语言处理(NLP)—— C-value方法

自然语言处理(NLP)和文本挖掘是计算机科学与语言学的交叉领域,旨在通过计算机程序来理解、解析和生成人类语言,以及从大量文本数据中提取有用的信息和知识。这些技术在现代数据驱动的世界中扮演着关键角色,帮助我们从海…

【启明智显分享】Model3A 7寸彩屏应用于美容仪器及应用框图

一、应用背景 随着科技的不断发展,美容仪器也逐渐向智能化、信息化方向发展。工业级芯片Model3A方案的 7寸彩屏以其高性能、高稳定性、高清晰度的特点,成为美容仪器领域的一个理想选择。本方案重点在探讨Model3A 7寸彩屏在美容仪器中的应用及相应的解决…

如何在强数据一致性要求下设计数据库的高可用架构

在高可用的三大架构设计(基于数据层的高可用、基于业务层的高可用,以及融合的高可用架构设计)中。仅仅解决了业务连续性的问题:也就是当服务器因为各种原因,发生宕机,导致MySQL 数据库不可用之后,快速恢复业务。但对有状态的数据库服务来说,在一些核心业务系统中,比如…

如何快速分析并将一个简单的前后端分离项目跑起来

一、前言 主要是前一段时间有小伙伴问我说自己刚入坑学后端不久,在开源网站上找了个简单的前后端分离项目,但是自己不会跑起来,让我给他说说,介于这玩意三两句话不是很好说清楚,而且不清楚那个小伙伴的知识到何种地步…

【云岚家政】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…