一种基于混合RDMA操作的分布式并发控制方法及系统与流程

文档序号:15761065发布日期:2018-10-26 19:18阅读:298来源:国知局
一种基于混合RDMA操作的分布式并发控制方法及系统与流程

本发明涉及分布式控制领域,具体地,涉及一种基于混合rdma操作的分布式并发控制方法及系统。



背景技术:

当下,服务器内存的价格已经足够支持将数据库中的数据全部存储在内存中,以达到数据高效存取的目的。与此同时,远程直接内存存取rdma(remotedirectmemoryaccess,远程直接内存访问)成为了数据库内部服务器间通信的主要协议。相比于传统的tcp/ip协议,rdma可以绕过tcp/ip协议繁复的软件栈,避免多次内存拷贝并且无需占用远端中央处理器cpu(centralprocessingunit)处理资源,将网络处理工作交由网卡硬件处理,因而拥有延迟低,吞吐量高的特点。

rdma的操作根据语义可以分为两类。第一类是单边操作(one-sided),第二类是双边操作(two-sided)。单边操作可以让本地服务器直接读写远端服务器的内存,并且无需远端服务器的cpu的处理,因而性能非常高。由于单边操作需要在服务器间建立一对一的连接,在大规模分布式系统中,每一台服务器都需要建立多个连接,而网卡能够同时缓存的连接数是有限的,那么过多的连接就有可能造成较差的可扩展性;双边操作与tcp的send/recv接口类似,需要远端服务器的cpu处理相关请求,服务器间的数据传输也仍然能够享受rdma的高性能特性。由于需要远端服务器cpu处理请求,双边操作性能会比单边操作略低,但双边操作采用数据报的形式发送消息,因此可以建立一对多的连接,避免了单台服务器上的连接数过多的问题,因而拥有更好的可扩展性。

目前,许多分布式事务处理系统采用乐观并发控制(optimisticconcurrencycontrol)的方式来保证事务间的一致性。这么做的假设是,乐观地认为事务间不会频繁发生读写冲突,在实际更新某个值时再申请互斥锁,对于读请求则不加锁,可以进一步提高事务间的并行性,从而提升性能。在乐观并发控制中,每个步骤的场景都略有不同,在不同步骤下也会有不同的实现,应该使用rdma的单边操作还是双边操作来实现乐观并发控制是一个非常重要的问题。

以读取远端数据为例,在分布式系统中数据一般会存储在数据结构如哈希表或树状结构中,使得找到一个数据的读取操作总是大于等于一次的。在这种情况下,使用单边操作虽然能够节省远端cpu资源,但是会加大网络的往返次数。而且,一次单边操作只能操作一段连续的内存区域,对于内存中不连续的多个数据,就需要发起多次单边操作来读取;而使用双边操作,以远程过程调用rpc(remoteprocedurecall)的方式来发送读数据请求,只要将对不同数据的读操作合并在一个请求中,就仅会有一次网络往返,用于发送请求和回复结果,而读取数据的工作会交由远端服务器cpu来处理,降低了网络层的延迟。

现如今,还没有一个统一的定论阐述——并发控制的不同步骤应该用何种rdma操作。先前基于远程直接内存存取的分布式事务处理系统工作,它们的并发控制或是在所有步骤全部采用单边操作,或是全部采用双边操作。这两种单一的rmda实现都不能做到:根据并发控制的不同阶段场景,有针对性地选取合适的rdma操作。

因此,先前的工作对基于远程直接内存存取的分布式事务处理系统的并发控制实现研究并不深入,还有一定的空白。



技术实现要素:

针对现有技术中的缺陷,本发明的目的是提供一种基于混合rdma操作的分布式并发控制方法及系统。

根据本发明提供的一种基于混合rdma操作的分布式并发控制方法,先在不同服务器间建立起rdma通讯连接,预先分配并管理rdma使用的内存区域,然后执行分布式事务,在分布式并发控制中,不同步骤采用的rdma操作不同,包括:

数据读取步骤:事务在本地读取远端数据,若本地已经缓存了远端数据在远端服务器的地址,则执行单边操作读取步骤;若本地没有缓存远端数据在远端服务器的地址,则执行双边操作读取步骤;

单边操作读取步骤:根据本地服务器缓存的远端数据的地址,使用单边操作直接读取远端服务器中的数据,执行事务执行步骤;

双边操作读取步骤:使用基于双边操作的rpc读取远端数据,执行事务执行步骤;

事务执行步骤:在本地服务器执行事务,若没有需要读取的数据,则执行锁申请步骤;若有需要读取的数据,执行数据读取步骤;

锁申请步骤:使用基于双边操作的rpc申请远端被更新数据的锁,若成功申请所有远端被更新数据的锁,则执行时间戳校验步骤;反之执行数据锁释放步骤;

时间戳校验步骤:本地服务器通过单边操作直接读取远端数据的时间戳,并将该时间戳与数据被第一次读取的时间戳比对。如果所有数据的时间戳校验都成功,则代表在事务执行期间该数据没有被更新,数据是一致的,执行日志备份步骤;如果不成功,则执行数据锁释放步骤;

日志备份步骤:使用单边操作直接将事务的日志写在备份服务器内存中,如果写日志成功,执行远端数据更新步骤;如果不成功,则执行数据锁释放步骤;

远端数据更新步骤:本地服务器向被更新数据所在的远端服务器发起提交请求,所述提交请求使用基于双边操作的rpc的方式执行远端数据的更新,执行结束步骤;

数据锁释放步骤:本地服务器使用基于双边操作的rpc的方式执行将所申请的数据锁释放,执行结束步骤;

结束步骤:结束事务操作。

较佳的,本地服务器批量地将所有请求发送出去,等收集到所有远端服务器的返回后再执行后续逻辑。

较佳的,数据读取步骤读取的远端数据包括后续执行中被读取或被更新的数据,还有数据对应的时间戳。

较佳的,所述双边操作读取步骤、所述锁申请步骤以及所述远端数据更新步骤中,本地服务器一次性将对于同一远端服务器上不同数据的操作合并为一个请求,再发送给远端服务器。

较佳的,所述日志备份步骤使用环形缓冲管理日志,需要备份服务器不间断地将内存中的日志持久化入磁盘。

根据本发明提供的一种基于混合rdma操作的分布式并发控制系统,先在不同服务器间建立起rdma通讯连接,预先分配并管理rdma使用的内存区域,然后执行分布式事务,在分布式并发控制中,不同模块采用的rdma操作不同,包括:

数据读取模块:事务在本地读取远端数据,若本地已经缓存了远端数据在远端服务器的地址,则执行单边操作读取模块;若本地没有缓存远端数据在远端服务器的地址,则执行双边操作读取模块;

单边操作读取模块:根据本地服务器缓存的远端数据的地址,使用单边操作直接读取远端服务器中的数据,执行事务执行模块;

双边操作读取模块:使用基于双边操作的rpc读取远端数据,执行事务执行模块;

事务执行模块:在本地服务器执行事务,若没有需要读取的数据,则执行锁申请模块;若有需要读取的数据,执行数据读取模块;

锁申请模块:使用基于双边操作的rpc申请远端被更新数据的锁,若成功申请所有远端被更新数据的锁,则执行时间戳校验模块;反之执行数据锁释放模块;

时间戳校验模块:本地服务器通过单边操作直接读取远端数据的时间戳,并将该时间戳与数据被第一次读取的时间戳比对。如果所有数据的时间戳校验都成功,则代表在事务执行期间该数据没有被更新,数据是一致的,执行日志备份模块;如果不成功,则执行数据锁释放模块;

日志备份模块:使用单边操作直接将事务的日志写在备份服务器内存中,如果写日志成功,执行远端数据更新模块;如果不成功,则执行数据锁释放模块;

远端数据更新模块:本地服务器向被更新数据所在的远端服务器发起提交请求,所述提交请求使用基于双边操作的rpc的方式执行远端数据的更新,执行结束模块;

数据锁释放模块:本地服务器使用基于双边操作的rpc的方式执行将所申请的数据锁释放,执行结束模块;

结束模块:结束事务操作。

较佳的,本地服务器批量地将所有请求发送出去,等收集到所有远端服务器的返回后再执行后续逻辑。

较佳的,数据读取模块读取的远端数据包括后续执行中被读取或被更新的数据,还有数据对应的时间戳。

较佳的,所述双边操作读取模块、所述锁申请模块以及所述远端数据更新模块中,本地服务器一次性将对于同一远端服务器上不同数据的操作合并为一个请求,再发送给远端服务器。

较佳的,所述日志备份模块使用环形缓冲管理日志,需要备份服务器不间断地将内存中的日志持久化入磁盘。

与现有技术相比,本发明具有如下的有益效果:

1、针对事务处理的不同阶段,采用不同rdma操作作为通信手段,而非单一地使用某一种rdma操作。根据场景不同,最大化地利用了rdma的特性;

2、与单一使用单边操作的并发控制实现相比,有效减少了不必要的网络往返次数,避免了单边操作过于简单的语义复杂化了并发控制的实现;

3、与单一使用双边操作的并发控制实现相比,有效节省了不必要的cpu处理资源,分布式事务处理系统可以最大化利用rdma绕过远端服务器cpu的特性。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为本发明的并发控制网络通信顺序图;

图2为本发明的实施流程图。

具体实施方式

下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。

如图1所示,本发明提供的一种基于混合rdma操作的分布式并发控制方法,先在不同服务器间建立起rdma通讯连接,预先分配并管理rdma使用的内存区域,然后执行分布式事务,在分布式并发控制中,不同步骤采用的rdma操作不同,包括:

数据读取步骤:事务在本地读取远端数据,若本地已经缓存了远端数据在远端服务器的地址,则执行单边操作读取步骤;若本地没有缓存远端数据在远端服务器的地址,则执行双边操作读取步骤。读取的远端数据包括后续执行中被读取或被更新的数据,还有数据对应的时间戳。

单边操作读取步骤:根据本地服务器缓存的远端数据的地址,使用单边操作直接读取远端服务器中的数据,执行事务执行步骤。缓存应该保证远端数据的地址是一致性的,避免读到错误数据的情况。

双边操作读取步骤:使用基于双边操作的rpc读取远端数据,执行事务执行步骤;

事务执行步骤:在本地服务器执行事务,若没有需要读取的数据,则执行锁申请步骤;若有需要读取的数据,执行数据读取步骤;

锁申请步骤:使用基于双边操作的rpc申请远端被更新数据的锁,若成功申请所有远端被更新数据的锁,则执行时间戳校验步骤;反之执行数据锁释放步骤;

时间戳校验步骤:本地服务器通过单边操作直接读取远端数据的时间戳,并将该时间戳与数据被第一次读取的时间戳比对。如果所有数据的时间戳校验都成功,则代表在事务执行期间该数据没有被更新,数据是一致的,执行日志备份步骤;如果不成功,则执行数据锁释放步骤;

日志备份步骤:使用单边操作直接将事务的日志写在备份服务器内存中,如果写日志成功,执行远端数据更新步骤;如果不成功,则执行数据锁释放步骤。事务日志指代在服务器发生故障后,可以用于恢复数据到故障状态前的日志记录。使用环形缓冲管理日志,需要备份服务器不间断地将内存中的日志持久化入磁盘,避免环形缓冲被充满,造成阻塞。

远端数据更新步骤:本地服务器向被更新数据所在的远端服务器发起提交请求,所述提交请求使用基于双边操作的rpc的方式执行远端数据的更新,执行结束步骤。请求发送完后,无需确认提交请求返回,即可结束事务执行。

数据锁释放步骤:本地服务器使用基于双边操作的rpc的方式执行将所申请的数据锁(锁申请步骤中的数据锁)释放,执行结束步骤。请求发送完后,无需确认提交请求返回,即可结束事务执行。

结束步骤:结束事务操作。

所有步骤中,本地服务器指代执行当前被处理事务的服务器,远端服务器指代除了本地服务器以外的其它服务器。本地服务器首先会批量地将所有请求发送出去,等收集到所有服务器的返回后再执行后续逻辑,优化吞吐量,减少延迟。

双边操作读取步骤、锁申请步骤以及远端数据更新步骤中,本地服务器一次性将对于同一远端服务器上不同数据的操作合并为一个请求,再发送给远端服务器,减少网络信息往返次数。

结合图2所示,在步骤401中,本地服务器首先根据事务逻辑和当前事务的执行进度,判断是否需要从远端读取数据。如果存在需要读取的远端数据,首先查询本地缓存的远端数据地址;如果已经没有需要读取的远端数据,并且所有事务逻辑已经执行完成,执行步骤402。

在上述步骤中,如果本地缓存了需要被读取的远端数据地址,则使用单边操作依次读取远端数据;如果本地没有缓存远端数据地址,则将对同一台远端服务器的数据读操作合并为一个双边操作的读数据请求,再发送给远端服务器。

在上述步骤完成后,远端服务器收到该请求,通过内存读取操作,读取对应的数据,并将读取到的数据以一个双边操作回复给本地服务器。

在上述步骤完成后,本地服务器成功读取远端服务器中的数据,执行后续事务逻辑。

在上述步骤完成后,如果仍然有需要读取的远端数据,继续开始执行步骤401;

在步骤402中,本地服务器对于在本次事务执行中被更新的远端数据,需要向远端发送申请锁请求,申请数据对应的互斥锁。本地服务器将对同一台远端服务器的申请锁操作合并为一个双边操作的申请锁请求,发送给远端服务器。

在上述步骤完成后,远端服务器收到申请锁请求,根据请求中申请锁的顺序,依次通过内存原子操作申请数据锁。

在上述步骤执行中,如果远端服务器申请数据锁失败,则中断申请锁过程,以一个双边操作回复本地服务器申请锁失败;如果所有锁申请成功,则以一个双边操作回复本地服务器申请锁成功;

在上述步骤完成后,本地服务器收到远端的返回,如果申请锁成功,则执行步骤403;否则,执行步骤405;

在步骤403中,对于在本次事务执行中所涉及到的所有数据,需要校验它们的时间戳。对于所有需要被校验的远端数据,本地服务器依次通过单边操作读取它们的时间戳。

在上述步骤完成后,本地服务器开始依次校验数据在步骤401中被读取的时间戳和在步骤403中被读取的时间戳。如果所有数据时间戳校验成功,则校验成功,执行步骤404;如果存在时间戳校验不一致的数据,则校验失败,执行步骤405;

在步骤404中,本地服务器需要将事务日志分发给备份服务器。本地服务器将本次事务执行所产生的日志,使用单边操作的方式,直接写入备份服务器内存中的环形缓冲内。

在上述步骤完成后,本地服务器通过单边操作的返回确认所有日志都被正确写入备份服务器中。如果写入日志成功,则执行步骤406。如果写入日志失败,则执行步骤405;

在步骤405中,本地服务器由于之前的操作遇到冲突或者执行失败,需要释放所有已经申请的远端数据锁。本地服务器将对同一台远端服务器的释放锁操作合并为一个双边操作的释放锁请求,发送给远端服务器。

在上述步骤完成后,远端服务器收到释放锁请求,依次通过内存原子操作释放数据锁。

在上述步骤执行中,远端服务器会检验该数据锁的状态,如果本地服务器并没有占用到对应的数据锁,则远端服务器忽略对于该数据的释放锁请求。

在上述步骤完成后,远端服务器无需向本地服务器回复任何信息。并且本地服务器在向远端服务器发送完所有释放锁请求后,直接结束本地事务执行;

在步骤406中,本地服务器已经做好了所有的事务提交准备,开始事务提交请求。本地服务器将对同一台远端服务器的提交操作合并为一个双边操作的提交请求,发送给远端服务器。

在上述步骤完成后,远端服务器收到更新请求,将对应的数据更新。

在上述步骤完成后,远端服务器通过内存原子操作释放数据锁。

在上述步骤完成后,远端服务器无需向本地服务器回复任何信息。并且本地服务器在向远端服务器发送完所有提交请求后,直接结束本地事务执行。

该方法在读取远端地址已被缓存的数据、远端数据时间戳以及向远端写入事务日志时,使用rdma的单边操作;在读取远端地址未被缓存的数据、申请远端数据锁、提交远端事务、释放远端数据锁时,使用rdma的双边操作。与现有技术相比,本发明根据分布式并发控制协议中不同步骤的特征,针对性地使用适合的rdma操作完成对于远程数据的访问,通过混合使用rdma操作优化分布式并发控制过程中网络硬件和处理器硬件的使用效率。

在上述一种基于混合rdma操作的分布式并发控制方法的基础上,本发明还提供一种基于混合rdma操作的分布式并发控制系统,先在不同服务器间建立起rdma通讯连接,预先分配并管理rdma使用的内存区域,然后执行分布式事务,在分布式并发控制中,不同模块采用的rdma操作不同,包括:

数据读取模块:事务在本地读取远端数据,若本地已经缓存了远端数据在远端服务器的地址,则执行单边操作读取模块;若本地没有缓存远端数据在远端服务器的地址,则执行双边操作读取模块。读取的远端数据包括后续执行中被读取或被更新的数据,还有数据对应的时间戳。

单边操作读取模块:根据本地服务器缓存的远端数据的地址,使用单边操作直接读取远端服务器中的数据,执行事务执行模块。缓存应该保证远端数据的地址是一致性的,避免读到错误数据的情况。

双边操作读取模块:使用基于双边操作的rpc读取远端数据,执行事务执行模块;

事务执行模块:在本地服务器执行事务,若没有需要读取的数据,则执行锁申请模块;若有需要读取的数据,执行数据读取模块;

锁申请模块:使用基于双边操作的rpc申请远端被更新数据的锁,若成功申请所有远端被更新数据的锁,则执行时间戳校验模块;反之执行数据锁释放模块;

时间戳校验模块:本地服务器通过单边操作直接读取远端数据的时间戳,并将该时间戳与数据被第一次读取的时间戳比对。如果所有数据的时间戳校验都成功,则代表在事务执行期间该数据没有被更新,数据是一致的,执行日志备份模块;如果不成功,则执行数据锁释放模块;

日志备份模块:使用单边操作直接将事务的日志写在备份服务器内存中,如果写日志成功,执行远端数据更新模块;如果不成功,则执行数据锁释放模块。事务日志指代在服务器发生故障后,可以用于恢复数据到故障状态前的日志记录。使用环形缓冲管理日志,需要备份服务器不间断地将内存中的日志持久化入磁盘,避免环形缓冲被充满,造成阻塞。

远端数据更新模块:本地服务器向被更新数据所在的远端服务器发起提交请求,所述提交请求使用基于双边操作的rpc的方式执行远端数据的更新,执行结束模块。请求发送完后,无需确认提交请求返回,即可结束事务执行。

数据锁释放模块:本地服务器使用基于双边操作的rpc的方式执行将所申请的数据锁(锁申请模块中的数据锁)释放,执行结束模块。请求发送完后,无需确认提交请求返回,即可结束事务执行。

结束模块:结束事务操作。

所有模块中,本地服务器指代执行当前被处理事务的服务器,远端服务器指代除了本地服务器以外的其它服务器。本地服务器首先会批量地将所有请求发送出去,等收集到所有服务器的返回后再执行后续逻辑,优化吞吐量,减少延迟。

双边操作读取模块、锁申请模块以及远端数据更新模块中,本地服务器一次性将对于同一远端服务器上不同数据的操作合并为一个请求,再发送给远端服务器,减少网络信息往返次数。

本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统及其各个装置、模块、单元以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置、模块、单元以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置、模块、单元可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置、模块、单元也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置、模块、单元视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1