【金猿技术展】数据库子事务性能优化方法——亚信安慧AntDB让子事务“飞”起来的一种方案

01/18 15:56
阅读数 20

以下文章来源于数据猿,作者数据猿

亚信安慧技术

该技术由亚信安慧投递并参与“数据猿年度金猿策划活动——2023大数据产业年度创新技术突破榜单及奖项”评选

数据库子事务的性能优化是将磁盘文件中的父子关系交换到当前进程独占的本地内存,子事务在处理时,优先读取本地内存中缓存的事务信息,从共享内存中读取父子关系到本地的时候,以已经提交的最大xmin作为标记,保证最大xmin之前的事务已经提交;最大xmin之后的父子关系已经写入共享内存。

该技术方案通过本地内存优化数据库中子事务的处理性能,并基于xmin确保子事务优化时主库备库的数据一致性,从而实现了数据库的性能优化。基于该技术方案,在多并发场景下,子事务的处理也能够高效执行。

 

技术说明


目前,在数据库中,当数据库的子事务数量超过宏定义变量NUM_SUBTRANS_ BUFFERS子事务缓存(默认32page)指定的数量后,就发生磁盘同步。此时会产生子事务锁, 它是一把独占锁,高并发访问时就会出现性能问题(数据库后台等待事件表现为subtrans 或SubtransControlLock)。

默认子事务缓存占用32个buffer页面,每个buffer大小为8k,即子事务缓存总大小为32*8k=256k。每个事务号占用4个字节大小,则缓存中最多可存储256*1024/4=65536 个子事务。当系统中子事务数量,超出65536时,PostgreSQL将最老的已被replay的子事务号,交换到磁盘文件保存。当进程需要读取或更新子事务时,去磁盘文件查询时,必须先设置全局写锁,即SubTransCtl lock互斥锁。如图1所示,当子事务的父事务号在缓存中不存在时,则获取SubTransCtl lock互斥锁,从磁盘中读取文件到缓存后再释放互斥锁。该锁全局唯一,且顺序依次获取释放。因此,当超出子事务缓存时,PostgreSQL性能缓慢。

图1现有技术中数据库子事务的查询方式

“数据库子事务的性能优化方法”在进程第一次在共享内存中读取不到父事务号时,将磁盘文件中的父子关系交换到当前进程独占的本地内存local_cache_ subtrans。local_cache_subtrans保存在客户端连接中,即每个连接进程独享一个私有内存。子事务在处理时,优先读取本地内存中缓存的事务信息:如果找到的话,就直接使用该事务信息;如果本地内存local_cache_subtrans中缓存的事务信息不足的情况下,还是会继续读取磁盘文件中的内容。

此外,还要同时兼顾数据库的主库和备库数据的一致性。PostgreSQL内部的数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护。这就意味着每个SQL 语句看到的都只是一小段时间之前的数据快照(一个数据库版本),而不管底层数据的当前状态。这样可以保护语句不会看到可能由其他在相同数据行上执行更新的并发事务造成的不一致数据,为每一个数据库会话提供事务隔离。xmin是PostgreSQL原生存在的一个系统属性,标识插入该行版本的事务身份(事务ID)。一个行版本是一个行的一个特别版本,对一个逻辑行的每一次更新都将创建一个新的行版本。由于子事务的信息是从本地内存中进行读取,而数据库的主库和备库的本地内存是独立申请的,为了保证主库和备库的数据一致性,需要对主库和备库上的数据可见性的处理逻辑同步进行调整:从共享内存中读取父子关系到本地的时候,以已经提交的最大xmin作为标记,保证最大xmin之前的事务已经提交, 最大xmin之后的父子关系已经写入共享内存。

基于以上优化思路,数据库子事务的性能优化方法能够有效提升数据库性能,其主要流程如图2所示,包括如下步骤:

图2 数据库子事务的性能优化方法

步骤1,查询子事务的父事务号;

步骤2,判断父子关系是否存在于本地内存中,当存在时跳转至步骤10,当不存在时执行步骤3;

步骤3,查找本进程所有快照中最大的xmin;

步骤4,判断共享内存中是否存在父子关系,当不存在时执行步骤6,当存在时执行 步骤9;

步骤5,获取SubTransCtl lock互斥锁;

步骤6,从磁盘中读取文件到共享内存,由于SubTransCtl lock互斥锁的存在,此时该磁盘文件只能由唯一的一个进程来操作;

步骤7,释放SubTransCtl lock互斥锁;

步骤8,复制共享内存和磁盘文件中的所有事务父子关系到本地内存,很显然,在复制之后,针对本进程中其余子事务进行查询时,则无需再次获取SubTransCtl lock互斥锁访问磁盘文件。本地的内存local_cache_subtrans大小可自定义设置,可容纳的子事务数量可远超于默认的NUM_SUBTRANS_BUFFERS数量,因此可以保证在本地内存中获取父子关系。

步骤9,标记最大的xmin之前的事务可见,即对于最大xmin之前的事务有效;

步骤10,从本地内存中取出父事务号;

步骤11,判断步骤10取得的父事务号是否有效,当无效时返回步骤1,当有效时执行步骤12;

步骤12,返回该父事务号,进行后续处理。

在数据库主库中申请子事务或提交事务时执行数据库子事务的性能优化方法中各步骤操作,当主库子事务操作完成时将操作过程写入WAL并同步到备库。备库中接收到主库的WAL后,进行回放,实现数据库子事务的性能优化方法,完成与主库同步,从而与主库保持子事务可见一致性。

该技术方案通过本地内存优化了数据库中子事务的处理性能,并基于xmin确保子 事务优化时主库备库的数据一致性,从而实现了数据库的性能优化。基于本方案,在多并发场景下,子事务的处理也能够高效执行。

★专利申请号/公开号:CN 116244041 A

 

开发团队


·带队负责人姓名:洪建辉

洪建辉,亚信安慧AntDB-T数据库的研发带头人,曾在多家知名大中型企业担任研发总监、技术总监和首席信息官等技术管理职务,负责过多项国防领域国产数据库项目,拥有20多年软件研发和管理经验,10多年分布式数据库和云数据库研发经验。其带头研发的亚信安慧AntDB-T数据库已广泛应用于我国24个省、市、自治区的通信运营商核心业务系统,为推动通信行业基础软件国产化作出了重要贡献。

团队其他重要成员姓名:梁博、余秀明、马珊珊

·隶属机构:亚信安慧

湖南亚信安慧科技有限公司(简称“亚信安慧”)面向各行业提供数据库、中间件等基础软件产品和相关服务。公司以“技术+生态”为长期战略,将技术前瞻性、领先性视为企业根基与核心竞争力,将生态建设视为业务发展的加速器。

亚信安慧的拳头产品AntDB数据库,具备高性能、弹性扩展、高可靠等产品特性,服务24个省份的数亿用户,峰值每秒可处理百万笔通信核心交易,广泛应用于通信、交通、金融、能源、邮政等行业。

 

相关评价

 

我们依托亚信安慧AntDB数据库完成了核心账务库的升级改造,并获评集团“创新应用标杆”,在进一步提升核心系统能力的同时,有力保障了数据和系统的安全、稳定。

——某通信运营商省公司

亚信安慧AntDB数据库为我们提供了统一的大数据汇聚能力、实时的分析处理、现代化的监控和服务,实现了多维度分析和强时效管理,为交通行业的精细化运营、管理决策提供了强力支撑。

——某行业客户

 

关于亚信安慧AntDB数据库

AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部