最近,分析数据库在资本市场和技术界非常热,各种初创公司的创新产品已经迅速发展。一方面,这是因为企业的当前阶段依赖于数据从数据寻求增长潜力。带来需求的需求。另一方面,云原生技术的发展带来了现有技术系统的发展和变化。云本地技术重建分析数据库技术系统的使用是必要的,并且有很大的市场机会。
PolardB MySQL是由于云而出生的数据库系统。除了云上的OLTP场景外,许多客户还提出了PolardB的真实数据分析性能要求。,在复杂的分析和查询方案中获得了数百次的加速效应。
本文介绍了IMCI背后的技术路线的思考和特定解决方案的选择。PolardBMySQL列表分析功能将在阿里巴巴云上启动,因此请继续关注。
MySQL是一个开源数据库,主要是为OLTP方案设计的。开源社区的研发方向着重于增强其处理事务的能力,例如改善单核性能/多核可伸缩性/增强集群功能以增强可用性。查询,例如优化者处理儿童查询的能力,高性能操作员哈希金,SQL并行执行等,社区始终将其置于相对较低的优先级。因此,分析能力的进展缓慢。
随着MySQL发展成为世界上最受欢迎的开源数据库系统,用户存储了大量数据并运行关键业务逻辑,对这些数据的真实时间分析已成为不断增长的需求。需求,用户寻求更好的解决方案。
1 MySQL +特殊AP数据库计划解决方案
有许多专业分析数据库产品。一种可选的解决方案是使用两个系统分别满足OLTP和OLAP要求。在两个系统的中间,数据同步工具以真实的时间同步执行。furthermore,用户甚至可以添加一层代理,以将TP负载自动将TP负载转换为MySQL,并且分析加载路由在OLAP数据库上是在OLAP数据库上的。对应于基础数据库的部署拓扑。
这样的结构具有灵活性。例如,TP数据库和AP数据库都可以选择最佳解决方案,并且可以实现TP/AP负载的完整隔离。技术系统。其次,由于两个系统的处理机制的差异,上游和下游数据的实际时间一致性也非常具有挑战性。由于存在同步延迟,下游AP系统通常被存储过时,从而导致无法满足实际时间分析的需求。
2基于多复制的不同设计方法
在Internet上出现的许多新兴数据库产品与MySQL协议兼容,因此它已成为替换MySQL的选择。大多数这些分布式数据库产品都采用分布式共享的Nothing解决方案。它的核心功能之一是使用分布式一致性协议来确保单个分区多副本之间的数据之间的一致性。由于多个副本之间的数据是完全独立的,因此在不同副本上使用不同的格式将其存储为服务不同的查询负载是一种简单的 - 实施解决方案。典型的tidb,从tidb4.0开始,在筏组中的一个副本上,使用列存储来响应ap -type负载,并通过TIDB的智能路由功能,选择数据源。这样,数据库系统还提供OLTP负载和OLAP负载。
该方法已在许多研究和行业领域中使用并使用,并且它已越来越成为分布式数据字段中集成HTAP的事实标准方案。但是,应用此解决方案的前提是用户需要迁移到相应的情况NewsQL数据库系统,通常带来各种兼容性适应问题。
3集成等级混合存储方案
此外,比多复制发散的设计方法是在同一数据库实例中采用混合存储的方案,同时响应TP和AP负载。这是传统的商业数据库Oracle/SQL Server/db2,,这是一种解决方案。ETC。
三个领先的商业数据库制造商都采用混合存储的技术路线与内存计算相结合。它具有其基本技术逻辑:专栏作家存储具有更好的IO效率(压缩,数据函数,裁缝)以及CPU和CPU DueCalhe友好,因此必须使用最极端的分析性能来使用专栏文章的存储,以及由索引准确性引起的索引准确性问题由列存储中的索引引起的确定它不能成为TP场景的存储格式。必须使用它来弥补DRAM低阅读延迟的低端存储更新效率的问题。因此,在低延迟在线交易处理和高性能实时数据分析的前提下,混合存储与内存结合是唯一的解决方案。
与以上三种方法相比,从构建块的组合到不同的设计方法再到集成存储的集成等级,其集成越来越高,用户的体验越来越好。工程大于一个。基本软件的作用是将复杂性留给用户,因此集成方式与技术发展趋势一致。
Polardb MySQL能力堆栈类似于开源MySQL,该堆栈比TP更长,但AP功能较弱。由于PolardB提供了最大的单个实例100TB的存储容量,其交易处理能力远远超过了用户的自行构建的mysql。PolardB用户倾向于在单个情况下存储更多数据,同时在这些数据上运行一些复杂的汇总查询。在Polardb的写作和多阅读体系结构的帮助下,用户可以增加运行的读取ro节点复杂和读取的查询,从而避免了TP负载上的分析查询的干扰。
1 MySQL在AP场景中的架构缺陷
MySQL的实现体系结构在执行复杂查询时的性能不佳。与专用OLAP系统相比,其性能瓶颈反映了多个方面:
2 Polardb平行查询突破CPU瓶颈
Polardb团队开发的并行查询可以自动启动并行执行,当查询数据量达到一定的阈值。总线的夏季,最终线程将被带回用户以提高查询的效率。
并行查询的添加使Polardb突破了单核执行性能的限制。使用多核CPU的并行处理功能,PolardB上的一些SQL查询及时进入了索引级别。
3为什么我们需要专栏店
并行执行框架突破了CPU扩展能力的限制,带来了显着的性能提高。但是,由于行储存和划船执行器的效率限制,单核执行性能具有上限,其峰值性能仍然是gapd gapd up up借助专用的OLAP系统。为了进一步提高PolardB MySQL的分析性能,我们需要介绍专栏作家存储:
PolardB内存列索引功能将列存储和内存计算功能带到PolardB,使用户可以在一组PolardB数据库上运行TP和AP-Type Hybrid Load。在确保现有的Poladeb出色的OLTP性能的同时,它显着很大。CreasePolardb在大数据上的复杂查询性能。
Inmiry列索引使用混合存储技术的等级,同时根据共享存储,单阅读 - 读取架构功能组合PolardB,其中包含以下关键技术创新点:
几种关键技术将Polardb结合在一起一个真实的HTAP数据库系统,该系统可以在与行业中最重要的商业数据库系统(例如Oracle/SQL Server)相同的级别上运行复杂的查询。
1级别的重力
PolardB具有一组面向线的优化器组件。在引擎层增加了对清单功能的支持后,需要增强此部分。优化器需要能够确定应安排查询以安排到存储执行或存款执行。我们通过一组白色列表机制和执行成本计算框架完成此任务。系统确保支持的SQL加速,与此同时,它与不支持操作的SQL兼容。
如何实现100%MySQL兼容性
我们可以通过一组白色列表机制实现兼容性目标。使用白色列表机制的使用是基于以下考虑的。第一点考虑了系统可用资源(主要是内存)的限制。通常,它不会在所有表上创建列索引。当列中需要使用查询语句时,存在。第二,我们完全重写了一组SQL执行引擎,包括所有物理执行操作员和表达式计算。目前发出的SQL包含一些IMCI执行引擎,而操作员或列类型无法支持,必须识别和拦截并切换保留执行。
查询计划转换
计划转换的目的是转换MySQL的本机逻辑执行计划,以表达IMCI的逻辑计划。生成IMCI逻辑计划后,将通过一轮优化过程生成物理计划。计划转换方法简单而直接。它只需要穿越该执行计划树即可。AST AST AST优化AST被转换为IMCI,以使用相关操作员位节点的树结构。这是一个相对直接的翻译过程。在此过程中,还有一些额外的东西,例如隐藏转换的类型,与MySQL柔性类型系统兼容。
考虑到混合执行的两个等级的优化器
有两组在线和存储中的执行引擎。在选择执行计划时,优化器具有更多选择。除了PolardB中本机MySQL的存储串行执行外,还有一个可以发挥多核计算功率的Paralle查询函数。因此,实际的优化器将在1)中执行串行执行,以执行IMCI.in.in的三个选项。当前迭代阶段,优化器遵循以下过程:
以上策略是基于这样的判断。从性能的比较,存储串行执行<t行执行<imci。从SQL兼容性的角度来看,IMCI <lingle和Parallel Execution <餐厅执行。但是,实际情况将更加复杂。例如,在某些情况下,基于存储索引的有序索引索引的并行索引将低于基于列表的排序合并join.implement。
2个执行引擎面向专栏作家存储
IMCI执行引擎是一种面向集合的优化,完全独立于现有的MySQL行执行器。重写执行器的目的是在执行分析SQL时消除现有的存储执行引擎。一个密钥瓶颈点:虚拟函数访问访问开销是由访问引起的,并且无法并行执行。
支持批处理并行操作员
IMCI执行器引擎使用经典的火山模型,但使用存储和矢量执行来提高执行性能。
在火山模型中,在与SQL生成的语法树相对应的关系代数中,每个操作都将被抽象成操作员。执行引擎将将整个SQL构建到操作员树中,并从顶部从顶部向下到顶部的Next()接口。从底部将数据从底部提取。此方法的优点是其计算模型简单而直接,通过将不同的物理操作员抽象到迭代器中。每个操作员仅关心其自身的逻辑,从而减少每个操作员之间的耦合,这更容易编写逻辑正确的执行引擎。
方向执行解决了单核执行效率的问题,并且与传统的MySQL行执行相比,两者的组合增加了IMCI执行的速度。
SIMD定向计算加速度
在AP型方案中,SQL通常包含许多涉及一个或多个值/运算符/函数的计算过程,这些过程都是表达式计算的类别。表达式的值是计算密集型任务,因此计算效率的计算效率表达是影响整体性能的关键因素。
传统MySQL的表达式计算系统使用一行作为单元作为单元,通常称为迭代器模型实现。由于迭代器正在抽象整个表,因此整个表达式被实现为树状的结构。实际上,当前的代码易于理解,整个处理过程非常清楚。
但是,这种抽象将同时带来性能损失,因为在迭代迭代器的过程中,每条数据行的采集将导致多层次函数调用。同时,获得数据将带来太多的I/O,对缓存不友好。MYSQL使用树状迭代器模型,该模型受到存储引擎访问方法的限制,这使得很难优化复杂的逻辑计算。
在列格式中,由于每列的数据是单独存储的,因此它涉及特定列上的表达计算过程,可以分批执行。对于每个计算表达式,其输入和输出基于批处理。在批处理的处理模式下,可以使用SIMD指令加速计算过程。新表达式系统中有两个关键优化:
3支持混合存储的存储引擎
事务型应用程序和分析应用对存储引擎的要求非常不同。前者要求索引准确地定位每条线并支持有效的添加,删除和修改,后者需要支持有效的批次扫描。设计要求是完全不同的,有时甚至是矛盾的。
因此,设计集成的存储引擎可以同时为OLTP和OLAP负载提供服务。目前,只有少数大型HTAP存储引擎制造商做得很好,例如Oracle(内存列存储)/SQL Server(在内存列索引中)/db2(blu)。
集成的HTAP存储引擎通常使用混合存储方案,即在引擎中,有一个行存款和列表,同时,存储服务为TP,并且列表服务是AP.Com。OLTP数据库以及一组OLAP数据库以满足业务需求,单个HTAP引擎具有以下优势:
Polardb使用类似于商业数据库(例如Oracle/SQL Server)的混合存储技术。我们称其为内存列索引:
实现混合的存储引擎技术非常困难,但是为成熟的OLTP负载优化的存储引擎(例如InnoDB)添加列支持,并面临不同的情况:
上述条件可以描述为有利和不利的条件,这也影响了PolardB混合储存的设计。
表达索引列表
在MySQL插件的架构下,存储引擎框架的最简单解决方案是实现单独的存储引擎,例如Inforbright和Marinadb的Collasstore.polardb。Polardb采用了实现第二级索引的解决方案作为InnoDB,主要基于以下考虑:
如上图所示,所有主要索引和次级索引均在poladeb中实现为B+树。索引是索引的定义,但实际上它是用于捕获加法和删除和修改的虚拟索引索引覆盖列的
对于上表的主表(主索引),它包含(C1,C2,C3,C4,C5)5列,而Seconary索引索引包含(C2,C1)的两列。在普通的第二级索引中,C2和C1代码将其存储在B+Tree中。在它们中,存储索引包含(C2,C3,C4)的三列。当实际的物理存储时,三列将被拆分并独立存储,每个列将按书面顺序转换为列格式。
列表作为第二级索引的另一个优点是,执行器的项目非常简单。在MySQL中,已经存在覆盖索引的概念,也就是说,查询所需的列存储在第二级索引中,可以在第二个级别的索引中直接用于usethe数据,满足查询需求。使用第二级索引可以大大减少使用主要索引的数据读数并改善查询性能。查询所需的列被列覆盖时,可以使用列的加速度效果,并且可以使用。查询性能可以改善数十次甚至数百次。
线数据组织
对于ColumnIndex中的每一列,其存储空间使用无序和添加的格式,并结合了标记 - 填充和后端紧凑型,以实现空间回收。具体的实现具有以下关键点:
一方面,该数据组织方法符合分析查询的要求,根据列批次扫描过滤。另一方面,对TP型交易的影响非常小。写作操作只需要根据添加而写入内存。删除操作只需要设置一个删除标记。更新操作是一个删除额外写入的标记。存款可以实现交易级别的更新,这几乎不会影响OLTP的性能。
完整和增量的行传输
旋转操作将在两种情况下进行。第一种情况是使用DDL语句在某些列上创建列索引(通常对现有表有新的分析)。目前,此时需要扫描整个表格。DATA创建索引。另一个情况是事务操作过程中的真实时间。
对于完整表旋转的情况,我们使用并行扫描方法来扫描InnoDB的主要键,并将涉及的所有过渡转换为列表表格。在线DDL流程不会阻止在线业务的运营。
在一张表上建立列索引后,所有更新交易将同时更新以存储和存储数据以确保两者事务的一致性。下面的图显示了IMCI函数关闭和打开之间的差异。当IMCI函数未转动时ON,交易将首先锁定,然后修改数据页面。在提交交易之前,将一次记录所有锁的记录。打开IMCI函数后,事务系统将创建列更新缓存。在修改所有数据页面时,将记录所涉及的清单的修订操作。在提交交易之前,更新缓存将应用于列列stocking系统。
通过此实现,存储存储提供与存储相同的交易隔离级别。对于每个写作操作,RowGroup中的每一行记录了该行的事务号,并且将记录每个标签删除操作的设置操作的事务号在编写交易号和删除交易号的帮助下,AP型查询可以以非常轻巧的方式获得全局一致性快照。
Lenito的粗糙索引
从上述列中的存储格式可以看出,IMCI中的所有数据包都使用无序和其他写作方式,因此它无法准确过滤不符合要求的数据,因为Innodb.in的普通有序索引,我们使用统计信息来过滤数据块,以降低数据访问的单位价格。
基于统计信息的粗糙索引解决方案不太友好地查询一些需要准确找到的数据。但是,在混合存储引擎中,只需要加速索引来加速涉及大量数据扫描的查询。在这种情况下使用列将具有显着优势。对于仅访问少量数据的SQL,优化器通常会根据成本模型计算解决方案,以获得较低的成本。
TP和AP资源隔离等级的排名混合存储
Polardb混合存储可以在一个实例中支持AP -Type查询和TP查询。但是,许多企业具有较高的OLTP负载,突然的OLAP负载可能会干扰TP业务的响应延迟。因此,支撑载荷隔离是必须是一项必须是的功能在HTAP数据库中支持。在PolardB的多阅读体系结构中,我们可以非常方便地隔离AP负载和TP负载。在PolardB的技术体系结构中,我们有以下部署方法:
除了上述部署体系结构外,不同的资源局隔离。在PolardB中,需要在并行执行(自动DOP)中使用一些大型查询动态和并行调整(自动DOP),将全面考虑当前系统的负载和当前系统的负载和可用的CPU和内存资源,以限制单个查询用于避免的资源,而单个查询消耗了太多资源,这会影响其他请求的处理。
为了验证IMCI技术的效果,我们在同一场景中同时进行了Polardb mysql imci的TPC -H场景测试,它将其与原始的MySQL存储执行引擎和当前的OLAP Engine Enter进行了比较。- 单元 - 机器性能clickhouse。简要介绍了测试参数如下:
1 polardb imci vs mysql系列
在TPC-H场景中,所有22个查询,IMCI处理延迟相对较数十倍至数百倍加速效应。Q6效应接近400次。它反映了IMCI的巨大优势。
2 Polardb IMCI vs Clickhouse
当比较当前社区中最热门的分析数据库陈词滥调时,IMCI在TPC-H场景中的性能基本上与其相同。某些SQL的处理延迟具有其自己的优势和缺点。用户可以使用IMCI替换IMCIClickhouse及其数据管理更加方便。
未来的工作
IMCI是迈向数据分析市场的第一步。它不会停止迭代步骤。在以下方向上,我们将进一步研究和探索以下方向,为客户带来更好的体验:
作者|北建筑物来源|阿里技术公共帐户