发明内容
针对上述已有的数据复制技术所产生的问题,本发明提出了增量合并与全量相结合的集群节点间键值数据异步复制的方法,实现了在高频金融指标计算场景下指标数据的复制,其中指标数据以键值形式存储。
本发明的目的是通过以下技术方案来实现的:一种增量合并与全量相结合的集群节点间键值数据异步复制方法,该方法具体包括以下步骤:
(1)键值数据复制操作类型的定义,具体分为三种形式:SET(key,value):设置键为key的值为value,若key存在,则操作失败;PUT(key,value):设置键为key的值为value,若key存在,则覆盖原值;DELETE(key):删除键为key的值,若key不存在,则操作失败。
每种键值数据复制操作类型分别对应一个接口,所述接口分为主节点端和备节点端,两端有一样的接口函数,但所需参数个数不同,具体接口包括set(key,value,version_start,version_end)、put(key,value,version_start,version_end)和delete(key,version_start,version_end);
主节点端的接口接受各操作类型操作成功的请求,对于备节点端的接口,主节点端将version_start到version_end之间各操作类型的请求合并成一个指令,备节点端的接口接受该指令并执行,所述version_start和version_end分别代表合并的请求的起始版本号和末尾版本号。
(2)键值对修改请求的合并:当若干键值对修改请求被主节点端成功执行后,主节点端将version_start到version_end之间所有键值对修改的请求合并成一个指令发送到备节点端,备节点端接收指令并执行合并请求,具体步骤如下:
(2.1)对若干键值对中每个键维护一个版本号,初始为0,主节点端每接收一个该键的请求,版本号增加1,该版本号单调递增。
(2.2)执行请求合并,修改合并状态。合并状态包含:请求类型、键、值和版本号。其中请求类型包含EMPTY、SET、PUT、DELETE。初始状态下,请求类型为EMPTY,键和值为空,版本号为上次复制成功的最新版本号。
(2.3)若主节点端接收了SET请求SET(key,value):合并状态的请求类型为EMPTY或DELETE,则设置请求类型为SET,并设置键为key,值为value,并为版本号加1;
(2.4)若主节点端接收了PUT请求PUT(key,value):则设置请求类型为PUT,并设置键为key,值为value,并为版本号加1;
(2.5)若主节点端接收了DELETE请求DELETE(key):合并状态的请求类型为EMPTY、SET或PUT,则设置请求类型为DELETE,并设置键为key,值为空,并为版本号加1;
(3)增量数据的复制:
(3.1)指定一个参数限制步骤(2)中合并请求的个数,当个数达到该限制后,根据最终得到的合并状态生成复制请求,具体如下:
a)若合并状态中的请求类型为SET,则生成的复制请求为SET请求;
b)若合并状态中的请求类型为PUT,则生成的复制请求为PUT请求;
c)若合并状态中的请求类型为DELETE,则生成的复制请求为DELETE请求;
复制请求会捎带上一次复制的最新版本号和合并请求的最新版本号,对应参数分别为version_start和version_end;其中version_start为上一次复制后的version_end。
(3.2)复制请求生成后,主节点端将请求发送给备节点端,等待备节点端的响应。若备节点端响应正常,则这次增量数据的复制成功。
(3.3)备节点端收到主节点端的复制请求,首先检查本地副本中与复制请求相关的键值对版本号version,若复制请求中的version_start不超过version,则执行复制请求,并更新版本号version为复制请求中的version_end。
(4)全量复制的探测:探测通过版本号进度的追踪进行,该探测发生在备节点端处。在步骤(3.3)中,若复制请求中的version_start超过本地版本号version,备节点端就检测到需要全量复制。此时备节点端会响应给主节点端异常,要求主节点发送全量数据进行全量复制。
(a)主节点端接收到备节点端的异常响应后,则开始全量复制。主节点端获取存储保存的键值对数据,并使用SET请求将数据复制到备节点端,并捎带键值对的最新版本号version_end,而请求的version_start为空;
(b)备节点端收到全量复制请求后,首先删除原有的数据,然后执行SET操作,并更新本地版本号version为version_end。
进一步地,步骤(1)中,每种键值数据复制操作类型对应的接口具体如下:
set(key,value,version_start,version_end):对于主节点端,该接口接受一个操作成功的SET请求,且version_start和version_end值为空,对于备节点端,version_start和version_end非空,该接口接受主节点端合并的SET请求,主节点端将version_start和version_end之间的SET请求合并成一个指令发送到备节点端,备节点端执行SET操作;
put(key,value,version_start,version_end):对于主节点端,该接口接受一个操作成功的PUT请求,且version_start和version_end值为空;对于备节点端,version_start和version_end非空,该接口接受主节点端合并的PUT请求,主节点端将version_start和version_end之间的PUT请求合并成一个指令发送到备节点端,备节点端执行PUT操作;
delete(key,version_start,version_end):对于主节点端,该接口接受一个操作成功的DELETE请求,且version_start和version_end值为空;对于备节点端,version_start和version_end非空,该接口接受主节点端合并的DELETE请求,主节点端将version_start和version_end之间的DELETE请求合并成一个指令发送到备节点端,备节点端执行DELETE操作。
进一步地,所述接口用于键值存储,包括RocksDB、Memcache,因而接口可以接入不同的键值存储系统,使得这些非分布式的键值存储获得集群间数据复制的能力。
该方法提供了下面的有益效果:
(1)指标数据以键值形式表示,并进行异步复制,保证了低延时和高吞吐;
(2)指标修改的请求在复制前会进行合并,作为复制的增量数据,从而可以进行增量复制,从而降低网络带宽的消耗;
(3)默认情况下为增量复制,即复制合并后的指标修改请求,但当备节点数据新旧程度远远落后于主节点,主节点会触发全量复制,将本地保存的数据复制到备节点上,从而降低了追赶时间;
(4)该复制方法具有高度的通用性,可以应用到不同的键值存储系统,如RocksDB、Memcached等。
具体实施方式
以一个实施例的方式,对上述增量合并与全量相结合的集群节点间键值数据异步复制的方法进行进一步的说明。
本发明提供了一种增量合并与全量相结合的集群节点间键值数据异步复制方法,该方法具体包括以下步骤:
(1)键值数据复制操作类型的定义,具体分为三种形式:SET(key,value):设置键为key的值为value,若key存在,则操作失败;PUT(key,value):设置键为key的值为value,若key存在,则覆盖原值;DELETE(key):删除键为key的值,若key不存在,则操作失败。
每种键值数据复制操作类型分别对应一个接口,所述接口分为主节点端和备节点端,两端有一样的接口函数,但所需参数个数不同,具体接口包括set(key,value,version_start,version_end)、put(key,value,version_start,version_end)和delete(key,version_start,version_end);
主节点端的接口接受各操作类型操作成功的请求,对于备节点端的接口,主节点端将version_start到version_end之间各操作类型的请求合并成一个指令,备节点端的接口接受该指令并执行,所述version_start和version_end分别代表合并的请求的起始版本号和末尾版本号。
每种键值数据复制操作类型对应的接口具体如下:
set(key,value,version_start,version_end):对于主节点端,该接口接受一个操作成功的SET请求,且version_start和version_end值为空,对于备节点端,version_start和version_end非空,该接口接受主节点端合并的SET请求,主节点端将version_start和version_end之间的SET请求合并成一个指令发送到备节点端,备节点端执行SET操作;
put(key,value,version_start,version_end):对于主节点端,该接口接受一个操作成功的PUT请求,且version_start和version_end值为空;对于备节点端,version_start和version_end非空,该接口接受主节点端合并的PUT请求,主节点端将version_start和version_end之间的PUT请求合并成一个指令发送到备节点端,备节点端执行PUT操作;
delete(key,version_start,version_end):对于主节点端,该接口接受一个操作成功的DELETE请求,且version_start和version_end值为空;对于备节点端,version_start和version_end非空,该接口接受主节点端合并的DELETE请求,主节点端将version_start和version_end之间的DELETE请求合并成一个指令发送到备节点端,备节点端执行DELETE操作。
所述接口适用于大多数的键值存储,包括RocksDB、Memcache等,因而接口可以接入不同的键值存储系统,使得这些非分布式的键值存储获得集群间数据复制的能力。
(2)键值对修改请求(指标修改请求)的合并:主节点端会在后台进程接收键值对修改请求(该请求定义为原始请求),并执行请求合并(合并后的请求定义为合并请求),合并的执行以及下面步骤的执行均在后台进程中执行,前台数据修改请求成功后不需要等待复制完成。当若干键值对修改请求被主节点端成功执行后,主节点端将version_start到version_end之间所有键值对修改的请求合并成一个指令发送到备节点端,备节点端接收指令并执行合并请求,合并状态的请求类型变化状态图如图1所示,具体步骤如下:
(2.1)对若干键值对中每个键维护(maintain)一个版本号,初始为0,主节点端每接收一个该键的请求,版本号增加1,该版本号单调递增。
(2.2)执行请求合并,修改合并状态。合并状态包含:请求类型、键、值和版本号。其中请求类型包含EMPTY、SET、PUT、DELETE。初始状态下,请求类型为EMPTY,键和值为空,版本号为上次复制成功的最新版本号。
(2.3)若主节点端接收了SET请求SET(key,value):合并状态的请求类型为EMPTY或DELETE,则设置请求类型为SET,并设置键为key,值为value,并为版本号加1;合并的初始请求状态不可能为PUT,所以忽略。
(2.4)若主节点端接收了PUT请求PUT(key,value):则设置请求类型为PUT,并设置键为key,值为value,并为版本号加1;
(2.5)若主节点端接收了DELETE请求DELETE(key):合并状态的请求类型为EMPTY、SET或PUT,则设置请求类型为DELETE,并设置键为key,值为空,并为版本号加1;合并的初始请求类型不可能为DELETE,所以忽略。
(3)增量数据的复制,如图2所示:
(3.1)指定一个参数限制步骤(2)中合并请求的个数,当个数达到该限制后,根据最终得到的合并状态生成复制请求,具体如下:
a)若合并状态中的请求类型为SET,则生成的复制请求为SET请求;
b)若合并状态中的请求类型为PUT,则生成的复制请求为PUT请求;
c)若合并状态中的请求类型为DELETE,则生成的复制请求为DELETE请求;
复制请求会捎带上一次复制(不论成功与否)的最新版本号和合并请求的最新版本号,对应参数分别为version_start和version_end;其中version_start为上一次复制后的version_end。
(3.2)复制请求生成后,主节点端将请求发送给备节点端,等待备节点端的响应。若备节点端响应正常,则这次增量数据的复制成功。
(3.3)备节点端收到主节点端的复制请求,首先检查本地副本中与复制请求相关的键值对版本号version,若复制请求中的version_start不超过version,则执行复制请求,并更新版本号version为复制请求中的version_end。
(4)全量复制的探测:探测通过版本号进度的追踪进行,该探测发生在备节点端处。在步骤(3.3)中,若复制请求中的version_start超过本地版本号version,备节点端就检测到需要全量复制。此时备节点端会响应给主节点端异常,要求主节点发送全量数据进行全量复制。
(a)主节点端接收到备节点端的异常响应后,则开始全量复制。主节点端获取存储保存的键值对数据,并使用SET请求将数据复制到备节点端,并捎带键值对的最新版本号version_end,而请求的version_start为空;
(b)备节点端收到全量复制请求后,首先删除原有的数据,然后执行SET操作,并更新本地版本号version为version_end。
本发明实施例有如下假设:
1)实施例中的计算指标为“某人历史交易的单笔最大金额”,这在金融风控领域是一个常见的计算指标;
2)假设某人A,他连续产生了5笔流水,分别交易了100元、95元、105元、90元、110元,且之前A没有产生任何流水;
3)该复制设置的原始请求个数的阈值为5;
4)该实施例中,共有1个主节点,1个备节点,流水由主节点处理,主节点处理过后的指标数据将会复制到备节点上。
首先说明正常情况下的异步增量合并的复制:
1)根据实施例中第1)个假设所计算的指标,第2)个假设会产生5个修改指标数据的原始请求,分别为SET(A,100),PUT(A,100),PUT(A,105),PUT(A,105)和PUT(A,110);
2)根据本发明合并状态的请求类型变化过程,上述步骤产生的5个原始修改请求分别拥有版本号1、2、3、4和5,并合并得到一个增量的合并请求PUT(A,110),起始版本号version_start为0,末尾版本号version_end为5。合并的执行以及下面步骤的执行均在后台进程中执行,前台数据修改成功后不需要等待复制完成;
3)由于已经合并了5个请求,达到了设置的阈值,于是主节点将合并请求发送给备节点;
4)备节点对于键A保存的version为0,收到的请求为PUT(A,110),请求中起始版本号version_start为0,不小于本地保存的version,所以执行该请求,返回成功响应给主节点,整个异步增量复制结束。
整个异步增量合并复制的示意图如图3所示。整个复制流程,相较于普通的异步复制需要发送5个请求,本复制方法只需要发送1个请求,可以显著降低网络带宽的占用。
接下来说明全量复制的探测和全量复制的实施例。
该例子构建在图3所示的例子基础上:
1)在图3所示例子后,A又连续来了5笔流水,交易额分别为110、100、115、105、120,产生了PUT(A,110),PUT(A,110),PUT(A,115),PUT(A,115)和PUT(A,120)共5个原始请求,合并后的请求为PUT(A,120),起始版本号version_start为5,末尾版本号version_end为10;
2)由于网络故障,该合并请求未能成功发送到备节点,此时主节点拥有键为A的数据值为120,版本号为10,而备节点拥有键为A的数据值为110,版本号为5;
3)之后,A又连续来了5笔流水,交易额分别为200、300、400、500、600,产生了PUT(A,200),PUT(A,300),PUT(A,400),PUT(A,500)和PUT(A,600)共5个原始请求,合并后的请求为PUT(A,600),起始版本号version_start为10,末尾版本号version_end为15,而备节点拥有键为A的数据值为110,版本号为5;
4)主节点将3)的合并请求发送给备节点,备节点发现自己保存的版本号5小于请求中的起始版本号10,所以返回异常给主节点;
a)主节点收到异常后,从存储中获取A的全量数据(A,600),并附上版本号15,以SET请求形式发送全量复制请求给备节点;
b)备节点收到全量复制请求,执行请求,更新全量数据,返回成功响应给主节点,整个异步全量复制流程结束。
全量复制的检测和全量复制的示意图如图4所示。整个复制流程,相较于普通的异步复制追赶需要重新10个请求,本复制方法的全量复制也只需要发送1个请求,同样可以显著降低网络带宽的占用。
本发明实施效果如下:
为了验证该复制方法的效果,本发明方法接入了Memcache,并和普通的异步复制方案进行对比。而测试的方案如下列表所示:
服务端节点有2个,一个主节点,一个备节点;
客户端使用2个节点推送,线程总数为96,请求中SET/PUT/DELETE请求比例为1:1:1,其中SET/PUT请求的大小为1KB,请求中键分布满足zipf=0.9的分布,表现出一定的热点数据;
服务端和客户端节点硬件配置如下:
CPU:E5-2670 v3@2.30GHz 48逻辑核心;
内存:250GB;
网络带宽:10000Mbps;
测试经过10轮测试,测得吞吐量(每秒处理的记录数)、客户端延迟与网络带宽占用,取平均值,如下表1所示:
表1
方案 |
吞吐(每秒处理请求数) |
延迟/ms |
网络流量/(MB/s) |
普通异步复制 |
171130 |
1.68 |
223.2 |
本方案复制 |
271087 |
1.01 |
167.3 |
综上可知,本方案的复制吞吐较普通复制提升了58.4%,延迟降低了39.9%,网络流量降低了25.0%。本方案的复制能实现数据冗余,并满足实施金融计算所需的高吞吐、低延迟、低带宽占用的要求。
上述实施例用来解释说明本发明,而不是对本发明进行限制,在本发明的精神和权利要求的保护范围内,对本发明作出的任何修改和改变,都落入本发明的保护范围。