欧伟杰博士:突破算力边界,YashanDB实现理论与工程双重突围

作者介绍

e21504d70b2825e5af42ed76c3df4f4d.jpeg *全文4767个字,阅读时长约12分钟。

背景

随着数字化进程的加速,数据处理的规模和速度需求持续攀升。传统数据库系统在处理大规模数据时,存在单表记录数不超过500万条的限制,这已成为业务发展的瓶颈。为了解决此问题,分布式数据库通过横向扩展来分担单节点的压力。然而,随着数据规模的增长,数据库节点的数量也会增加,这会导致成倍增长的运维问题和对IT运维工作的需求。

同时,移动互联网、智能设备、汽车和物联网终端的发展,对并发访问和响应时间提出了更高的要求。现有的解决方案通常基于独立的内存缓存来满足热点数据的读写需求,然而由于缓存容量有限且热点数据不在数据库中,导致无法参与统计分析,数据的价值没有得到充分利用,仍然存在优化空间。

除此之外,随着大数据应用场景的快速普及与创新业务的发展,传统的数据管理方案已愈发难以满足海量数据实时分析的需求。实时应用、 高通量在线交易和实时分析等混合负载的场景成为业务的基本诉求。 面临这些新的挑战,我们认为有以下 个核心命题 要去回答:
  • 如何在不消耗大量算力资源的情况下,低成本地满足海量数据的计算要求?
  • 如何设计一个高效、易用的数据库系统来满足不同的业务诉求?
  • 如何避免差异化实现,高效构建一个统一行列存、混合负载的架构?
本文将从理论和工程两方面分享由“0”构建全自研数据库系统YashanDB的设计理念与背后思考,并试图回答上述的几个关键问题,与大家共同探讨面向未来数据库技术创新之道。

有界理论打破 大数据算力增长挑战

关系代数理论诞生于上世纪80年代,为关系数据库系统奠定了基础。 但是随着数据规模的不断增长,传统的数据库无法解决的问题越来越多。

因此,人们重新定义了大数据及其基于并行计算的解决方案。 这种方案的核心理念是通过大量的计算资源来满足数据的计算需求。然而,计算资源的增长速度远远跟不上数据的增长速度,同时,数据库节点数量和运维复杂度也呈指数级增长,这成为大数据处理所面临的一项关键挑战。

但通过观察具体业务不难发现一个现象,绝大部分查询涉及的数据量与全量数据相比是微乎其微的, 如果能针对查询找出一个特定的,包含所有正确结果的小数据集,那么就可以节省大部分针对无关数据的扫描和计算开销,这正是有界计算的出发点。

有界计算的关键挑战是如何避免数据扫描而找出查询相关的小数据集。 首先需定义一个概念为 “访问约束” ,其意义为对于特定的X取值,其对应的Y的取值有且仅有N种可能,这里的N可理解为通过已知的X找到对应Y的边界。 例如在知道某位同学对应班级的前提下,这位同学的ID取值不可能超过班级最大人数。

这种属性之间的语义在关系理论中并没有被识别和利用,下面我们通过一个简单的例子看下如何运用访问约束来解决查询问题 直观感受有界计算与传统方法的差异: 我们想找出2019年5月份我朋友在NYC去过的餐馆的价位。 按传统方式需要将朋友关系表friend和就餐表dine进行连结后再通过餐馆信息表cafe找出其价格,但这样就涉及大量数据扫描和连结计算开销巨大,即使使用索引替代全表扫描也会因为随机IO使得提升有限。

有界计算通过特定属性间的访问约束(Access Constraint),仅需要访问三个有限的小数据集,避免了大量无关数据之间的计算。

0e1487e006a8c5097c0398fd81699d64.jpeg
图1 有界计算理论示意

例子中提到的访问约束是基于YashanDB列式存储引擎实现的。 将特定X取值对应的Y连续存储,可以基于轻量化算法实现去重和压缩,并在计算时还原原始取值确保语义完整。 用户执行查询时优化器根据已有访问约束判断能否实现查询加速,无需人工干预或修改SQL语句。 与此同时,访问约束也不是一成不变的, 对于持续变化的业务数据,可以在业务运行过程中不断刷新已有访问约束, 我们发现其维护成本远低于物化视图。

有界计算适用于记录中存在大量重复信息的详单分析场景,其原型实现已在电信详单管理和北美航空记录分析两个真实场景中完成验证,最大加速效果可达到100000倍。 基于有界计算可以大大降低大数据分析的算力要求,拓展数据库系统的能力边界。 该理论也获得了2018年的Royal Society Wolfson Research Merit Award(英国皇家学会沃夫森研究优秀奖)。


自主技术架构 面向混合负载的存储与SQL技术

随着通信和互联网技术的不断发展,业务对数据管理的实时性要求持续提升。 传统数据库受制于软硬件处理能力限制,将交易型操作和分析型查询分而治之,带来了数据分析的滞后性和数据库运维上的复杂性。

对于新型业务而言更强调混合负载实时数据管理的能力,这也需要数据库系统在存储引擎到SQL引擎上采用新的技术与架构。下面我们将详细介绍YashanDB如何从混合存储及SQL执行两方面实现混合负载能力的。

混合引擎架构

为了兼顾高并发数据访问和实时数据分析两类截然不同的需求,YashanDB在存储架构上大胆尝试多种数据组织形式。

首先是 支持面向高并发短事务的行式存储,简称行表(Heap),将一条记录的多个字段连续存储在一起。 而作为存储的最小单元,同一个数据块上存储了多条完整记录和对应事务信息,这种方式可以最小化数据访问的开销,并通过支持原地更新进一步降低数据修改的管理成本。

另一方面,为了管理海量数据并支持实时分析, YashanDB还支持冷热分离的列式存储,简称列表(LSC, Large-scale Storage Columnar Table)。 与行表最大的差异是,列表将不同记录的相同字段连续存储在一起。由于大部分查询仅用到记录中的部分字段,因此按字段连续存储可以避免整行读取,从而提高IO资源利用率。与此同时,同一字段存在重复取值,基于轻量化压缩算法可实现存储空间的成倍缩减。列表相较行表对于写入不太友好,因为一条记录写入可能要访问多个数据块,造成大量Cache Miss和额外IO。

780f6724b4584e6d10b3c68b1cb0e465.jpeg 图2 行列存示意图

值得一提的是,存储引擎的能力不仅是数据组织与管理,还包括事务、持久化等。YashanDB对于上述两类数据组织均提供完整事务和持久化能力,使得针对快速变化数据的高性能分析不再高不可攀。

业界在实现行列混合存储方面仍存在一定的优化空间:采用读写存储的内部转换,为了避免数据变化对列存储数据的影响,需要预留数据量两倍的内存空间;如按副本方式分别管理TP和AP数据,虽然可以在资源上进行隔离,但引入了数据转化的延迟与开销。

YashanDB提出了一份数据上的混合负载能力,在保证完成ACID能力的前提下,提供可更新列存数据存储,通过不同的SQL执行引擎来同时实现高通量事务处理和低时延复杂查询。 其架构如下图所示,主要差异在于数据仅保存一份,所有已提交的变更都可以通过查询反映到结果集中。这里面包含了三个技术点:
  • 支持快速更新和查询的列式存储组织,通过In-place Update解决数据变更导致的空间膨胀和无效数据回收问题

  • 面向交易和分析负载的差异化需求,通过不同执行模型最大化资源利用率,火山模型支持低时延短事务,向量化模型支持全面扫描数据分析;

  • 细粒度配置的资源与调度管理,避免不同类型处理之间的资源争抢和固定配置带来的资源闲置,会话级配置结合业务特征灵活调整。


e30014449c1ef1166e343ea647a56075.jpeg 图3 YashanDB混合负载的统一存储方案


SQL引擎设计与关键优化


对于SQL引擎而言,优化器和执行器对查询性能的影响最为显著。而优化器的复杂度取决于执行器有多少种不同的算子,每种算子代表了一种可能的访问路径。特定算子之间可以根据规则进行优化。

YashanDB的SQL引擎为了达到极致性能, 同时支持了行列两类算子分别满足低时延短事务和大数据量查询场景的差异化需求。 因此优化器的实现挑战要高于传统数据库系统。这里列举了我们实现的三个关键能力:

155ea2aa55cb5de8669395cd58f4b672.jpeg 图4 YashanDB 优化器

  • 面向差异化代价模型的行列混合评估:针对行列算子建立独立的代码模型,在最优计划选择时考虑行转列或列转行的整体代价,并结合启发式算法提前排除不理想的备选计划,避免搜索空间过大的问题。

  • 行列统一的并行优化框架:YashanDB的高性能查询能力得益于并行计算的应用。针对行列算子,使用一套并行框架可以显著降低优化器的复杂度,避免需要根据算子类型进行差异化实现的大量访问路径。这套框架的并行执行单位为Pipeline,能够支持单算子的并行,在不同Pipeline之间需要通过PX算子进行数据的交换,PX算子适用于单机和分布式两种场景下不同的交换策略。

  • 面向特定模型的动态优化规则YashanDB的架构目标是行列统一,但在具体实现过程中,由于算子实现难度的差异,需要针对行列算子按照特殊规则进行调整。为了避免这类优化影响优化器的基本框架,YashanDB的优化器会先生成不区分行列的通用计划,然后根据行列算子的特点进行动态优化调整。这其中包括部分列算子未实现的内置函数,可以通过动态转换为行算子来计算,同时也提高了优化器的可维护性。

994706bdd55f4bec1d55515eead8e28e.jpeg 图5 TPC-H测试结果

硬件配置:2288虚拟机(16核,160G内存,3.4T SSD) 软件版本:OS(CentOS 7),DB(YashanDB 22.2、Oracle 19C Inmemory 、Greenplum 6.17.1) 测试模型:TPC-H 100G数据

总体来说,SQL引擎的整体性能和架构的持续演进非常重要,而 优化器作为关键能力,需要充分发挥各执行算子的优势,并减少差异化规则带来的实现复杂性。 我们正在探索基于深度学习的查询优化,但目前面临冷启动和假阳性等挑战。

深度兼容性和一键业务迁移

作为一款面向企业用户的新型全自研数据库系统,YashanDB需要考虑用户在切换到该系统时所面临的挑战: 一方面是业务系统需要改造以适应新的数据库系统,另一方 面是 数据搬迁过程如何实现平滑可控。

改造成本


首先是改造成本,这主要是由于新老数据库在SQL语法/数据类型/存储过程等方面存在差异导致的。 YashanDB从设计之初就确定了Oracle全面兼容的目标 这里的全面不止包 含SQL语法/语义、各类数据类型的处理差异,还包括复杂存储过程,触发器以及系统视图等高级能力。另外,我们还考虑到了资深DBA习惯使用的一系列运维工具的支持,如AWR和RMAN等。在对Oracle的兼容性设计中,每一个细节都需要反复论证和推敲,避免全盘照搬导致泥沙俱下,以下是一个Oracle的例子

8a0773cd80b7c77d05186435e61213a0.jpeg


前两条语句结果证明在Oracle内核中,绑定参数没有同名加载机制,即使命名均为:B1,也都是按位置加载. 最后一条语句可以运行即证明并非所有场景都是按位置加载,猜测Oracle为了避免存储过程无法使用GROUP BY语句,对按位置加载的绑定参数原则,做了特殊“优化”,这类“优化”在语义表达上会让用户困惑。

数据迁移

其次是数据迁移。数据迁移的目标不仅仅是简单的数据导入/导出, 而是基于业务设计的全自动化处理 YashanDB的自动化迁移平台具备业务兼容性评估、一键数据迁移和数据完整性校验等功能。

  • 业务兼容性评估为迁移计划提供必要的输入,识别当前数据库系统无法兼容的对象和SQL语句,并给出改造建议;

  • 一键数据迁移可以满足存量数据搬迁和实时增量同步两类需求,目前支持Oracle/MySQL/PostgreSQL数据库系统;

  • 数据完整性校验可以避免数据迁移在异常情况下的数据丢失/错误,自动识别并可在人工指导下自动修补错失数据,从而大大提升迁移的可靠性。

总结

随着数据规模的爆发式增长,我们创新性地将有界计算理论转化系统能力,在 不消耗大量算力资源的情况下能够低成本地满足海量数据的计算要求。

同时 随着数字化转型的持续深入,很多客户都提出了数据驱动的实时业务决策, 这要求数据库能够满足混合负载,兼顾高通量数据变更和实时查询,因此我们设计了一套统一行列存、混合负载的架构。 同时充分考虑用户在切换到该系统时所面临的挑战,实现了高度的商业数据库兼容性,极大地降低了应用改造迁移成本。

当然我们不仅要考虑当前的需求,还要为未来的需求做好准备。 那随着AI等技术的快速发展,我们认为智能化机遇将会给数据库带来重大变革:

首先,面向大模型场景,数据 库管理的对象已经不再是关系表,而是Embeddings向量,这类对象的计算方式更复杂,且具有不可解释性,前景非常广阔。另一方面,机器学习也可以将传统数据库调优这类只有资深DBA才能搞定的任务变成固定的模型,大大降低了数据库的运维门槛;此外,NLP2SQL在大模型的赋能下让更多用户可以使用大数据分析。

未来,我们将持续探索更多创新技术的可行性和落地方案,拓宽数据库应用的广度和深度,为更多企业的数字化转型提供有力支撑。



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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No146.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

MySQL5.7高级函数:JSON_ARRAYAGG和JSON_OBJECT的使用

前置准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint(20) NOT NULL,name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci …

杀掉进程但是fastapi程序还在运行

两个脚本,一个运行fastapi服务,一个重启服务: 启动服务先: 发现问题,杀掉 server.sh 后,依旧有: 不知道为什么会出现这个,直接kill吧: server.sh: #!/bin/bashparpath/…

led灯什么牌子的质量好?Led护眼台灯排行榜

现在我们很多家长对自己孩子的视力十分关心,生怕自己的孩子是近视、远视、弱视等等。对于父母而言,在孩子读书压力大课业重的关键时期,为孩子选择合适的桌椅,保护灯具从而保护孩子的眼睛是非常重要的事情!那么买给孩子读书做功课的…

Matlab绘图函数subplot、tiledlayout、plot和scatter

一、绘图函数subplot subplot(m,n,p)将当前图窗划分为 mn 网格,并在 p 指定的位置创建坐标区。MATLAB按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。如果指定的位置已存在坐标区,…

基于Java的音乐网站管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&…

前端uniapp防止页面整体滑动页面顶部以上,设置固定想要固定区域宽高

解决:设置固定想要固定区域宽高 目录 未改前图未改样式改后图改后样式 未改前图 未改样式 .main {display: flex;flex-direction: row;// justify-content: space-between;width: 100vw;// 防止全部移动到上面位置!!!&#xff01…

No147.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【在Ubuntu部署Docker项目】— PROJECT#1

一、说明 让我们深入了解 Docker。用docker构建web服务器。我们正在计划开发JavaScript API,建立MySQL数据库,并创建一个 PHP 网站使用 API 服务。Php Node.js Mysql — DockerSeries — Episode#1 二、系统架构概述 我们要构建的容器,是三…

Qt_C++读写NFC标签Ntag支持windows国产linux操作系统

本示例使用的发卡器&#xff1a;Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) ntag2标签存储结构说明 #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QDebug> #include "QLibrary&…

队列的使用以及模拟实现(C++版本)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

【每日一题】2703. 返回传递的参数的长度

2703. 返回传递的参数的长度 - 力扣&#xff08;LeetCode&#xff09; 请你编写一个函数 argumentsLength&#xff0c;返回传递给该函数的参数数量。 示例 1&#xff1a; 输入&#xff1a;args [5] 输出&#xff1a;1 解释&#xff1a; argumentsLength(5); // 1只传递了一个值…

OpenHarmony应用核心技术理念与需求机遇简析

一、核心技术理念 图片来源&#xff1a;OpenHarmony官方网站 二、需求机遇简析 新的万物互联智能世界代表着新规则、新赛道、新切入点、新财富机会;各WEB网站、客户端( 苹果APP、安卓APK)、微信小程序等上的组织、企业、商户等;OpenHarmony既是一次机遇、同时又是一次大的挑战&…

【python+appium】自动化测试

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…

竞赛无人机搭积木式编程(四)---2023年TI电赛G题空地协同智能消防系统(无人机部分)

竞赛无人机搭积木式编程&#xff08;四&#xff09; ---2023年TI电赛G题空地协同智能消防系统&#xff08;无人机部分&#xff09; 无名小哥 2023年9月15日 赛题分析与解题思路综述 飞控用户在学习了TI电赛往届真题开源方案以及用户自定义航点自动飞行功能方案讲解后&#x…

从零学算法(LCR 191)

为了深入了解这些生物群体的生态特征&#xff0c;你们进行了大量的实地观察和数据采集。数组 arrayA 记录了各个生物群体数量数据&#xff0c;其中 arrayA[i] 表示第 i 个生物群体的数量。请返回一个数组 arrayB&#xff0c;该数组为基于数组 arrayA 中的数据计算得出的结果&am…

移动端和PC端对比【组件库+调试vconsole +单位postcss-pxtorem+构建vite/webpack+可视化echarts/antv】

目录 组件库 移动端 vue vant PC端 react antd vue element 调试&#xff1a;vconsole vs dev tools中的控制台&#xff08;Console&#xff09; vconsole&#xff1a;在真机上调试 postcss-pxtorem&#xff1a;移动端不同的像素密度 构建工具 webpack 原理 Ba…

Linux 进程层次分析

Linux 进程组 每个进程都有一个进程组号 (PGID) 进程组&#xff1a;一个或多个进程的集合 (集合中的进程并不孤立)进程组中的进程通常存在父子关系&#xff0c;兄弟关系&#xff0c;或功能相近 进程组可方便进程管理 (如&#xff1a;同时杀死多个进程&#xff0c;发送一个信…

RISC-V 基础指令汇总

加载指令 存储指令 PC寻址指令 auipc rd, imm这条指令把 imm &#xff08;立即数&#xff09;左移12位并带符号扩展到64位后&#xff0c;得到一个新的立即数&#xff0c;这个新的立即数是一个有符号的立即数&#xff0c;再加上当前 PC 值&#xff0c;然后存储到 rd 寄存器中。…

解释器风格架构C# 代码

/*解释器风格架构是一种基于组件的设计架构&#xff0c;它将应用程序分解为一系列组件&#xff0c;每个组件负责处理特定的任务。这种架构有助于提高代码的可维护性和可扩展性。以下是如何使用C#实现解释器风格架构的步骤&#xff1a;定义组件&#xff1a;首先&#xff0c;定义…