日志写入方法及其装置、电子设备及存储介质与流程

文档序号:29957690发布日期:2022-05-11 08:22阅读:161来源:国知局
日志写入方法及其装置、电子设备及存储介质与流程

1.本发明涉及数据处理技术领域,具体而言,涉及一种日志写入方法及其装置、电子设备及存储介质。


背景技术:

2.当前,分布式存储系统在存储数据时,将客户端的数据分为固定大小的块或对象来存储,以提高系统的容错能力和整体性。相关技术中,一般是通过哈希算法,将数据块(或对象)散列到不同的放置群组pg(placement group)上,存储系统对这些pg创建副本之后,利用一定的算法以及设置故障域,将副本分散到不同的节点上或者不同的磁盘上,当一个节点的磁盘损坏时,可以通过其他节点的副本恢复数据,不会造成数据丢失。
3.分布式存储系统使用一致性协议来保证pg之间数据的一致性,以此来确保一个系统的高可用。例如,在三副本的情况下,每个节点上的pg副本使用一个raft实例来管理:一个leader、两个follower。图1是现有技术中的一种可选的raft日志写入方法的示意图,如图1所示,现有的方案是leader储存节点接收到写请求后,通过套接字socket将raft日志发送到follower存储节点,具体为:leader储存节点通过rpc(远程过程调用)模块将raft日志发送至用户空间,然后通过leader储存节点中的内核空间、网卡,再通过网络将raft日志发送至follower存储节点中的网卡,然后通过内核空间、用户空间、rpc模块,之后将raft日志保存至本地存储中(本地存储可以为ssd(固态硬盘)、hdd(电脑存储器)等),在本地存储处理完成之后,将处理结果通过follower存储节点中的rpc模块、用户空间、内核空间、网卡,再通过网络将处理结果发送至leader储存节点中的网卡,经过内核空间、用户空间,最终rpc模块收到处理结果。
4.然而,上述方案存在如下问题:(1)raft日志需要在网卡、内核空间、用户空间来回拷贝,而且需要通信双方的cpu参与,造成存储节点的性能损耗;(2)follower存储节点将日志写入到硬盘时,leader存储节点需要等待follower的回复,直到收到大多数follower写成功的返回消息后,才能给客户端返回结果,因此硬盘io的时间是影响写数据时延的一个重要因素。
5.相关技术中,针对tcp/ip网络传输数据慢的问题,解决方式是使用远程直接内存访问rdma(remote direct memory access)代替tcp/ip网络,rdma允许一台主机通过网络直接操作另一台主机的内存空间,以解决数据拷贝和接收端cpu占用的问题。rdma提供了两种操作方式:send/receive和write/read,其中,send/receive是双边操作,通信双方的cpu都需要参与,write/read则是单边操作,发送端将数据写入到接收端注册的内存中,接收端不需要感知此过程。现有的方案是基于send/receive语义将raft日志发送到对端节点的内存中,可以实现数据零拷贝,然而,通信时接收端需要通过receive原语来接收数据,cpu需要参与数据传输过程。
6.相关技术中,为了实现绕过接收端的cpu,实现直接访问内存,使用rdma网络和nvm(非易失性存储器)来操作日志数据。图2是现有技术中的另一种可选的raft日志写入方法
的示意图,如图2所示,leader存储节点将raft日志直接写到follower存储节点中的pm(persistent memory)内存中,具体为:leader储存节点通过rpc模块将raft日志发送至rdma网卡中,然后通过网络将raft日志发送至follower存储节点中的rdma网卡,然后通过rpc模块将raft日志保存至pm中,在pm处理完成之后,将处理结果通过follower存储节点中的rpc模块、rdma网卡,再通过网络将处理结果发送至leader储存节点中的rdma网卡,最终rpc模块收到处理结果。
7.然而,上述方案仅仅可以解决cpu和内存消耗以及磁盘io带来的时延问题。但是对rdma和pm技术在实际的分布式存储中应用没有提出比较完善的解决办法,主要有以下几个问题:(1)只针对一个pg进行操作,一个分布式存储集群有许多的pg,并将pg均匀的分布到不同的存储节点上。根据raft一致性协议,每个pg都会有自己的角色:leader、follower、candidate。一台节点上的多个pg如何合理的使用rdma硬件发送数据、如何利用pm内存等问题需要解决;(2)在分布式存储的运行期间,pg副本的角色会经常发生变化,比如,pg三副本中有一个节点故障,需要重新选举leader,在leader选举时,每个pg副本需要保证自己的日志数据处于最新的状态,否则会造成选举错误,如何在rdma和pm环境下对pg进行leader选举也没有提出解决方案。
8.针对上述的问题,目前尚未提出有效的解决方案。


技术实现要素:

9.本发明实施例提供了一种日志写入方法及其装置、电子设备及存储介质,以至少解决相关技术中无法在具有多个放置群组的情况下进行日志写入,容易导致日志不一致的技术问题。
10.根据本发明实施例的一个方面,提供了一种日志写入方法,包括:接收客户端的写日志请求,其中,所述写日志请求携带有日志标识;基于所述写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入所述日志标识指示的日志,并将所述日志添加到发送队列中,其中,每个所述存储节点中设置有多个放置群组,所述多个放置群组包括:所述主放置群组以及至少一个从放置群组,每个所述放置群组绑定一个一致性协议,所述发送队列设置在数据存储器中;采用远程访问网络访问所述数据存储器,轮询所述发送队列,将所述发送队列中的日志写入到所述从放置群组的内存中,其中,在所述日志写入成功的情况下,所述从放置群组通过所述一致性协议返回写入成功信息至所述主放置群组;在所述主放置群组接收到所有所述从放置群组返回的所述写入成功信息的情况下,确定所述日志写入成功。
11.可选地,在接收客户端的写日志请求之前,还包括:统计所述存储节点的节点数量;基于所述存储节点的节点数量,划分每个所述存储节点中的内存空间,得到多个内存子空间,其中,每个所述内存空间中至少包括:元数据空间。
12.可选地,在划分每个所述存储节点中的内存空间,得到多个内存子空间之后,还包括:基于预设连接数,将所述内存子空间划分成多个存储块,其中,所述预设连接数为每两个所述存储节点之间的线程连接数量。
13.可选地,在将所述日志添加到发送队列中之后,还包括:按照所述日志添加到发送队列中的顺序,为所述日志设置日志索引;分析所述从放置群组的节点状态;在所述节点状
态为探测状态的情况下,控制所述主放置群组探测所述从放置群组中每个日志的日志索引;在探测出所述从放置群组中的日志索引与所述主放置群组中的日志索引不一致的情况下,采用预设远程调用算法,将不一致的所述日志索引所指示的日志发送到所述从放置群组中。
14.可选地,采用远程访问网络访问所述数据存储器,轮询所述发送队列,将所述发送队列中的日志写入到所述从放置群组的内存中的步骤,包括:采用远程访问网络访问所述数据存储器,轮询所述发送队列,并在轮询成功的情况下,将轮询到的所述日志的页面的写入状态更新为完成状态;遍历发送窗口,在所述发送窗口中每个子窗口中的当前页面的写入状态都为完成状态的情况下,分析当前页面的页面索引是否为最后一个索引;在所述当前页面的页面索引为最后一个索引的情况下,更新写入的内存子空间中的存储块的队列尾,并更新发送窗口的队列头。
15.可选地,在采用远程访问网络访问所述数据存储器,轮询所述发送队列之前,还包括:将所述日志划分为预设个数的页面,其中,每个所述页面对应有一个上下文信息,所述上下文信息至少包括:所述页面的写入状态、页面索引;设置发送窗口,其中,所述发送窗口为通过预设个数的子窗口组成的循环窗口;计算所述日志要写入的内存子空间中空闲存储块的页面数量和空闲子窗口的页面上下文数量;在所述空闲存储块的数量和所述空闲子窗口的数量都大于预设阈值的情况下,为每个所述页面分配一个所述空闲子窗口。
16.可选地,为每个所述放置群组设置一个代理组件;在所述代理组件收到主放置群组发送的选举投票请求的情况下,遍历所述从放置群组中的内存,以分析所述从放置群组中的日志是否处理完成;在所述从放置群组中的日志处理完成的情况下,通过与所述从放置群组连接的代理组件将所述选举投票请求发送至所述从放置群组,其中,所述从放置群组在确定所述选举投票请求中携带的日志索引大于所述从放置群组中的日志索引的情况下,返回投票结果。
17.可选地,在接收客户端的写日志请求之前,还包括:控制监控模块循环检测所述存储节点,得到检测结果;在所述检测结果指示所有所述存储节点中的日志都存入到磁盘的情况下,开启写入程序。
18.根据本发明实施例的另一方面,还提供了一种日志写入装置,包括:接收单元,用于接收客户端的写日志请求,其中,所述写日志请求携带有日志标识;添加单元,用于基于所述写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入所述日志标识指示的日志,并将所述日志添加到发送队列中,其中,每个所述存储节点中设置有多个放置群组,所述多个放置群组包括:所述主放置群组以及至少一个从放置群组,每个所述放置群组绑定一个一致性协议,所述发送队列设置在数据存储器中;写入单元,用于采用远程访问网络访问所述数据存储器,轮询所述发送队列,将所述发送队列中的日志写入到所述从放置群组的内存中,其中,在所述日志写入成功的情况下,所述从放置群组通过所述一致性协议返回写入成功信息至所述主放置群组;确定单元,用于在所述主放置群组接收到所有所述从放置群组返回的所述写入成功信息的情况下,确定所述日志写入成功。
19.可选地,所述写入装置还包括:第一统计模块,用于在接收客户端的写日志请求之前,统计所述存储节点的节点数量;第一划分模块,用于基于所述存储节点的节点数量,划分每个所述存储节点中的内存空间,得到多个内存子空间,其中,每个所述内存空间中至少
包括:元数据空间。
20.可选地,所述写入装置还包括:第二划分模块,用于在划分每个所述存储节点中的内存空间,得到多个内存子空间之后,基于预设连接数,将所述内存子空间划分成多个存储块,其中,所述预设连接数为每两个所述存储节点之间的线程连接数量。
21.可选地,所述写入装置还包括:第一设置模块,用于在将所述日志添加到发送队列中之后,按照所述日志添加到发送队列中的顺序,为所述日志设置日志索引;第一分析模块,用于分析所述从放置群组的节点状态;第一探测模块,用于在所述节点状态为探测状态的情况下,控制所述主放置群组探测所述从放置群组中每个日志的日志索引;第一发送模块,用于在探测出所述从放置群组中的日志索引与所述主放置群组中的日志索引不一致的情况下,采用预设远程调用算法,将不一致的所述日志索引所指示的日志发送到所述从放置群组中。
22.可选地,所述写入单元包括:第一更新模块,用于采用远程访问网络访问所述数据存储器,轮询所述发送队列,并在轮询成功的情况下,将轮询到的所述日志的页面的写入状态更新为完成状态;第二分析模块,用于遍历发送窗口,在所述发送窗口中每个子窗口中的当前页面的写入状态都为完成状态的情况下,分析当前页面的页面索引是否为最后一个索引;第二更新模块,用于在所述当前页面的页面索引为最后一个索引的情况下,更新写入的内存子空间中的存储块的队列尾,并更新发送窗口的队列头。
23.可选地,所述写入装置还包括:第三划分模块,用于在采用远程访问网络访问所述数据存储器,轮询所述发送队列之前,将所述日志划分为预设个数的页面,其中,每个所述页面对应有一个上下文信息,所述上下文信息至少包括:所述页面的写入状态、页面索引;第二设置模块,用于设置发送窗口,其中,所述发送窗口为通过预设个数的子窗口组成的循环窗口;第一计算模块,用于计算所述日志要写入的内存子空间中空闲存储块的页面数量和空闲子窗口的页面上下文数量;第一分配模块,用于在所述空闲存储块的数量和所述空闲子窗口的数量都大于预设阈值的情况下,为每个所述页面分配一个所述空闲子窗口。
24.可选地,所述写入装置还包括:第三设置模块,用于为每个所述放置群组设置一个代理组件;第一遍历模块,用于在所述代理组件收到主放置群组发送的选举投票请求的情况下,遍历所述从放置群组中的内存,以分析所述从放置群组中的日志是否处理完成;第二发送模块,用于在所述从放置群组中的日志处理完成的情况下,通过与所述从放置群组连接的代理组件将所述选举投票请求发送至所述从放置群组,其中,所述从放置群组在确定所述选举投票请求中携带的日志索引大于所述从放置群组中的日志索引的情况下,返回投票结果。
25.可选地,所述写入装置还包括:第一检测模块,用于在接收客户端的写日志请求之前,控制监控模块循环检测所述存储节点,得到检测结果;第一开启模块,用于在所述检测结果指示所有所述存储节点中的日志都存入到磁盘的情况下,开启写入程序。
26.根据本发明实施例的另一方面,还提供了一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述所述的日志写入方法。
27.根据本发明实施例的另一方面,还提供了一种计算机可读存储介质,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序运行时控制所述计算机可
读存储介质所在设备执行上述所述的日志写入方法。
28.在本公开中,接收客户端的写日志请求,基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。在本技术中,可以将主放置群组写入的日志添加到发送队列中,通过远程访问网络,轮询发送队列,并将发送队列中的日志依次写入到从放置群组的内存中,能够在存储节点中具有多个放置群组的情况下,成功将日志写入到不同的从放置群组的内存中,保证了各个放置群组中的日志的一致性,进而解决了相关技术中无法在具有多个放置群组的情况下进行日志写入,容易导致日志不一致的技术问题。
附图说明
29.此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:图1是现有技术中的一种可选的raft日志写入方法的示意图;图2是现有技术中的另一种可选的raft日志写入方法的示意图;图3是根据本发明实施例的一种可选的日志写入方法的流程图;图4是根据本发明实施例的一种可选的reropar结构的示意图;图5是根据本发明实施例的一种可选的reropar启动过程的示意图;图6是根据本发明实施例的一种可选的reropar内存划分的示意图;图7是根据本发明实施例的一种可选的reropar发送日志的过程的示意图;图8是根据本发明实施例的一种可选的reropar-net写日志的过程的示意图;图9是根据本发明实施例的一种可选的reropar轮询日志处理过程的示意图;图10是根据本发明实施例的一种可选的reropar处理投票请求的示意图;图11是根据本发明实施例的一种可选的reropar停止过程的示意图;图12是根据本发明实施例的一种可选的日志写入装置的示意图。
具体实施方式
30.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
31.需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品
或设备固有的其它步骤或单元。
32.为便于本领域技术人员理解本发明,下面对本发明各实施例中涉及的部分术语或名词做出解释:pm:persistent memory,持续内存,用于描述允许程序像内存一样可直接按字节寻址的数据访问技术,而其存储的内容是非易失性的,可在整个电源循环中保存。
33.rdma:remote direct memory access,远程直接内存访问,是一种直接内存访问技术,可以将数据直接从一台计算机的内存中传输至另一台计算机的内存中。
34.pg:placement group,放置群组,逻辑性地把一些实例放置在一个组里面,在这个组里面的实例能够享受低延迟、高网络吞吐的网络。
35.reropar:raft enhanced replication based on optane pmm and rdma。
36.monitor:集群的监控进程。
37.cs:chunkserver,存储节点。
38.rv:request vote,投票请求。
39.aer:appendentries result,follower处理完来自leader的日志后,给leader返回处理结果。
40.cs-rpc:chunkserver-rpc,chunkserver之间用来同步raft消息的rpc。
41.pg-manager:管理pg的模块。
42.本发明下述各实施例可应用于各种日志写入的系统/应用/设备中。本发明通过基于rdma和pm加快raft写日志的reropar方案,通过添加日志到发送队列,之后轮询发送队列,以获取要发送的日志,然后使用rdma将日志写到pm内存中,可以完成对存储节点上rdma网络和pm内存的管理,并以节点为粒度来划分pm内存,能够更好的管理pm内存,还可以基于发送窗口进行日志写入处理,能够保证日志的发送顺序,同时,通过选举前通过轮询处理pm内存中的日志,可以确保该pg的日志达到最新的状态。
43.下面结合各个实施例来详细说明本发明。
44.实施例一根据本发明实施例,提供了一种日志写入方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
45.图3是根据本发明实施例的一种可选的日志写入方法的流程图,如图3所示,该方法包括如下步骤:步骤s302,接收客户端的写日志请求,其中,写日志请求携带有日志标识。
46.步骤s304,基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,其中,每个存储节点中设置有多个放置群组,多个放置群组包括:主放置群组以及至少一个从放置群组,每个放置群组绑定一个一致性协议,发送队列设置在数据存储器中。
47.步骤s306,采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,其中,在日志写入成功的情况下,从放置群组通过一致性协议返回写入成功信息至主放置群组。
48.步骤s308,在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。
49.通过上述步骤,可以接收客户端的写日志请求,基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。在本发明实施例中,可以将主放置群组写入的日志添加到发送队列中,通过远程访问网络,轮询发送队列,并将发送队列中的日志依次写入到从放置群组的内存中,能够在存储节点中具有多个放置群组的情况下,成功将日志写入到不同的从放置群组的内存中,保证了各个放置群组中的日志的一致性,进而解决了相关技术中无法在具有多个放置群组的情况下进行日志写入,容易导致日志不一致的技术问题。
50.下面结合上述各步骤对本发明实施例进行详细说明。
51.在本发明实施例中,基于rdma技术和pm技术提出了一种加快raft写日志的reropar结构,图4是根据本发明实施例的一种可选的reropar结构的示意图,如图4所示,reropar是个全局模块,负责接收monitor的命令,对子模块进行管理,在reropar中包括两个子模块:net和messenger,其中,net模块负责建立存储节点之间的连接,并进行数据传输,messenger模块负责轮询pm内存,取日志交给raft,并且,在一台存储节点(每个存储节点都具有存储节点管理器chunkserver manager)上可以存储多个不同pg的副本,每一个pg副本绑定一个raft实例来保证一致性,同时,每一个pg对应有一个reropar-agent(即代理agent),该agent负责判断对raft的操作,如,初始化raft、将raft日志写入磁盘、raft状态机应用日志等则继续原有的流程,而raft发送日志的请求则转到reropar模块进行操作。
52.在本发明实施例中,一种可选的,在接收客户端的写日志请求之前,还包括:控制监控模块循环检测存储节点,得到检测结果;在检测结果指示所有存储节点中的日志都存入到磁盘的情况下,开启写入程序。
53.在本实施例中,在存储节点启动时,可以先初始化全局的reropar模块,由全局reropar去管理各子模块,reropar初始化时可以向monitor订阅视图,并等待接收monitor下发的命令。
54.图5是根据本发明实施例的一种可选的reropar启动过程的示意图,如图5所示,reropar的启动过程分为两阶段:loop阶段和write阶段。存储集群(包括:chunkserver0、chunkserver1、chunkserver2等)在工作过程中可能会存在节点宕机,在重启之后pm内存中可能会有之前操作留下的日志,这些日志可能是已经被提交的,因此,需要通过monitor(即监控模块)在loop阶段将存储集群中的这些日志项存入到磁盘中(即下发开始loop命令),当三个节点(即chunkserver0、chunkserver1、chunkserver2)都loop完,给monitor返回loop完成之后,monitor下发第二段开始write的启动命令,在三个节点返回启动完成后,reropar正式开始工作(即监控模块循环检测存储节点,并在检测结果指示所有存储节点中的日志都存入到磁盘的情况下,开启写入程序)。
55.可选的,在接收客户端的写日志请求之前,还包括:统计存储节点的节点数量;基于存储节点的节点数量,划分每个存储节点中的内存空间,得到多个内存子空间,其中,每个内存空间中至少包括:元数据空间。
56.在本发明实施例中,reropar模块可以通过rdma协议发送日志数据,因此,需要知道该pg在对端节点上能够操作的内存区域。如果为节点上的每个pg都分配一块pm内存,专门存放该pg的日志数据,会造成如下问题:(1)节点的pg随时都在变化,当硬盘故障时,pg数据可能迁移到其他节点,使管理内存变得更加复杂;(2)pg数目很大时,每个pg能分到的内存有限,日志条目如果没有及时的从pm中取走,会造成数据丢失,或者使用一些重发机制进一步增大了存储的时延。
57.在本实施例中,为解决为每个pg都划分一部分内存带来的问题,reropar模块可以以节点为粒度对pm进行划分。在获取内存视图时,可以获取集群节点的个数(即存储节点的节点数量),以及每个节点能够操作的内存区域,之后,可以基于存储节点的节点数量,划分每个存储节点中的内存空间(即每个节点能够操作的内存区域),得到多个内存子空间,其中,每个内存空间中至少包括:元数据空间,用来存储reropar模块用到的元数据,还可以设置保留区。
58.可选的,在划分每个存储节点中的内存空间,得到多个内存子空间之后,还包括:基于预设连接数,将内存子空间划分成多个存储块,其中,预设连接数为每两个存储节点之间的线程连接数量。
59.在本发明实施例中,可以基于预设的子空间块数(即预设连接数),将内存子空间划分成多个存储块,并将每个存储块绑定到对应线程上,同时对每个存储块建立rdma连接,具体为,reropar可以在多个内存子空间基础上对每个节点的内存区域做更细致的划分,从而能够充分利用cpu的多核性能。本实施例中,reropar在每两个节点间都可以创建固定数目的连接(即每两个存储节点之间的线程连接数量),将连接分散到各个cpu核心上,并且为每个连接划分一段可以操作的pm内存(即基于预设连接数,将内存子空间划分成多个存储块)。在实际环境中,每个存储节点所拥有的cpu核数不一定相同,可以根据实际环境来创建连接,在此不做限制。
60.图6是根据本发明实施例的一种可选的reropar内存划分的示意图,如图6所示,以三个存储节点(即chunkserver0、chunkserver1、chunkserver2)为例进行分析,chunkserver0将内存空间pm分为4个部分:第一部分为元数据区域(可以设为8kb),用来存储reropar模块用到的元数据;第二部分为保留区;第三、第四部分是用来接收该节点上的follower pg日志数据的区域(即除去本身chunkserver外,接收其他两个chunkserver的日志数据的区域),即除去元数据区域以及保留区以外,剩下的区域根据节点的个数来划分。并且,将chunkserver用来接收日志的内存区域划分成细致的section(即section0到section6),并为7个section创建多个连接分散到不同的cpu核心进行处理。
61.可选的,本实施例可以将section划分为独立的页面page,并使用循环队列来管理。leader写日志到follower的section前需要知道page队列尾的位置,将新的日志添加到队列尾,在写完一条日志之后需要更新队尾。
62.步骤s302,接收客户端的写日志请求,其中,写日志请求携带有日志标识。
63.在本发明实施例中,在reropar模块开启后,写日志请求可以交由reropar来处理。reropar模块中的agent可以接收客户端的写日志请求(该写日志请求携带有日志标识),将相应的日志写入到多个pg副本中保存。
64.步骤s304,基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内
存中写入日志标识指示的日志,并将日志添加到发送队列中,其中,每个存储节点中设置有多个放置群组,多个放置群组包括:主放置群组以及至少一个从放置群组,每个放置群组绑定一个一致性协议,发送队列设置在数据存储器中。
65.在本发明实施例中,reropar在接收agent传输的写日志请求后,可以控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,之后,通过rdma同步到其他副本节点注册的pm内存中以确保日志的一致性。本实施例中,每个存储节点中设置有多个放置群组(即副本pg),多个放置群组包括:主放置群组(即副本pg中的leader)以及至少一个从放置群组(即副本pg中的follower),每个放置群组绑定一个一致性协议(如raft),发送队列设置在数据存储器(即用于传输数据的net模块)中。
66.可选的,在将日志添加到发送队列中之后,还包括:按照日志添加到发送队列中的顺序,为日志设置日志索引;分析从放置群组的节点状态;在节点状态为探测状态的情况下,控制主放置群组探测从放置群组中每个日志的日志索引;在探测出从放置群组中的日志索引与主放置群组中的日志索引不一致的情况下,采用预设远程调用算法,将不一致的日志索引所指示的日志发送到从放置群组中。
67.在本发明实施例中,可以按照日志添加到发送队列中的顺序,为日志设置日志索引,并按照日志索引的顺序传输日志。本实施例中,raft可以将pg副本分为多个状态,并根据不同的状态采取不同的操作。在一个集群的运行过程中,某个pg副本的日志可能会由于故障原因落后leader很多,或者是存在一些无效的日志,此时该副本pg(即从放置群组)处于探测状态probe,在接收到leader日志后不会持久化,而是给leader返回错误,leader继续探测与follower一致的日志索引,这种探测状态下,日志不需要持久化,因此也就不需要写入pm内存,而是通过预设远程调用算法(如rpc)发送日志(即在分析到节点状态为探测状态的情况下,控制主放置群组探测从放置群组中每个日志的日志索引,在探测出从放置群组中的日志索引与主放置群组中的日志索引不一致的情况下,采用预设远程调用算法,将不一致的日志索引所指示的日志发送到从放置群组中)。当follower的日志和leader日志同步之后,此时raft进入正常的工作状态(即按照日志索引正常写入日志),并且,此时reropar-agent将拦截其他为副本pg写日志的请求。
68.图7是根据本发明实施例的一种可选的reropar发送日志的过程的示意图,如图7所示,管理pg的模块pg-manager向代理agent模块发送同步日志请求,agent模块判断当前状态(即当前副本pg的状态),在当前副本pg处于探测状态probe的情况下,agent模块向cs-rpc发送日志,cs-rpc在处理后,返回aer(appendentriesresult)(即处理结果)给pg-manager。如果当前副本pg处于正常状态的情况下,agent模块在pipeline模式下(其中,pipeline与probe相对应,即是一个正常工作的状态),添加日志到队列中(该队列位于net模块中),然后,遍历队列,写日志到pm中,并返回模拟aer到agent模块,在通过agent模块返回模拟aer到pg-manager中。
69.可选的,在采用远程访问网络访问数据存储器,轮询发送队列之前,还包括:将日志划分为预设个数的页面,其中,每个页面对应有一个上下文信息,上下文信息至少包括:页面的写入状态、页面索引;设置发送窗口,其中,发送窗口为通过预设个数的子窗口组成的循环窗口;计算日志要写入的内存子空间中空闲存储块的页面数量和空闲子窗口的页面
上下文数量;在空闲存储块的数量和空闲子窗口的数量都大于预设阈值的情况下,为每个页面分配一个空闲子窗口。
70.在本发明实施例中,reropar可以将日志分为预设个数的页面page(例如,3个page),每次使用rdma write发送一个page,一个完整的日志完成之后需要更新对端section的队尾。然而,由于可能存在的网络故障,会出现最后发送的page返回了处理结果,而先发送的page未返回,导致整个日志写入请求出错。因此,reropar可以设置发送窗口(send window)来保证发送请求的顺序性,解决部分page发送失败的问题。发送窗口是一个固定长度的循环队列(即发送窗口为通过预设个数的子窗口组成的循环窗口),循环队列中的每个元素(即发送窗口中的每个字窗口)存储rdma写操作的上下文context(即上下文信息),即一个page对应的上下文(即每个页面对应有一个上下文信息),上下文中包含了这个page是否写成功,该page是否为日志请求的最后一页等信息(即上下文信息至少包括:页面的写入状态、页面索引等)。当一个日志的最后一个page发送完成,则更新对端section的队尾,之后模拟appendentries result给raft处理。
71.本实施例中,在写日志之前,需要计算日志要写入的内存子空间中空闲存储块(也可以是指空闲存储对象)的数量(即section的数量)和空闲子窗口的数量,在空闲存储块的数量和空闲子窗口的数量都大于预设阈值(例如,0)的情况下,为每个页面分配一个空闲子窗口。
72.步骤s306,采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,其中,在日志写入成功的情况下,从放置群组通过一致性协议返回写入成功信息至主放置群组。
73.在本发明实施例中,可以采用远程访问网络(即rdma网络)访问数据存储器,轮询发送队列,通过rdma write操作将发送队列中的日志写入到从放置群组(即副本pg中的follower)的内存中,并且,在日志写入成功的情况下,从放置群组可以通过一致性协议返回写入成功信息至主放置群组(即leader)。
74.可选的,采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中的步骤,包括:采用远程访问网络访问数据存储器,轮询发送队列,并在轮询成功的情况下,将轮询到的日志的页面的写入状态更新为完成状态;遍历发送窗口,在发送窗口中每个子窗口中的当前页面的写入状态都为完成状态的情况下,分析当前页面的页面索引是否为最后一个索引;在当前页面的页面索引为最后一个索引的情况下,更新写入的内存子空间中的存储块的队列尾,并更新发送窗口的队列头。
75.在本发明实施例中,在写日志的过程中,reropar-net会不断的从本端的发送队列取日志,在写入对端section前计算对端的空闲存储块的数量(即空闲page数)以及本端发送窗口空闲子窗口数目,判断能否完成这次写请求,否则等待对端messenger释放page。如果发送窗口头元素所对应的page发送成功,则将该元素出队列,否则重发这个page,后续的page即使发送成功也不会更新section队尾,因此,整个写过程可以保证日志顺序。
76.图8是根据本发明实施例的一种可选的reropar-net写日志的过程的示意图,如图8所示,在采用远程访问网络访问数据存储器,轮询发送队列之前,计算日志要写入的内存子空间中空闲存储块的页面数量和空闲子窗口的页面上下文数量,判断空闲存储块的数量和空闲子窗口的数量是否都大于预设阈值(在图8中,设预设阈值为0),在空闲存储块的数
量和空闲子窗口的数量都大于预设阈值的情况下,为每个页面分配一个空闲子窗口,否则重新计算,采用rdma write轮询发送队列,判断轮询是否成功,在轮询不成功的情况下,将日志的页面的写入状态更新为失败状态,在轮询成功的情况下,将轮询到的日志的页面的写入状态更新为完成状态,遍历发送窗口,判断每个子窗口中的当前页面的写入状态是否都为完成状态,在发送窗口中每个子窗口中的当前页面的写入状态都为完成状态的情况下,分析当前页面的页面索引是否为最后一个索引,否则停止遍历,并重新采用rdma write轮询发送队列,在当前页面的页面索引为最后一个索引的情况下,更新写入的内存子空间中的存储块的队列尾,并更新发送窗口的队列头,否则直接更新发送窗口的队列头。
77.可选的,使用rdma write单边操作将日志写到follower的pm内存中,follower不参与写日志的过程,因此,messenger模块负责从pm获取日志,并交给raft处理。
78.图9是根据本发明实施例的一种可选的reropar轮询日志处理过程的示意图,如图9所示,在轮询循环过程中,messenger模块负责从pm中取日志,并调用接口将日志交给reropar模块,reropar模块调用接口并将日志交给pgmanager模块,pgmanager模块调用接口并将日志交给raft模块,之后raft模块处理日志,并将处理结果(即ae result)返回给pgmanager模块,pgmanager模块将ae result返回给agent模块,agent模块将ae result返回给messenger模块,最后由messenger模块调整section队头。
79.步骤s308,在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。
80.在本发明实施例中,一致性协议返回写入成功信息才可以确定日志写入成功,从而可以保证日志的一致性,因此,本实施例在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。
81.可选的,为每个放置群组设置一个代理组件;在代理组件收到主放置群组发送的选举投票请求的情况下,遍历从放置群组中的内存,以分析从放置群组中的日志是否处理完成;在从放置群组中的日志处理完成的情况下,通过与从放置群组连接的代理组件将选举投票请求发送至从放置群组,其中,从放置群组在确定选举投票请求中携带的日志索引大于从放置群组中的日志索引的情况下,返回投票结果。
82.在本发明实施例中,为了保证raft日志有序,follower(即从放置群组)在投票前需要确保该pg的日志都已经处理完毕,然后才可以处理投票请求,因此,一个reropar-agent(即代理组件,每个放置群组都设置一个代理组件)在收到投票请求后,需要通过messenger模块遍历pm内存,以确保日志都处理完毕(即在代理组件收到主放置群组发送的选举投票请求的情况下,遍历从放置群组中的内存,以分析从放置群组中的日志是否处理完成),在从放置群组中的日志处理完成的情况下,通过与从放置群组连接的代理组件将选举投票请求发送至从放置群组,follower在收到投票请求后去判断该请求所携带的term(日志条目)和日志的index(索引),如果投票请求term和index小于本节点的日志term和index,则可以直接丢弃该投票或者返回不投票,否则返回投票结果(即从放置群组在确定选举投票请求中携带的日志索引大于从放置群组中的日志索引的情况下,返回投票结果)。
83.图10是根据本发明实施例的一种可选的reropar处理投票请求的示意图,如图10所示,agent模块发送轮询请求至messenger模块,messenger模块在接收到轮询请求后,轮询pm内存,并将轮询的通知结果发送给agent模块,agent模块在判断日志都处理完毕后,发
送投票请求给cs-rpc模块。
84.可选的,reropar的停止过程分为两阶段:先停止write,之后停止loop,采用两阶段停止过程可以有效的防止pm中仍有未处理的日志,当reropar收到停止write的命令后,reropar-agent不再拦截raft日志,raft日志可以通过其他模块来发送,已截获的raft日志仍通过reropar-net发送,所有节点都完成之后,回复monitor,monitor下发第二段的停止loop命令,此阶段,reropar-messenger处理pm中已经写成功的日志,处理完成之后则真正停止成功。
85.图11是根据本发明实施例的一种可选的reropar停止过程的示意图,如图11所示,reropar的停止过程分为两阶段:停止write阶段和停止loop阶段。当monitor模块发出停止write的命令后,存储集群(包括:chunkserver0、chunkserver1、chunkserver2等)停止接收日志写入命令,并分别向monitor模块返回停止write完成,monitor模块在接收到停止write完成之后,发出停止loop命令,在各chunkserver处理完成pm中已经写成功的日志之后,向monitor模块返回停止完成,则真正停止成功。
86.本发明实施例中,提出了一种基于rdma和pm加速raft写日志的reropar方案,该reropar可以完成对存储节点上rdma网络和pm内存的管理,可以以存储节点为粒度来划分pm内存,能够更好的管理pm内存,并且可以利用cpu多核心提高写日志的速度,还可以处理来自同一个存储节点上的所有pg的写日志请求,并通过设置发送窗口来保证日志的发送顺序,同时,可以将reropar启动和停止过程分为两阶段,从而保证了日志完整,此外,reropar还提出了pg角色变更时的处理方案,选举前通过轮询处理pm内存中的日志,能够确保该pg的日志达到最新的状态。
87.实施例二本实施例中提供的一种日志写入装置包含了多个实施单元,每个实施单元对应于上述实施例一中的各个实施步骤。
88.图12是根据本发明实施例的一种可选的日志写入装置的示意图,如图12所示,该写入装置可以包括:接收单元120,添加单元121,写入单元122,确定单元123,其中,接收单元120,用于接收客户端的写日志请求,其中,写日志请求携带有日志标识;添加单元121,用于基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,其中,每个存储节点中设置有多个放置群组,多个放置群组包括:主放置群组以及至少一个从放置群组,每个放置群组绑定一个一致性协议,发送队列设置在数据存储器中;写入单元122,用于采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,其中,在日志写入成功的情况下,从放置群组通过一致性协议返回写入成功信息至主放置群组;确定单元123,用于在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。
89.上述写入装置,可以通过接收单元120接收客户端的写日志请求,通过添加单元121基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,通过写入单元122采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,通过确定单元
123在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。在本发明实施例中,可以将主放置群组写入的日志添加到发送队列中,通过远程访问网络,轮询发送队列,并将发送队列中的日志依次写入到从放置群组的内存中,能够在存储节点中具有多个放置群组的情况下,成功将日志写入到不同的从放置群组的内存中,保证了各个放置群组中的日志的一致性,进而解决了相关技术中无法在具有多个放置群组的情况下进行日志写入,容易导致日志不一致的技术问题。
90.可选的,写入装置还包括:第一统计模块,用于在接收客户端的写日志请求之前,统计存储节点的节点数量;第一划分模块,用于基于存储节点的节点数量,划分每个存储节点中的内存空间,得到多个内存子空间,其中,每个内存空间中至少包括:元数据空间。
91.可选的,写入装置还包括:第二划分模块,用于在划分每个存储节点中的内存空间,得到多个内存子空间之后,基于预设连接数,将内存子空间划分成多个存储块,其中,预设连接数为每两个存储节点之间的线程连接数量。
92.可选的,写入装置还包括:第一设置模块,用于在将日志添加到发送队列中之后,按照日志添加到发送队列中的顺序,为日志设置日志索引;第一分析模块,用于分析从放置群组的节点状态;第一探测模块,用于在节点状态为探测状态的情况下,控制主放置群组探测从放置群组中每个日志的日志索引;第一发送模块,用于在探测出从放置群组中的日志索引与主放置群组中的日志索引不一致的情况下,采用预设远程调用算法,将不一致的日志索引所指示的日志发送到从放置群组中。
93.可选的,写入单元包括:第一更新模块,用于采用远程访问网络访问数据存储器,轮询发送队列,并在轮询成功的情况下,将轮询到的日志的页面的写入状态更新为完成状态;第二分析模块,用于遍历发送窗口,在发送窗口中每个子窗口中的当前页面的写入状态都为完成状态的情况下,分析当前页面的页面索引是否为最后一个索引;第二更新模块,用于在当前页面的页面索引为最后一个索引的情况下,更新写入的内存子空间中的存储块的队列尾,并更新发送窗口的队列头。
94.可选的,写入装置还包括:第三划分模块,用于在采用远程访问网络访问数据存储器,轮询发送队列之前,将日志划分为预设个数的页面,其中,每个页面对应有一个上下文信息,上下文信息至少包括:页面的写入状态、页面索引;第二设置模块,用于设置发送窗口,其中,发送窗口为通过预设个数的子窗口组成的循环窗口;第一计算模块,用于计算日志要写入的内存子空间中空闲存储块的页面数量和空闲子窗口的页面上下文数量;第一分配模块,用于在空闲存储块的数量和空闲子窗口的数量都大于预设阈值的情况下,为每个页面分配一个空闲子窗口。
95.可选的,写入装置还包括:第三设置模块,用于为每个放置群组设置一个代理组件;第一遍历模块,用于在代理组件收到主放置群组发送的选举投票请求的情况下,遍历从放置群组中的内存,以分析从放置群组中的日志是否处理完成;第二发送模块,用于在从放置群组中的日志处理完成的情况下,通过与从放置群组连接的代理组件将选举投票请求发送至从放置群组,其中,从放置群组在确定选举投票请求中携带的日志索引大于从放置群组中的日志索引的情况下,返回投票结果。
96.可选的,写入装置还包括:第一检测模块,用于在接收客户端的写日志请求之前,控制监控模块循环检测存储节点,得到检测结果;第一开启模块,用于在检测结果指示所有
存储节点中的日志都存入到磁盘的情况下,开启写入程序。
97.上述的写入装置还可以包括处理器和存储器,上述接收单元120,添加单元121,写入单元122,确定单元123等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
98.上述处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来确定日志写入成功。
99.上述存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram),存储器包括至少一个存储芯片。
100.本技术还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序:接收客户端的写日志请求,基于写日志请求,控制每个存储节点中的主放置群组在预先分配的内存中写入日志标识指示的日志,并将日志添加到发送队列中,采用远程访问网络访问数据存储器,轮询发送队列,将发送队列中的日志写入到从放置群组的内存中,在主放置群组接收到所有从放置群组返回的写入成功信息的情况下,确定日志写入成功。
101.根据本发明实施例的另一方面,还提供了一种电子设备,包括:处理器;以及存储器,用于存储处理器的可执行指令;其中,处理器配置为经由执行可执行指令来执行上述的日志写入方法。
102.根据本发明实施例的另一方面,还提供了一种计算机可读存储介质,计算机可读存储介质包括存储的计算机程序,其中,在计算机程序运行时控制计算机可读存储介质所在设备执行上述的日志写入方法。
103.上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
104.在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
105.在本技术所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
106.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
107.另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
108.所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式
体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
109.以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1