一种基于RDMA的键值存储系统传输方法与流程

文档序号:21623248发布日期:2020-07-29 02:29阅读:275来源:国知局
一种基于RDMA的键值存储系统传输方法与流程

本发明属于计算机存储技术领域,具体涉及一种基于rdma的键值存储系统的传输方法。



背景技术:

随着云计算和大数据处理技术的成熟,互联网应用产生的数据量逐渐呈指数级剧增。与此同时,随着图片和短视频的兴起,这些数据具有格式多样、大小不一、无结构化等特点;为应对日渐增长的海量数据进行查询分析,及永久化保存,需要更高性能的存储技术。而传统关系型数据库由于并发处理能力低下,扩展性较差,存储结构固定,难以适用于格式分散、无结构化的新型数据模式所需的存储要求。

为此,非关系型(nosql)存储的键值存储系统开始成为业界的主流存储与分析工具而得到广泛的应用。其中内存键值存储系统因其访问速度快、可扩展性强等等优势被广泛应用,被用于加速各种数据处理的工作负载,包括在线分析工作负载和离线数据密集型工作负载。例如,可用作主存储(例如,redis和ramcloud)工具,或作为后端数据库(例如,memcached)的前置高速缓存用以加速数据读写效率。此外,也被用于大数据分析工具hadoop及spark的上层应用中(例如hbase),以支持非结构化数据存储。

然而,面对日益剧增的数据量和处理大规模数据带来的高额计算量,传统tcp/ip网络协议与硬件设备已经慢慢地跟不上高性能内核与高传输线路(100gbs)的脚步。网络io性能和计算资源紧张开始成为键值存储系统的瓶颈。

因此,高效的网络硬件和更先进的传输协议被引入到传统键值存储系统当中。随着高性能计算硬件的价格下降,数据中心逐渐开始使用例如rdma(remotedirectmemoryaccess)技术,来提高内存键值存储系统的传输与计算性能。rdma操作允许机器从另一台机器的预先注册的存储器区域读取(或写入)而不涉及远程侧的cpu。与传统的消息传递相比,rdma实现了最小的往返延迟(微秒级),最高吞吐量和最低cpu开销。将rdma结合到键值存储系统可以极大的提升在线处理速率,降低数据密集型工作负载。同时rdma开始支持roce(rdmaoverconvergedethernet)协议,这是一种允许rdma硬件运行在以太网链路底层的扩展技术,使得rdma高性能硬件可以与传统以太网得以兼容,将其引入传统键值存储系统也会有很好的适配性。

但是利用基于rdma的键值存储系统进行数据传输时,尚存在若干问题需要解决。经过测试,在节点之间传输数据需要1-3微秒,而对于内存的查找则只需要60-120纳秒,前者的时延占据主要部分,这表明传输效率高低与否将直接影响键值存储系统整体读写性能。然而,在最近的基于rdma的键值存储系统的研究工作中,多采用rdmaread模式进行远端内存访问,例如pilaf和farm系统中采用的传输模式。rdmaread操作虽然旁路了远端服务器的内核,但是也造成远端不能进行复杂寻址,客户端与服务器的数据传输将需要多次往返才可以完成。多次往返传输设计带来的时延显然比单次往返设计要更长,显著降低用户体验。因此,采用rdmaread模式带来的多次往返传输问题将极大地降低键值存储系统整体性能。

除此之外,基于rdmaread的操作在进行多次往返的同时,虽然旁路了远端服务器的内核(这也是造成远端不能复杂寻址的原因之一),但是多次传输会带来对客户端cpu的中断和线程切换,客户端往往不止一个应用在使用cpu,所以将会极大降低用户在应用层层面的体验。同时服务器端本就是为提供服务而存在,服务器cpu不会有过多应用切换,过于追求服务器端内核完美旁路就显得本末倒置。



技术实现要素:

为了解决现有技术中的问题,本发明的目的是提出一种基于rdma的键值存储系统传输方法,能够有效地降低内存键值存储系统的往返通信时延,提高吞吐量,同时利用rdma单边语义旁路客户端内核,提升客户端上层用户体验。

为了达到上述发明目的,本发明采用以下技术方案:

第一方面,一种基于rdma的键值存储系统传输方法,包括以下步骤:

客户端与服务器端互相建立连接,服务器端注册rdma内存用于创建命令队列,客户端注册rdma内存用于接收返回数据块,并互相传递内存地址和访问密钥;

连接建立成功后,客户端以单边write语义形式向服务器端发送get/put指令;

服务器端接收多客户端的并行处理请求并存储于命令队列中,依据rdma单边write语义对命令队列中的数据进行解析和响应,对于get指令以旁路客户端内核的形式将value数据发送到客户端内存中;对于put指令,在本地新增或更新value存储块。

作为优选的实施方式,所述客户端以单边write语义形式发送get/put指令通过调用rdmawrite函数实现,所述rdmawrite函数参数包括:

r_address,为服务器端传来的虚拟内存映射,

r_key,为服务器端传来的访问密钥,

data,为本次请求相关信息,在区分操作类型的基础上包含该操作类型对应需要的信息。

作为优选的实施方式,对于get请求,所述data包括:

command,用于区分请求类型;

key,为本次请求的目标对象在键值存储系统中的键key,用于在对端查找索引中的value地址空间;

l_address,为客户端内存中用于存放返回数据的地址空间;以及

l_key,为客户端访问密钥。

作为优选的实施方式,对于get请求,所述依据rdma单边write语义对命令队列中的数据进行解析和响应包括:

服务器创建线程处理指令队列中的接收数据data,解析data中的参数;

根据command确定指令为get,创建响应函数rdma-write(l_address,l_key,r_data);

根据key访问哈希表,得到对应的value所在存储块地址映射,根据映射地址从存储块中取出value封装进响应函数的r_data中;

将解析出的l_address和l_key直接填入响应函数的l_address和l_key中;

与客户端l_key密钥匹配成功后,将数据data以旁路客户端内核的形式发送到以l_address地址指定的客户端内存,由客户端接收get结果。

作为优选的实施方式,对于put请求,所述data包括:

command,用于区分请求类型;

key,为本次请求需要写入的数据块在键值存储系统中的键key;

value,为本次请求需要写入的数据块在键值存储系统中的值value。

作为优选的实施方式,对于put请求,所述依据rdma单边write语义对命令队列中的数据进行解析和响应包括:

服务器创建线程处理指令队列中的接收数据data,解析data中的参数;

根据command确定指令为put,启动索引访问线程执行写入操作,在哈希表中新建<new_key,new_value>键值对;

根据解析出的key,将其写入到新建的键值对主键new_key中;

根据解析出的value,在内存区新建一段数据存储块,将此value拷贝到新建存储块中,并将该存储块的访问地址写入键值对new_value中。

作为优选的实施方式,所述客户端在发送请求时,按任务紧急程度划分优先级层次,并将优先级标志位与数据一块发送到服务器端,所述服务器端命令队列接收标志位与数据块后,串行取出并按优先级依次处理。

第二方面,一种数据处理装置,所述装置包括:

一个或多个处理器;

存储器;

以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如本发明第一方面所述的基于rdma的键值存储系统据传输方法。

第三方面,一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令被处理器执行时实现如本发明第一方面所述的基于rdma的键值存储系统传输方法。

本发明实现了基于rdma的内存键值存储系统的高传输性能设计方法,相比于传统tcp/ip通信协议与其他rdma语义设计,本设计方法仅需一次往返传输,命令队列自动处理,完成数据访问,同时解放客户端cpu开销。可应用于rdma硬件环境下,以内存键值存储系统作为数据库引擎的场景中。

附图说明

图1是根据本发明实施例的基于rdma的键值存储系统的传输方法示意图;

图2是根据本发明实施例的客户端与服务器端互相建立连接示意图;

图3是根据本发明实施例的命令队列与轮询线程示意图;

图4是根据本发明实施例的get指令的请求阶段示意图;

图5是根据本发明实施例的get指令的响应与返回阶段示意图;

图6是根据本发明实施例的put指令客户端发送阶段示意图;

图7是根据本发明实施例的服务器端put指令响应阶段示意图。

具体实施方式

下面结合附图和实施例对本发明的技术方案作进一步说明。

图1示出了根据本发明实施例的基于rdma的键值存储系统的传输方法的总体示意图,本发明使用更高性能的rdmawrite语义重新设计键值存储系统的get与put指令,避免多次往返,降低传输时延,提升吞吐量。同时由服务器端来解析get命令,得到指令要求的操作后,服务器采用rdmawrite将数据返还给客户端,改为旁路客户端内核,为用户解放cpu开销。下面详细介绍如何充分利用rdma的高性能语义重新设计get指令与put指令,提升键值存储系统传输性能。

图2所示为根据本发明实施例的客户端与服务器端互相建立连接示意图。首先服务器端启动rdma内存注册线程,来创建命令队列(commandqueue),用于接收多个客户端使用rdmawrite发送来的get指令缓存,并将该段服务器内存地址r_address和访问密钥r_key预先发送给每个客户端,建立好连接。同时每个客户端启动客户端rdma内存注册线程,创建内存块用于接收get指令完成后返回的数据块(receivedata)。并将该段客户端内存地址l_address和访问密钥l_key预先发送给服务器端,预先互相建立好连接,即面向连接的数据传输协议。当连接建立完成后,便可以通过address和密钥key旁路远端内核访问其内存块。

互相建立连接之后,便会将远端内存虚拟抽象到本地网卡的地址空间中,对于上层应用来说访问远端内存存储相当于访问本地内存的命令与操作,实现细节将由rdma网卡协议和硬件共同完成。

由于采用了高传输性能的rdmawrite单边语义,数据传输的过程中将不通知远端内核完成对远端内存的访问,以带来更高的传输效率。然而不通知内核将导致前文中无论是基于单边语义get指令还是单边语义的put指令,在面临多个客户端并发访问服务器数据存储区时将出现的读写竞争问题都无法由已经被旁路的服务器内核立刻协调解决。故提出如图3所示设计方案。

图3所示为根据本发明实施例的命令队列与轮询线程示意图。首先rdma支持在内存中预先开辟一段内存用于缓存客户端直接单边发送过来的数据,在服务器内存中将此段内存定义为消息队列,用作接收并行客户端的数据。客户端根据任务的紧急程度划分优先级层次,并将优先级标志位写入工作队列中与数据一块发送到服务器端。服务器接收标志位与数据块后,串行取出并按优先级依次处理。由于客户端的rdmawrite语义旁路了服务器端内核,故该串行取出步骤将不会由服务器内核自动执行,需要新建一个轮询线程进行辅助,同时按照本发明中键值存储系统get指令与put指令的设计,对于索引结构的访问本就需要少量cpu进程的参与。因此本发明在该访问hash表的进程中,额外创建一个新的轮询辅助线程p作为整个进程空间的第一步启动,该线程p的作用主要是轮询查找服务器rdma用于缓存接收队列的内存区域是否有新的客户端请求工作,以此达到周期性轮询处理客户端请求并按优先级依次处理的要求。此外,rdmawrite单边语义与消息队列处理方案互相兼容适配,用以处理无内核接收时,多客户端的分布式读写竞争问题。将此队列命名为“命令队列”,该线程成为“轮询线程”。下面进入直接通信阶段,即get指令与put指令在内存键值存储系统中的具体设计。

图4所示为根据本发明实施例的get指令的请求阶段示意图。连接已存在后,由客户端主动发起,进入get的指令的请求阶段,客户端rnic网卡启用rdmawrite通信语义,调用write(r_address,r_key,data)请求函数,该函数第一个参数r_address即为上面建立连接时,远端传过来的虚拟内存映射,通过该r_address参数可以直接访问远端内存。第二个参数r_key为考虑到旁路内核的安全性而设定的约定密钥,当密钥与远端服务器匹配验证通过时,便可以读写远端内存而不必通知远端内核。第三个参数data将存入服务器的接收命令队列(commandqueue)中,该队列已经由服务器rnic预先注册,用于接收客户端发来的存入data中的请求指令。其中参数数据data主要由四部分构成,分别是:

1)command:具体get指令内容,表明本次操作访问性质。

2)key:键值存储系统中的关键字key,用于查找索引中的value地址空间。

3)l_key:用于得到value后,启动数据返回客户端的线程,免密访问客户端内存的客户端密钥l_key,密钥匹配将旁路客户端内核,不中断当前客户端应用层线程。

4)clientreceivingaddress:为接收返回value数据的客户端地址空间l_address,数据返回阶段此地址被抽象到服务器端内存映射中,将可以直接执行单边write语义完成数据的返回过程而不用通知客户端cpu。

客户端的get请求将会统一在命令队列中进行接收,然后服务器轮询队列中的datai作进一步的处理。由于rdma无法单独支持指针的跟踪和索引查询,因此需要服务器辅助处理。故由服务器创建指令队列(commandqueue),轮询该队列中接收到的数据datai参数并解析。

图5所示为根据本发明实施例的get指令的响应与返回阶段示意图。如图所示,服务器端内核会介入这段操作,从接收队列中按优先级取出并解析datai中的请求工作,datai中共有四个参数,第一个参数command解析指令为get或put,若为get指令,则③创建响应函数rdma-write(l_address,l_key,r_data)用于接下来value的返回。④由第二个参数key进行索引哈希表的寻址,由哈希表的键值对存储,得到该关键字key所对应的value地址映射。⑤根据此地址映射,从存储块中取出value封装进前面创建的响应函数的参数r_data中。⑥datai中第三、第四个参数将直接写入响应函数rdma-write的l_key和l_address中。如前文所述l_address参数作为客户端用于接收数据的内存地址空间地址,l_key参数作为旁路客户端内核情况下访问客户端内存所需要的匹配密钥。当rdma-write响应函数与客户端建立连接后,进行l_key密钥匹配,匹配成功后,⑦将直接传输data中的value数据到l_address地址指定的客户端内存进行储存,完成get过程。至此,客户端发起的get请求最终得到了服务器端的响应,并旁路内核返回value到本地内存中。

上述过程是对本发明整个get指令基于高性能rdmawrite语义的请求阶段和响应与返回阶段的描述。将图4所示的请求阶段并入图5第一步发起的请求函数中,即可形象化所有get指令完成步骤。相比于基于rdma的其他关于键值存储系统的工作,本发明中的设计引入了最低通信时延的rdmawrite语义用作全程通信基础语义,并且优化请求阶段和返回阶段,使得传输往返由原来的多次缩减到仅需要一次往返传输即可完成整个get指令。多次传输会带来对客户端cpu的中断和线程切换,客户端往往不止一个应用在使用cpu,所以将会极大降低用户在应用层层面的体验。同时本发明中的设计改由旁路客户端内核,使得本就软件应用较多的客户端内核得到解放,提升客户端前面用户的最实际体验。同时服务器端本就是为提供服务而存在,服务器cpu将全力用于存储系统工作指令负载,避免像传统的rdmaread语义过于追求服务器端内核完美旁路反而显得效用上的本末倒置。

图6所示为根据本发明实施例的put指令客户端发送阶段示意图。当客户端需要向服务器端键值存储系统的value存储块写入新数据或者更新原有旧数据时,便需要用到put指令。相比于get指令需要请求、响应与返回三个阶段来说,put指令的流程相对简单许多。与前面所述get指令的起始步骤相同,客户端与服务器端的rdma仍然要预先建立面向连接的通信方式。为了降低put请求函数复杂性和节省内存资源,put指令将与get指令共用服务器里的索引hash表、value存储块以及工作请求的接收队列(commandqueue)。由于指令共用缓冲区,接收队列并不会因为请求工作为get或者put操作发生改变,故队列中的工作请求依然以datai命名,与get操作不同的是,put操作下的工作请求datai只有三个参数,分别为command、key和value。轮询该队列中接收到的数据datai参数并解析该工作请求。为了加以区分,在datai的首字节位置由command参数表明指令为get操作/put操作。前文get指令描述部分,已经详细阐述了命令队列内存注册部分,此处将不赘述此部分过程。内存注册完成后,客户端便已知晓远端服务器的访问地址r_address与远端内存访问密钥r_key,通过rdmawrite语义便可以直接由参数r_address和r_key访问服务器端内存并写入数据进预先开辟好的服务器命令队列,在队列中生成一次工作请求datai。故可以基于此原理直接设计put操作与之相辅相成。因为是单边操作,所以客户端在请求函数rdma-write((r_address,r_key,data)发送完毕后,便结束本次客户端的线程。

图7所示为根据本发明实施例的服务器端put指令响应阶段示意图。服务器端接收完工作请求datai后,服务器内核的轮询线程被启动,该线程根据工作请求的优先级依次取出并解析工作请求datai。由解析的第一个参数command确定工作请求为get指令或put指令,此处command标明为put指令。开始启动索引访问线程执行写入操作,在哈希表中新建<new_key,new_value>键值对。解析工作请求datai第二个参数得到主键key,写入到新建的键值对主键new_key中。并解析工作请求datai第三个参数得到写入数据块value,在服务器存储区新建一段数据存储块,将此value参数拷贝到新建存储块中,并将该存储块的访问地址写入键值对new_value中,完成键值对索引结构与存储块的全部更新与写入。

客户端成功在服务器端的键值存储系统中新增(或更新)一段新的key-value键值对。由于客户端在完成发送后便关闭相关线程,后续服务器端对索引结构的新增和存储区域的扩展都不会再有消息通知客户端,因此客户端仍然如get指令一样近似内核旁路,极大降低cpu资源占用,腾出计算资源为本就应用切换较多的客户端提供更好的上层体验。同时没有消息往返,传输时延最小化,提升整体工作负载的传输效率,与前文设计的get操作搭配,实现高性能传输的内存键值存储系统。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,本发明中的控制节点与边缘计算节点的交互方式,收集反馈信息内容与在线调度方法在各系统中均适用,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。

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