Vastbase G100核心技术介绍之【CSN事务快照】
导语
为了保证数据库事务的一致性和隔离性,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
笔者利用BenchmarkSQL工具分别在Vastbase G100和PostgreSQL数据库启用32个并发持续测试10分钟,并统计两种数据库获取快照的平均耗时。
经测试,Vastbase G100获取快照耗时比PostgreSQL更短。随着并发数加大,Vastbase G100与PostgreSQL获取快照的耗时差距会逐渐增大。
原文链接:https://mp.weixin.qq.com/s/xdbc7a7TlVXxhLHHUVCbTQ
相关文章