Vastbase G100核心技术介绍之【CSN事务快照】

2022-02-18 00:00:00 事务 并发 性能 活跃 快照

为了保证数据库事务的一致性和隔离性,Vastbase G100数据库引入了快照隔离技术,即通过事务快照实现事务间的隔离性和一致性。事务快照是一个数据集,存储关于单个事务在某个时间点上事务的活跃状态,活跃事务表示事务正在进行或者尚未启动,对其他事务不可见。


普通事务快照:


高并发情况下出现性能瓶颈


普通事务快照包含以下内容:

Ø xmin:小的活跃事务ID;事务ID小于该值,事务属于已提交或已回滚,是可见的。

Ø xmax:个尚未分配的事务ID;事务ID大于或等于该值,事务属于在生成快照时还没有启动,是不可见的。

Ø xip_list:系统中的活跃事务列表,只包括xmin和xmax之间的所有活跃事务。


数据库程序使用全局数组(procArray)在共享内存中保存系统中所有事务的状态,对该全局数组的读写操作都需要加锁以保证一致性,比如:事务启动、事务提交、事务回滚都需要修改该全局数组。


在事务处理流程中,普通事务快照的生成步骤如下:

  • 首先对procArray加共享锁;

  • 计算xmin和xmax, 并拷贝xmin与xmax之间的活跃事务到xip_list;

  • 释放锁。


随着数据库系统并发数增加,系统中的活跃事务增加,普通事务快照中的xip_list逐渐变大导致以下问题:

  • 生成快照的时间变长,导致加锁时间变长,阻塞其他事务的启动和提交,容易造成性能瓶颈。

  • 事务快照消耗的内存变大。

  • 使用快照进行事务间可见性判断时,需要扫描的数据更多。


为了解决上述问题,引入了CSN事务快照。


CSN事务快照:


提升高并发场景下的系统性能


CSN (Commit Sequence Number),事务提交序列号。根据CSN的大小可以判断事务提交的先后顺序,CSN越小表示事务提交越早。如下图所示:

Ø TX1事务ID为1,CSN为1

Ø TX2事务ID为2,CSN为4

Ø TX3事务ID为3,CSN为2



CSN事务快照是对普通事务快照的改进,使用CSN代替普通事务中的xip_list,可有效提升高并发场景下的系统性能如果事务的CSN比快照CSN小,则表示该事务在当前快照中不可见;如果事务的CSN比快照CSN大,则表示该事务在当前快照中可见。


CSN的实现机制如下:

1. 维护一个全局变量(64位无符号整型)保存系统的下一个CSN值;

2. 事务提交时:

  • 取上述变量值为当前事务的CSN,并将上述全局变量值加1;

  • 将事务的CSN保存到CSN日志;

3.获取快照时,计算xmin和xmax并取上述全局变量值作为快照的CSN(例如:上图中竖实线所代表的时刻,快照中的CSN为4)。


生成CSN事务快照时,不需要拷贝活跃事务列表,减少了锁占用时间,提升了生成快照的性能,也降低了事务快照的内存占用,不会因系统并发数的加大导致性能大幅下降。


判断事务可见性时,处于xmin和xmax之间的事务,只需对比事务CSN与快照CSN的大小即可判断事务在当前快照中的可见性,避免了活跃事务列表扫描,提升了系统性能。


CSN日志


CSN日志保存系统中事务的CSN。为保证性能,CSN日志以page的方式进行管理,一个page默认8K,每个CSN占8 byte, 因此每个page可以存储1024个事务的CSN。



根据CSN日志结构特点,可以通过事务号计算出事务号关联的CSN的位置,有如下计算公式:

Ø 计算XID关联的CSN所在的page:CSN_PAGE_NO = XID/1024

Ø 计算XID关联的CSN所在page的偏移:CSN_IDNEX = XID%1024


CSN事务快照与普通事务快照对比

笔者利用BenchmarkSQL工具分别在Vastbase G100和PostgreSQL数据库启用32个并发持续测试10分钟,并统计两种数据库获取快照的平均耗时。


经测试,Vastbase G100获取快照耗时比PostgreSQL更短。随着并发数加大,Vastbase G100与PostgreSQL获取快照的耗时差距会逐渐增大。

原文链接:https://mp.weixin.qq.com/s/xdbc7a7TlVXxhLHHUVCbTQ

相关文章