前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Polardb X-engine 如何服务巨量数据情况下的业务 (翻译)- 3

Polardb X-engine 如何服务巨量数据情况下的业务 (翻译)- 3

作者头像
AustinDatabases
发布2024-03-12 09:12:54
800
发布2024-03-12 09:12:54
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

详细设计,这里我们将详细的说梦x-engine 如何处理事务,并介绍x-engine的关键组件的详细设计,包含读路径,写路径,刷新和数据压缩处理,x-Engine应用MVCC 和2PL ,实现SI 快照隔离和RC 读已提交的隔离级别,以保证事务的ACID属性,同一个记录的不同版本已自增版本的ID为分离的元祖存储,每个传入的事务使用它看到的LSN作为快照,事务只读取小于自己LSN的最大版本的元祖,并为每个写入的元祖添加航所已规避写冲突。

shan上图显示了X-Engine中处理事务的过程,这个过程包含了读写阶段的提交阶段,事务的所有读请求都在读写阶段通过访问LSM树的读路径提供服务阶段。在这个阶段,事务中药插入或更新的记录被事务缓冲区,在提交阶段将事务缓冲区中的记录写入存储的任务分发器,将这些数据分发到多个写任务队列中,引入了多级管道来处理这些写任务,并将其插入到LSM树中,在这个阶段,事务中要插入或更新的记录被写入事务缓冲区。接下来,在提交阶段,将从事务缓冲区将记录写入存储的任务分发到多个写任务队列中。引入了多级管道来处理所有这些写任务,通过记录相应的记录并将其插入到LSM树中。我们在接下来介绍X-Engine的数据结构、读路径、写路径、刷新和压实的详细设计。

读路径:从数据结构的设计开始,包含了extent ,缓存和索引,对于每个数据结构,我们将介绍他如何在读路径中提供快速的查找。下图中显示了一个extent的结构,包含了数据块,块索引,记录以行导向的方式存储在数据块中,模式数据跟踪每个列的类型,块索引保存每个数据块的偏移量,在我们生产系统的当前部署中,我们需要将一个extent的总的大小限制在2MB,在LSM树的所有层次中都保持一致,基于电子商务中的数据高度倾斜和相关的访问模式,保持这种大小的extent可以在数据压缩期间让更多的extent 可重用,此设计还便于压缩期间进行增量缓存的体会。

我们在每个extent中存储带有版本信息的数据,来加速DDL操作,通过这样的设计将在新的列添加到表中,我们只需要做的是对具有新版本的新的extent的部分更新此列,而无需修改任何吸纳有的extent,当查询读取具有不同版本模式的extent,他将更新为最新版的extent并且将新的特性写入到就模式中,这种快速DDL特性对于在线电子商务属性的企业非常重要,他们经常要根据需求的变化来调整数据库模式的设计。

在缓存中上图也说明了,我们针对点查找进行了缓存优化,这是阿里巴巴对于电子商务中的大部分查询处理方式,行缓存使用了散列来缓冲记录,在缓存命中是可以快速返回结果,缓存大小是根据可用的内存大小和查询负载进行动态调整,同时我们还使用BLOOM过滤器来加速在缓存中记录的查找,BLOOM过滤器可以快速确定某个键是否可能在缓存中,从而避免了对底层存储的访问,缓存还可以减少对存储的访问,提供更低的延迟和更高的吞吐量。

同时上图,还展示了X-Engine 中的数据库缓存,,针对点查询进行了缓存方面的优化,行缓存使用LRU缓存替换策略来缓冲记录,不管记录位于LSM TREE 的那层,只要查询访问记录,即使位于最大层级的记录,也可以被缓存,一旦查找未命中的内存表,查询的键将通过哈希算法映射到行缓存中相应的槽位进行匹配,对于点查询,从行缓存中检索记录只需要话费O(1)的时间,当随机访问记录时,行缓存的影响较小。

我们只在行缓存中保留最新版本的记录,这些记录由于时间局部性有最大的访问机会。为了实现这一点,在刷新期间,我们用新版本的记录替换行缓存中的旧版本,从而减少可能由刷新引起的缓存未命中。

块缓存以数据块为单位缓冲数据。它为未命中行缓存的请求或范围查询的查找提供服务。表缓存包含引导到相应extent的子表头的元数据信息。找到extent后,我们使用Bloom过滤器来过滤出不匹配的键。然后,我们搜索索引块以定位记录,并最终从其数据块中检索出来。

这些缓存对于减少记录温度变化后的缓存未命中非常重要。由于记录的空间局部性,行缓存中的新出现的热记录和现有记录可能来自同一个extent或甚至同一个数据块。因此,表和块缓存有助于在缓存未命中后增加整体缓存命中率,并可能有助于减少行缓存中替换的延迟。

上图展示了X-Engine中多版本源数据库索引的结构,每个字表的LSM-TREE 都有其关联的园数据库索引,他从根节点开始,索引的每次修改都会创建一个新的元数据快照,该快照只想所有关联的层次和内存表,而不修改现有的源数据库快照的节点。上图中extent最初是level0的一部分并且被缓存,当服用extent的压缩完成时,将在Metasnapshot的旁边创建一个新的metasnapshot+1 ,该Metasnapshot+1指向新合并的Level1,level1的元数据秩序员指向extent, 这里并未在磁盘中移动数据,从而保留了所有缓存内容的完整性,利用这种鞋时复制方法,事务可以以制度的方式访问他们想要的任何版本,而无需再数据访问期间锁定索引,我们使用垃圾回收来删除过时的元数据快照,其他存储引擎也探讨过类似的设计。

增量缓存体会在LSM-TREE中,当一个压缩操作合并了磁盘上的许多extent时,往往会导致大量的缓存驱逐的批量操作,降低了查找缓存命中率,从而导致性能明显下降和相应的时间不稳定,即使缓存记录的值不发生变化,如果其 extent 与参与压缩的其他的extent存在重叠的键范围,他们也可以在磁盘上移动位置。未解决这个问题我们提出了增量缓存替换法,在压缩的过程我们检查将要合并的extent的数据块是否已经缓存,如果是的话,我们讲魂村中的旧块替换为相同位置上的新合并块,而不是简单的将所有旧的块驱逐出缓存,这种方法通过在块缓存中保持一些块的更新和块不移动减少缓存未命中的次数。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档