【技术实现步骤摘要】
一种基于CockroachDB的BatchGroup串行化调用的优化方法
[0001]本专利技术涉及数据库领域,尤其涉及一种基于CockroachDB的BatchGroup串行化调用的优化方法。
技术介绍
[0002]CockroachDB是一个可水平伸缩、支持事务的ACID特性的分布式数据库,它主要有SQL层、事务层、分发层、副本层和存储层等组成。其中副本层调用存储层的写接口时,是把数据存放在了Batch中,多个Batch依次放入一个FIFO的队列中,队列头的Batch作为leader,组建自己的BatchGroup。BatchGroup间因为存在顺序依赖关系,所以Group调用存储层写接口采用串行的方式。存储层会维护一个全局递增的Sequence,用户的数据在插入时,与当前Sequence绑定一起存储到内存或磁盘上,先插入的数据Sequence越小。在进行读数据时,只有小于等于存储层当前的Sequence的数据才可见。我们可以看出,因为BatchGroup间存在顺序依赖关系,所以BatchGroup必须串行执行,这将成为数据库的性能瓶颈点。
技术实现思路
[0003]为了解决解决CockroachDB的BatchGroup串行化调用问题,本专利技术提供了一种基于CockroachDB的BatchGroup串行化调用的优化方法,基于Go层预分配全局递增的Sequence,解决BatchGroup间顺序依赖问题,从而实现BatchGroup并发写入存储层,提升CockroachDB的写入性能。 >[0004]本专利技术的技术方案是:
[0005]一种基于CockroachDB的BatchGroup串行化调用的优化方法,通过把存储层的Sequence上提到Go层,写数据时为每个BatchGroup预分配全局递增的Sequence号,读数据时带上当前的Sequence到存储层。从而实现BatchGroup的并发写入,提升数据库写入性能。
[0006]进一步的,BatchGroup调用CGO执行写操作时,不再以串行的方式。取而代之的是,Go层通过维护全局变量Sequence,为每个BatchGroup依次分配Sequence段,解除其顺序耦合关系,实现BatchGroup的并发调用。
[0007]实现包括内容如下:
[0008]1)每个写协程把数据写入Batch之中,Commit后加入pending队列。队列的第一个Batch作为Leader确定一个BatchGroup,组内的其他Batch数据合并到Leader中,由Leader代提交。
[0009]2)维护一个全局递增Sequence,代表数据写入的顺序。
[0010]3)在Leader进行CGO调用前,计算Batch内写操作的数量count,然后为其预分配[Sequence+1,Sequence+count]序列号段,同时更新Sequence为Sequence+count。序列号代表数据写入的相对顺序。
[0011]4)在读取时,NewIter返回一个存储层迭代器,若IterOption的sequence字段为
空,则代表不是快照查询,则用当前的Sequence进行赋值,代表只可看到小于等于Sequence的数据。
[0012]再进一步的,
[0013]Batch不断加入pending队列,因为每个BatchGroup的大小是有限制的,当存在Batch积压时,就会出现多个BatchGroup,它们之间用NULL分割。多个BatchGroup同时并发请求写存储层,所以维护了一个信号量Semophere,用于控制BatchGroup并发的数量。调用Semophere的acquire()方法,若未到并发阈值,则返回,否则一直阻塞,直到其中一个BatchGroup执行完毕后release()资源。
[0014]Go层维护了一个全局递增的Sequence,代表数据写入的先后顺序。在数据库启动时,Sequence从manifest文件中加载到内存,数据库运行时,依旧把Sequence写入存储层。
[0015]在调用存储层写接口写数据时,需要为BatchGroup预分配一段连续的Sequence段。
[0016]1)BatchGroup在进行CGO调用前,Leader计算当前Batch有多少写操作count,然后获取[Sequence+1,Sequence+count]段用于写入本组内的数据。因为多个BatchGroup并发获取Sequence段,因此需要while循环与CAS操作,成功预分配后跳出,否则一直进行重分配直到成功。同时应该保证,pending队列里靠前的BatchGroup应预分配到较小的Sequence段,保证数据的顺序性语义。
[0017]2)BatchGroup并发调用CGO,调用前需要把BatchGroup压入队列中,调用返回后若前面的BatchGroup均已出队列,则直接出队列返回;否则需要等待前一个BatchGroup完成后再返回。保证并发读写时语义不变。
[0018]存储层的读接口就是通过NewIter来生成一个存储层的迭代器。之前Sequence是维护在存储层,本次把Sequence上调到Go层后,需要在每次读取时,为IterOption的sequence字段赋值,传递到存储层。存储层的读逻辑保持不变,依旧使用Sequence作为其MVCC的基础。
[0019]存储层在写入时,需要接收上层传来的Sequence,并同数据一起写入内存或磁盘中。同时,因为Go层已经采取Batch组Group策略,故C层不再再次组BatchGroup。
[0020]本专利技术的有益效果是
[0021]优化了CockroachDB中BatchGroup串行化调用CGO而带来的数据库写入性能瓶颈问题,不再使用串行化处理模式,而是基于预分配的Sequence段机制实现BatchGroup的并发提交。同时通过设置信号量Semophere的容量大小,来控制协程并发执行的并发度。这种改造在大量写场景下,减少了Batch在pending队列里的等待时间,可以提升存储引擎的写性能。
附图说明
[0022]图1是CockroachDB的BatchGroup串行执行的示意图;
[0023]图2是本专利技术中BatchGroup并发执行的示意图。
具体实施方式
[0024]为使本专利技术实施例的目的、技术方案和优点更加清楚,下面将结合本专利技术实施例
中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本专利技术一部分实施例,而不是全部的实施例,基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0025]并行执行是当前服务运行的趋势,并行处理相对于串行大大提升了性能。CockroachDB的BatchGroup串行化处理是因为Sequence号本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种基于CockroachDB的BatchGroup串行化调用的优化方法,其特征在于,通过把存储层的Sequence上提到Go层,写数据时为每个BatchGroup预分配全局递增的Sequence号,读数据时带上当前的Sequence到存储层,从而实现BatchGroup的并发写入。2.根据权利要求1所述的方法,其特征在于,BatchGroup调用CGO执行写操作时,Go层通过维护全局变量Sequence,为每个BatchGroup依次分配Sequence段,解除其顺序耦合关系,实现BatchGroup的并发调用。3.根据权利要求2所述的方法,其特征在于,工作步骤如下:1)每个写协程把数据写入Batch之中,Commit后加入pending队列;队列的第一个Batch作为Leader确定一个BatchGroup,组内的其他Batch数据合并到Leader中,由Leader代提交;2)维护一个全局递增Sequence,代表数据写入的顺序;3)在Leader进行CGO调用前,计算Batch内写操作的数量count,然后为其预分配[Sequence+1,Sequence+count]序列号段,同时更新Sequence为Sequence+count,序列号代表数据写入的相对顺序;4)在读取时,NewIter返回一个存储层迭代器,若IterOption的sequence字段为空,则代表不是快照查询,则用当前的Sequence进行赋值,代表只可看到小于等于Sequence的数据。4.根据权利要求3所述的方法,其特征在于,维护一个信号量Semophere,用于控制BatchGroup并发的数量,调用Semophere的acquire()方法,若未到并发阈值,则返回,否则一直阻塞,直到其中一个BatchGroup执行完毕后release()资源。5.根...
【专利技术属性】
技术研发人员:王云龙,
申请(专利权)人:山东浪潮科学研究院有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。