分布式事务与数据分区 | 学习笔记

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 快速学习分布式事务与数据分区

开发者学堂课程【PolarDB-X 开源人才初级认证培训课程分布式事务与数据分区学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/1075/detail/15545


分布式事务与数据分区


内容介绍:

一、前景提要

二、分布式事务

三、数据分区

 

一、前景提要

PolarDB-X 是一个支持计算存储水平扩展数据高可用基于存储计算shared-nothing架构和一致性复制协议的分布式数据库定义分为两部分第一部分是支持计算和存储能力的水平扩展数据高可用是从用户的角度表达一个用户对分布式数据处的需求存储计算分离shared-nothing架构和一致性复制协议是PolarDB-X为实现需求所采用的系统架构

其中一致性的处置协议主要解决的是数据高可用的问题是明天分享的主要内容。

存储计算分离和shared-nothing架构是PolarDB-X为了提供水平扩展能力与单数据库相比增加的两个新的设计第一个是资源层面的设计也就是将集群内的节点分为计算节点数据节点两类成为存储计算分离

其中计算节点是无状态节点通过增加计算节点提供算力的水平扩展能力第二个是数据层面的设计将数据按照分区切分为多个分区通过将分区迁移到新增的数据节点上提供存储容量水平扩展能力由于分后节点之间不再需要共享存储资源也被称为shared-nothing架构,关于PolarDB-X在分布式事务和数据分区方面的探索分享分布式事务和数据分区一方面分布式数据库中比较关心的两个话题另外一方面分布式数据库本身也是一个数据库用单机数据库一样数据库有两个强需求,第一个强需求希望数据库能够支持事务第二个强需求叫做希望数据库能够支持sql,分布式数据库由于它在架构上的不同特别是引入shared-nothing架构之后对于事务的设计以及对于sql里面查询的设计都有很大的影响分享的两部分内容就是在采用shared-nothing架构之后分布式数据库PolarDB-X是如何解决事务方面的问题以及解决查询方面的问题就是分布式事务和数据分区方面的特殊设计

image.png

 

二、分布式事务

1、数据库是用于存储数据的系统使用数据库最主要的需求就是读写数据设计良数据库尽可能屏蔽底层的实现类比就像去银行最主要的目的是存钱和取钱不关心银行柜台后面到底发生什事情数据库本身是一个非常复杂的系统经常要面对各种各样的复杂的情况比如可能由于数据库本身的代码问题或者由于硬件故障可能导致数据库在写入数据的任何阶段意外的崩溃客户端的应用程序在一系列连续操作中会突然的退出并且为提高吞吐量通常要允许多个客户端去并发的修改同一条记录类似复杂的情况还有非常多当复杂情况出现的时候特别出现异常的时候数据库需要保证失败的操作不会导致数据问题并且还要引导用户继续完成业务需求需要有一个关于数据可靠性的保证用户按照保证或者约定使用数据库就可以规避一些数据上的问题,事务就是关于数据可靠性的一个保证数据库提供给用户关于如何保证数据可靠性的约定具体事务的定义是一组用表达业务含义的读写操作满足acid特性

image.png 

转账例子,事务里面包含四条语句,第一行begin和最后一行的commit圈定事务的范围事务中包含两个update的语句第一条语句是在account表上id为alice的账户减30第二条id为bob的账户加30表达alice向bob转账30的业务语义对于这样的事务,数据库提供acid四个方面的保障a是原子性代表如果出现异常用户可以通过从事整个事务解决问题不需要担心失败的事务会对数据产生影响C是一致性代表用户不需要担心数据操作会违反预定的约束比如会违反唯一约束和违反外键。i是隔离性代表用户可以认为只有自己的操作数据库不需要担心多个客户端并发可能会产生一些数据方面的异常

D是持久性代表一旦事务提交成功用户就不再需要担心事务产生的变更会因为其他异常而丢失事务的抽象以后可以认为存储是非常可靠的事务只要提交数据就一定不会丢失

2、四个特性里面和分布式事务相关比较强的是原子性和隔离性原子性强调的是事务提交后,事务的变更必须一起生效比如事务1提交后必须是alice账户减30并且bob账户加30不能出现alice减30而bob没加或者alice加30,bob没减的情况

隔离性强调的是多个数并发执行的时候数据库执行结果看起像是没有并发一样数据库可能按照任意顺序收到事务1和事物2的四条update,但执行结果应该看起像是先执行事务一再执行事务二或者是先执行的事务二再执行事务一如果事务一和事务二按照一个先一个后的执行方式看到的账户里面的总额最后一定是206如果隔离性出现问题,alice是按照转账后的值进行派而bob是按照转账前的值派息,违反隔离性的一种表现

3、在分布式事务中由于存在多个分区原子性和隔离性都是需要重新实现可能是因为本身实现的复杂性或者新的实现可能导致性能下降,2000年前后出现的nosql系统不支持跨分片事务,缺少跨分片事务是不符合用户的使用习惯google也在论文里面总结到发现许多工程师将过多的精力放在处理数据的一致性上原本封装在数据库内部的逻辑溢出到应用代码中所以大幅的提高应用代码的复杂度所以到2010年市面上出现的OLTP类的分布数据库将分布式事务作为一个B选项分布式事务为保证原子性和隔离性都需要做哪些工作image.png

4单分片上的原子性是由日志保证的在写入每条数据的时候首先记录一个回滚日志遇到事务的异常就通过日志将数据恢复到先前的版本对于跨分片数在单片事务的基础之上还需要协调所有分区在提交阶段的行为保证一起提交或者一起回滚,事物1的转账为例收到用户的commit请求之后如果cn直接向每一个分片都下发一个commit语句可能会出现分片1已经提交成功但是分片2二发现有异常,直接分配事务回的情况此时整个分布式事务是已经失败但是分片一上的数据无法回滚,产生不一致业界通常使用两阶段提交协议解决问题把参与的几个节点分成两种角色包括协调者和参与者协调者是负责判断事物是否能够继续提交的一个角色PolarDB-X中使用计算节点作为协调者参与者代表是分布式事务涉及的数据节点提交过程的第一个阶段称为prepare,当收到用户的请求首先进入prepare阶段协调者会询问每个事务的参与者,分支事物是不是能够提交事务参与者执行一些校验或者写入日志之后的操作如果发现能够提交,它们就会返回ok协调者收到所有ok之后就认为完成可以进入提交阶段进入第二个阶段commit阶段,协调者会通知每一个参与者所有的分支都已经具备提交条件所以可以继续提交和一阶段一样所有的参率者完成提交后返回一个ok最后协调者确认所有参与者都完成提交之后就可以告知用户分布式事务完成在一阶段prepare阶段成功之后通常会保存一条日志记录一阶段已经完成可以进入二阶段,记录日志的目的如果在进入二阶段之前协调者出现crash出现宕机重启之后依然可以根据日志判断事务是否成功如果成功可以继续提交如果没有成功可以把它回滚掉如果有一个参与者失败会是什样的情况

5、prepare阶段依然是协调者首先询问每一个参与者是否能够提交有一个分片返回失败于是在第二阶段协调者要通知所有参与者回滚事务,收到参与者的重复回复之后告知用户事物在提交的时候发生失败已经自动回滚掉,是现在业界最为常用的解决原子性提交的两阶段提交解议两阶段提交协议本身是一个协议在工程实现上最常见的实现有percolatorxa两个实现,percolator本身在提交阶段延迟比较高而且只会在提交阶段汇报写入冲突而且主要是支持乐观的场景与传统的关系流数据布局悲观的模型有比较大的区别因此PolarDB-X选择通过Xa协议实现两阶段提交。分布式事务在保障原子性方面选择的技术方案

image.png

6、在隔离性上做处理单分片事务上是如何保障隔离性保障隔离性目前基本上所有的数据库在做单分片事务的时候都会采用MVCC的方案MVCC全称是版本并控制当有数据写入到表中的时候更新alice和bob的的账户alice的账户余额设置为70将bob的账户余额设置为130

image.png

在做操作的时候数据库会将老的数据就是在他们转账之前各自账户都是100元的数据会为它生成一个历史版本的快照并且把每一行数据快照和写入每一行数据的ID进行关联当有一个事务要读取数据的时候,会首先根据每一行记录上的事务ID看事务是否提交如果没有提交的事务,它会认为数据一定足够用,所以可以沿着版本往前找到一条已经提交的事务找到一条已经提交的事务的写入的数据之后它又会根据自己的事务id和数据上的事务id做一个对比判断数据是在事务开始之前写入还是在开始之后写入如果是在开始之前能看见如果是在开始之后就看不见版本所以就可以达到确定数据到底是不是可见,mvcc并发控制协议的好处是解决写和读并发的情况,231号事物更清alicebob账户的事务没有提交但是事物ID为220的事物依然可以继续读历史版本达到一个比较好的并发度因为不关心还没有提交的数据所以直接用一个历史的数据接着做下面要做的事情所以就是为什所有单机数据库上,或者分布式数据也是一样都支持基于mvcc实现,在单根片上通过MvCC加事物ID已经实现隔离性到分布式事务,当引入多个分区的情况下需要做哪些改进最主要的一点原先采用的事物ID它是在单个分片上进行分配现在有多个分片有多个分区就需要有全局的统一分配事务ID的地方或者采取时间排序的方式需要有一个唯一的地方获取获取时间,获取事务id,获取用于判断是不是可以看见数据的版本号业界目前有两种方案一种还是像单机数据库一样基于一个活跃事务列表GTF区别在于把分发事务ID的地点从每个分片上去挪到一个公共的服务上每次读写事务开始和写事务提交的时候都会去活跃事务列表里面做更新读取方案对GTM本身的压力比较大它会非常依赖中心化的数据管理器相对比较容易出现系统瓶颈因此PolarDB-X选择另外一种方案也就是基于TSO的mvCC方案支持隔离性对于读写的操作都有一定的改变在数据写入的过程中依然是两阶段提交但是在一阶段结束之后会读取一个提交时间戳把提交时间在commit阶段下发到每个分片上将提交时间戳和数据关联到一起一阶段的日志在每一个分片上都保留一张事务的日志表一阶段的日志就会根据一个写的是哪个分片就会把日志落在哪个分片上如果出现cn的宕机恢复会扫描所有分片上的输入日志看有哪些事务是在上一次宕机的时候处于一阶段结束二阶段还没有开始的情况进一步推进它的提交和回滚隔离性在数据写方面的影响就是在提交之前要获取提交时间戳在数据读取的时候同样也要获取一个时间戳主要是用判断数据是否可见过程就变为首先TSO服务,又叫GMS服务,在上面获取时间戳作为自己的snapshot timestamp和数据相关的数据上的时间戳做对比,如果时间比数据时间戳的大并且它所属的事务已经提交掉认为数据应该是能看见的反之如果没有提交或者时间戳比它要小数据就不应该被看到PolarDB-X在实现分布式事务隔离性方面所做的一些设计

image.png

7、PolarDB-X上的分布式事务开启之后首先会向TSO获取一个sstart_ts作为读的快照,开始接受用户所有的请求过程中根据对应的事务状态和拍照时间戳对数据和对应的提交时间戳,判断数据是否可见保证隔离性在节点提交的过程中还采取方案首先是通知所有参与企业操作的分区执行prepare,记录事务的状态最后通知所有的提交者进行提交在两阶段提交的记录输入状态成功之前就是记录事务状态为提交阶段一步骤之前所有产生的异常都会产生事务回滚,导致原采用2pc和TSO+mvcc方案实现分布式事务经常被质疑的问题提交阶段会增加延迟因为毕竟以前提交一步就完成现在变成两步另外一个问题是tso会不会也存在单点因为有两个地方都需要从tso上获取一个时间针对两个问题,PolarDB-X都进行工程上的优化首先是对两阶段提交的优化,两阶段提交由于增加prepare阶段它的提交延迟肯定会高于单分片事务,但是在实际上对于单分区事务无论是否划分区依然是可以采用一阶段提交保障原子性PolarDB-X支持自动识情况减少此类场景下的提交延迟。另外一个问题是Tso方案由于采用斑点授值,一个潜在的问题是可能存在单点故障和单点性能瓶颈的风险PolarDB-X的GMS是部署在三节点的集群上所以首先通过x-paxos协议保证服务的可用同时PolarDB-X多种场景进行优化使得拆分开条件的检查点写可以不依赖GMS,d提升查询性能同时也降低GMS的压力另外对于单个CN进程默认采取的plan方式将同一时间内发生的多个tso请求合并为获取操作很多事务可能在并发进行在任意卡一个时间点可能都会有一批事务在等待获取同时间戳或者提交时间戳把一批获取时间操作合并成一个web操作通过一个自定义的指令发送给TSO服务一次性的获取到需要的所有的时间戳,进一步保证CN和GMS之间交互的指令包不会太多避免GM成为系统瓶颈。

8分布式事务需要在原子性和隔离性方面做一些改造PolarDB-X采用的是2PC加TSO和MvCC的方案解决问题同时对于2PC和TSO本身可能存在的一些问题工程上的的优化展示flashback query的例子,事务里面隔离性采取MvCC方案,它会把历史的版本采取一个列表的方式记录下来,可以通过在查询中指定时间戳的方式看到历史版本里面的数据。首先登录PolarDB-X数据库实例在数据库中已经创建两张测试查看表结构,account和user表都是默认使用主键拆分的分区表,向两张表中数据,查看插入结果,目前有alice和bob两个账号,并且他们的账户余额都是100块钱记录当前的时间点,进行一些写入操作首先是一个转账测试,alice向bob转账30块钱,新增一个名为tom的账户,查看目前表中的数据情况,包含三个账户,并且alice和bob发生过一次转账,使用flashback query语法可以查询数据库中的历史版本,通过记录的时间戳,可以查询到更新数据之前的版本,可以看到更新数据之前是两个账户,且他们账户里面都只有一百块钱。

image.png

As of语法同样可以使用再join当中,可以为join的其中的一张表指定时间戳,而另外一张表不指定,对user表指定时间戳,而account表不使用,预期看到的效果就是alice和bob发生了转账,但是tom的账户并没有插入到表中,flashback query语法最重要的一个用途是帮助用户恢复误删的数据,模拟记录当前的时间戳,删除account表中过的数据,通过insert select的语句再select中指定删除前的时间点,将历史版本的数据重新写回到表中,查看一下表中的数据,可以看到之前被删除的数据又恢复回来。

image.png


三、数据分区

1、数据分区,当采用shared-nothing架构将数据全部按照分区进行分区之后它对数据的查询有一定影响。影响是什么?解决方案是什么?

2有一张按照组件id做分区的一张表,t1表就是id,当提供查询是id上的等值条件的时候对于id=14等值计算出id的哈希值,可以知道数据在p3分区上问题是如果要按照内部的条件查该怎粗略的看起只能把所有的区都扫描一遍代价就变高数据库是如何解决问题mysql中同样的表结构实际上是b+树,按照主键id有序当按照id进行查询的时候实际上数据会在b+做二分查找,从而快速的定位到数据所在的叶子节点,同样当以内部节点进行查询的时候就没有办法做二分查到只能从头到尾将整个b+树垫底,代价比较高它也有一个专门的名字叫做全表扫描,mysql中为避免全表扫描通常会在内容上创建一个索引,索引就是创建另外一个b+树,按照内部进行排序在它的所有的叶子节点中包含内部对应的主键id值,等于name上的主键查询,数据库会先在二级索引上进行阿帕奇,在b+树上进行二分查找,找到对应的id之后,再用id回到主键的b+树上进行查找,回找操作,二级索引的思路属于计算机里面比较常见的思路,就是一个典型的空间换时间的思维,在mysql中设计主键的时候通常只需要考虑它在业务上是唯一的并不用太多的在意主键是不是包含在所有的查询条件中,因为在mysql上创建索引的成本非常低,查询里面有什么条件,都可以按照条件创建一个索引可能也成为使用单数据库的固定思路没有太大问题分布式数据在按照主键拆分之后按照name列进行查询避免全表扫描参考空间换时间的思路name分区键,再将数据做一份冗余,将name映射到能主键id,可以达到索引同样的效果冗余的数据就称为全局二级索引全局的意思是索引的数据和主表的数据并没有保存在同一个分片上通常是因为拆分维度的不同按照name拆和按照ID拆会保存在不同的分区上了全局二级索引之后按照name等于megan进行查询的时候先通过全局二级索引定位到megan所在的分片找到megan的id值,到主表上查到整条记录所在的分区和单机上是一样的也称为回表把分布式数据库上创建全局二级索引的代价使用体验和单机数据库上过程比较接近也可以像使用单机数据库的时候一样不太关心分区键,所以如何实现全局索引是一个非常关键的点

3通过一个全局索引优化查询性能的例子实际感受PolarDB-X全局二级索引大概做成什样子。登陆一个PolarDB-X数据实例,创建测试使用的数据库,使用sysbench脚本创建测试使用的表和填充数据,测试脚本经过修改,会显示使用的建表语句,可以看到是一个采用mysql原生语法的建表语句,查看建表结果,默认以主键id作为分区键,表包含16个分区,表中包含一万条数据,均匀分布在16个分片上,进行查询测试,首先是主键上的点查,查询当中包含了主键上的等值条件,可以看到查询性能非常不错,通过explain语法查看一下执行计划,由于包含了分区键上的等值条件,整个查询可以路由到一个具体的分片上,所以查询性能非常的好,如果不包含分区键上的等值条件会是什么情况呢?

第二个测试用例使用k上的条件作为查询条件,将qps日志导入到一个文档中,可以在网页上查看,可以看到qps只有两千五,执行计划,由于没有包含分区键上的条件,需要扫描全部16个分片才能得到查询结果优化语句可以通过PolarDB-X提供的查询建议工具,看查询建议,优化建议是通过增加索引提升查询性能,同时给出增加索引的语句,增加索引过程是online schema change,不会阻塞查询的执行,可以看到索引加上之后,整个查询的性能得到了一个很大的提升,再看一下此时的查询计划,可以看到bkajoin代表了回表操作,整个查询的执行过程是通过索引上的拆分条件k,定位到一个索引的具体分片,从中查到需要返回的行,再回到主表上,根据主键得到所有的查询结果,对于回表操作,还可以通过PolarDB-X提供的聚簇索引来进一步优化,聚簇索引可以保证索引表和主表始终保持相同的结构,可以通过索引扫描来代替主表上的扫描,可以看到增加聚簇索引之后,整个查询性能又得到了很大的提升,基本上已经达到了最初的两千五的十倍,再看一下此时的查询计划,直接通过索引扫描就能拿到最终的结果,并且整个查询只需要扫描一个索引上的分片,经过两次增加索引之后,现在的表结构包含一个聚簇二级索引都是全局索引,各自包含了16个分片,如果用户可以确定自己的业务场景主要是以k作为查询条件,还可以通过变更区分键的方法来提升查询性能,首先删除之前创建的全局索引,可以看到查询性能立即恢复到了最初的两千五,通过分区变更语法,将分区键调整为k,可以看到调整分区键之后,查询性能又再次得到了很大的提升,查看此时的表结构,表中只包含了一个分区键k上的局部索引,并且包含了16个分片,再看一下此时的查询计划,和一开始主键拆分的情况比较类似,也是直接将查询下发到了一个具体分片,获得了比较好的性能。曲线是通过回表的全局索引,提供了一定的查询性能,增加了一个全局的聚簇索引,全局聚簇索引的区别就是聚簇索引不需要回表,进一步提高到更高的性能,把两个索引都删除掉,查询性能回到一开始的情况,再通过online schema change调整表的拆分键,使得拆分键和查询条件能对上,让查询条件再次得到很高的性能。通过全局索引优化性能满足几个特点,第一是数据是准确的,第二整个键索引和调整索引的过程都是online,键索引通过常量操作索引。

4、移动芯片是一台ECS吗不一定因为分片它本身是一个相对独立的概念可以多个分片落在同一台DN上也可以一个分片落在一个dn上,没有强制绑定。

5一个可以有多个聚簇索引,PolarDB-X设计上可以有多个聚簇索引。

6、对于全局索引,最高评价如果能够使用体验和mysql中的索引一样已经是一个非常好用的场景

 

MySQL中的索引

不透明的“全局索引”

一致性

强一致

最终一致、弱一致、XX一致

创建方式

DDL语句

第三方工具,订阅BINLOG

使用方式

优化器自动选择

手动选择

兼容其他DDL

支持

不支持

前缀查询

支持

不支持

BigKey

无太大影响

单节点瓶颈

MySQL中的索引是强一致,不会有延迟,不会有不一致,计全局索引如果采用最终一致,弱一致或者其他各种一致都不是一个非常透明的设计用户在使用索引的时候都需要思考很多问题不是一个很好的选择PolarDB-X的全局索引采取的就是强一致的方案,因为PolarDB-X支持强一致事务,可以通过分布式事务保证图表里的数据的强一致。

7、创建过程中不会阻塞用户的读写分布式事务中要实现online schema change主要的挑战是schema变更过程中不同的CN节点上的事务,看到的元数据的版本可能是不一致的,PolarDB-X取存储计算分离的一个架构CN节点和DN节点是独立的CN节点状态可以水平扩展可以有很多的CN节点当要让CN节点加载一个数据由于网络延迟或者通知上的延迟先后顺序不同CN加载新版本的顺序不少会有时间差,时间差可能很细微但是它有可能带来数据不一致的风险

image.png

图上两个CN左侧的CN叫做CN0,右侧的CN叫做CN1,考虑现在添加一个全局索引,索引基本的物理结构已经准备好通知CN节点,新来的读写请求,需要考虑维护索引的搭配一致,因为通知的先后区别可能CN0已经知道全局索引的存在但是CN1还不知道d全局索引的存在CN0上收到一个请求由于知道全局索引的存在,它会把数据在主表上写一条在索引表上也写一条没问题问题出现在CN1并不知道有全局索引这时候又收到对数据进行delate操作时候有问题因为它不知道全局索引的存在所以它只会删除表上的数据不会去删索引表索引表删除表多一条数据,会导致数据不一致不符合对索引表的强一致的要求所以同样的问题对单机数据库也存在单机数据库解决问题的办法是通过对数据加锁保证任意时刻所有事务都只能看到一个数据,mysql上比较熟悉的当加索引的时候在加索引换meta过程中会持有CN加锁使得变更数据操作是在使用老版本数据的所有事务结束之后才去进行的分布式系统不能采用这样的方式原因是由于网络延迟存在不确定性实现一个跨节点的CN加锁实现一个跨节点的锁要在每个CN上都取一把可能会由于网络延迟导致非常明显的卡顿,甚至有可能锁由于一部分CN没有响应迟迟不能完成加锁的动作有可能十个CN有一个响应卡顿导致其他九个都已经持有锁但是就是不能进入下一步的切换和解锁过程所以在分布式系统当中不能采取大锁的方式实现因为它不太符合online的定义PolarDB-X实现方法online schema change参考f1的出现,出过一篇online schema change介绍自己在f1中实现的论文具体的做法会稍微复杂一点可以参考公众号通过增加两个相互兼容的中间状态使得系统中允许同时存在两个源数据版本使得递调过程无需加锁不会堵塞读写请求,它的做法是破坏要求整个系统中只有一个数据版本的前提条件它允许有两个所以CN1拿到新版本CN1还在上一个版本如果允许情况出现就没有问题,有支撑PolarDB-X中可以非常轻松的使用create index语句创建全局索引不需要依赖任何第三方组件

8、索引创建出来,在平时的使用中对于整个表的变更也是可能会涉及到对索引的影响在各种操作中维护索引表的一致也是一项工作量比较大的内容PolarDB-X非常细致的各种ddl都设计online ddl实现根据ddl的类型可以自动选择执行方式并且能够自动的维护全局索引,虽然使用全局索引,但在ddl操作方面是没有太多的限制也是为向单数据库使用索引的体验,索引创建完成之后使用索引的时候还需要让它自动的应用在查询里面做法有手动和自动两种手动有for index或者use index的方法但是如果要求每一条查询都手动指令索引肯定不是一个非常好的体验所以PolarDB-X也支持基于CBO的自动索引选择在实现上由于索引本身也是一张表并且回表操作实际上是可以表达为索引表和主表在主键上去做一个妆,在工程实现上可以大部分的复用分区表上的估算执行计划代价的方法估算索引扫描或者索扫描加回表的执行计划代价难点在于如果两个表数做壮并且两个表各自都有自己的全局索引,它产生的执行计划空间和两个角并没有任何全局索引,有很大差异最直观的差异就是它的执行计划空间会非常的大所以要求CPU有更合理的枚举算法更合理的减支算法以及它本身的性能要更好PolarDB-X方面做很多优化详细的内容可以关注公众号里面有一些介绍的文档,总结成一句话就是PolarDB-X支持基于代价优化器并且能够自动完成索引选择。

9、分区算法本身在设计上有哪些细节的思考,希望索引能够支持前缀查询,要求分区算法本身能够提供这样的支持,当mysql上创建很多列的索引的时候,其实是把每一列索引的数据按顺序拼在一起,当只有前面几列的时候依然可以拼出前缀,再进行查找,如果分区算法默认采取的是一致性hash值的算法,如果不做特殊处理,依然是把所有数据拼在一起,做整个hash是没有办法做全局查询的,因为一部分数据的hash和整个所有列的数据hash肯定是不一样的设计就是会分别对每个列做hash,在匹配到前缀的情况下一样可以做分区裁减,相当于可以做前缀的查询

10每一个索引相当于对数据换了一个拆分维度随着拆分维度越来越多总有一两个维度会出现数据的热点把热点定义为bigkey,某个拆分维度下某一个键值的行数非常多,或者写入量非常大数据量其实不太会成为系统瓶颈要想成为系统瓶颈,一个单一的key的数据量就超过了一个单分片的容量,可能导确实存不下,单个分片上的容量,通常都在TP级别T超过Tp的数据量是比较罕见的。

常见的就是写入方面的热点在单数据库中索引不太需要考虑热点的问题,比如在性别的列上建一个索引,索引的区分度很低只有两个,写入的时候可能会有一定的争抢,但不会有太大的问题,如果是分布式数据库,如果索引只有两个值进行哈西只落在两个分区上,业务写入量比较大相当于所有的写入压力都压在这两个分区上导致整个数据库不再有数据扩展能力,不论怎么压,最后这两个分区肯定会首先成为瓶颈因此需要解决写入热点的bigkey。

PolarDB-X通过将主键和所有的key一起作为分区键解决问题当热点出现的时候还能够按照主键写入热点的分区,做进一步的分裂,从而达到消除热点目的。使用体验已经和单机数据库非常接近。

11PolarDB-X分布式数据库和别的分布式数据库不太一样的地方就是能支持将join操作下推到存储节点。下推join本身是对于tp类的业相对很大收益,t P类的业务不像aP一样join的数据越join越多,join的结果会小一到两个数量级如果能在D N上提前把join执行掉,返回的数据就会少很多,降低网络的开销。

而分布数据库里网络开销,io开销是大头,所以下推join有比较大的收益但是下推join有一定的前提条件要求要求拆分算法和分区分布必须是完全相同的两张表做join,或者一张表一张索引表或者两张索引表,只有当它们的拆分算法和分区分布完全相同的时候,支持将join下堆到存中节点上因为PolarDB-X支持分区分裂和迁移如果不对分区操作做任何限制,那就可能会出现由于分区分裂合并或者分区迁移导致两张表的分布变得不同进而导致join在下推的情况。从用户的角度会出现,当分区迁移之后,反而导致查询性能下降人困惑的场景,为了解决问题PolarDB-X在后台引入了两个新的概念叫做table group和partition group,table groupglobal index的合集,就是一组全局索引的合集系统会保证同一个table group中的索引具备相同的数据分布当发生分区的分裂合并的时候,同一个table group中所有的全局索引会一起进行分裂合并,首先保证了它数据的分区数量一致

image.png

partition group在同一个group中的global index相同区间的分组都落在一号分区的分组认为它是一个partition group,当PolarDB-X自动的将分区在不同dn之间迁移的时候,可以保证同一个partition group中的分区始终落在同一个dn通过这样的情况就可以保证同一个partition group的全区索引分区数量一样并且序号相同的分区都是落在相同的dn可以保证join操作下推,通过合理划分table group,table group默认有一个划分方法,也可以通过根据实际使用,可以确认哪些表需要下推,也可以手工的划分table group,通过合理的规划table group可以降低分区迁移操作带来的代价,PolarDB-X使用的table group和partition group用来解决全局索引,join下推优化避免分区变更操作导致join优化失效。

12PolarDB-X是一个基于存储计算分离和shared-nothing架构的分布式数据库支持数据高可用和水平扩展支持强一致分布式事务,基于2PC和TSO+MVCC,通过1PC优化降低提交延迟, TSO合并优化确保GMS不成为瓶颈。通过引入透明全局索引,良好的兼容了单机数据库上索弓的使用体验,解决了shared-nothing架构带来的跨分区查询性能下降问题

结合分布式事务和透明全局索引两项技术,将设计分区方面的优化,综合为透明分布式技术,使用这项技术尽可能的可以让用户使用单机数据库使用tps分布式数据库,PolarDB-X以分布式事务和透明全局索引为核心的透明分布式技术,能够显著降低用户使用的使用门槛

相关文章
|
21天前
|
存储 监控 算法
117_LLM训练的高效分布式策略:从数据并行到ZeRO优化
在2025年,大型语言模型(LLM)的规模已经达到了数千亿甚至数万亿参数,训练这样的庞然大物需要先进的分布式训练技术支持。本文将深入探讨LLM训练中的高效分布式策略,从基础的数据并行到最先进的ZeRO优化技术,为读者提供全面且实用的技术指南。
|
7月前
|
SQL
【YashanDB知识库】手工迁移Doris数据到崖山分布式
【YashanDB知识库】手工迁移Doris数据到崖山分布式
|
7月前
|
存储 分布式计算 负载均衡
数据分布式存储:在海量数据面前,我们如何站稳脚跟?
数据分布式存储:在海量数据面前,我们如何站稳脚跟?
1077 1
|
5月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
343 67
|
7月前
|
存储 人工智能 固态存储
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
3FS是DeepSeek开源的高性能分布式文件系统,专为AI训练和推理任务设计,提供高达6.6 TiB/s的读取吞吐量,支持强一致性保障和通用文件接口,优化AI工作负载。
1102 2
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
|
8月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
9月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
302 7
|
11月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
213 5

热门文章

最新文章