一种基于Redis集群的分布式动态杜鹃过滤系统及其过滤方法与流程

文档序号:14155064阅读:215来源:国知局

本发明涉及一种分布式动态杜鹃过滤系统,该系统可用于实现大规模、分布式的高性能海量数据管理平台,提高其数据检索性能,并显著降低内存开销,具体是一种基于Redis集群的分布式动态杜鹃过滤系统,属于数据库技术领域。



背景技术:

Redis是一个开源的key-value存储系统,由于其出众的性能,大部分互联网企业都用它来做服务器端缓存。Redis在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是面对云时代下的海量数据,完全无法满足业务的需求,因此,Redis在3.0版本以后就推出了集群模式。

Redis集群采用了P2P的模式,完全去中心化。Redis把所有的Key分成了16384个slot,每个Redis实例负责其中一部分slot。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。Redis客户端可以在任意一个Redis实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。

在面对分布式数据库如上述Redis集群中的海量数据时,我们需要一个索引数据结构,用来帮助查询,快速判断数据记录是否存在,这类数据结构叫过滤器,现在常用的选择是Bloom Filter(简称BF),然而原始的Bloom Filter无法在不重建的情况下删除数据,即使通过改进,仍然会造成空间开销过大的问题,例如Counting Bloom Filter。在此基础之上,由Cuckoo哈希表引申出的一个紧凑型变体Cuckoo Filter(简称CF)通过存储指纹信息弥补了Bloom Filter的缺陷,支持动态添加和删除数据,能够提供更好的数据查找性能,并且当假阳性概率小于3%时,相应的空间开销更小。但因为在面对未知大小的数据时无法支持容量伸缩使得其应用场景受到极大限制。在现有技术中,基于Dynamic Bloom Filter的Dynamic Cuckoo Filter(简称DCF),通过动态分配相同的CF并且以链表的形式连接来伸缩容量,从而满足数据大小动态变化的需求。

然而,上述的多种过滤器及其变体都是在现实技术中大都以单机形式存在,显然,在数据量极大的Redis集群中,单一节点的DCF已经无法满足我们的数据检索需求,因此期望提供一种兼顾时间空间效率并能够对Redis集群中海量数据进行高效检索的方案。



技术实现要素:

本发明的目的是提供一种克服上述问题或者至少部分地解决上述问题的方法。相对于传统的数据过滤器方案,本发明结合分布式存储系统和高效动态过滤器的特性,能够兼顾面对动态规模数据时的时间空间效率,大大提高海量数据的检索性能。

为了实现上述技术目的,本发明采用如下具体技术方案:

一种基于Redis集群的分布式动态杜鹃过滤系统,包括:

Redis客户端、基于Redis集群的DDCF系统中心模块以及多个基于Redis集群子节点的DDCF系统子节点;其中,

所述DDCF系统子节点包括Redis集群子节点及一个DCF;该DCF初始状态下只有一个CF并且当前CF指针curCF指向该CF,nextCF指针指向下一个CF;

多个DDCF系统子节点分布在一个具有2^32个均匀布点的圆环上;所述基于Redis集群的DDCF系统中心模块独立于圆环之外,用于完成系统的初始化、数据的接收到存储节点的映射以及子节点的全局管理;

所述DDCF系统子节点包括数据信息计算模块、数据操作模块以及结果反馈模块;其中,

所述数据信息计算模块用于利用所述系统管理模块发送的三元组中的信息计算数据的指纹信息和bucket候选位置信息并将其提供给数据操作模块;

所述数据操作模块根据Redis客户端发出命令需求进行相应的数据插入、数据查询或数据删除操作,并将操作结果提供给所述结果反馈模块;

所述结果反馈模块用于将数据操作结果反馈给Redis客户端。

所述基于Redis集群的DDCF系统中心模块包括系统初始化模块、系统管理模块、数据接收模块、存储节点选择模块以及节点故障检测模块;

所述系统初始化模块,用于利用一致性哈希算法部署Redis集群,并在各真实节点上附加一个DCF;

所述数据接收模块,用于接收来自Redis客户端传入的数据及指令并将其提供给存储节点选择模块;

所述存储节点选择模块,用于计算传入数据的键信息的哈希值,并根据该哈希值和传入指令选择相应子节点构造数据、哈希值、操作类型的三元组交由所述系统管理模块发送至相应子节点;

所述系统管理模块,用于完成子节点的数据分配,同时,该模块还负责子节点的全局管理;

所述节点故障检测模块,用于定期检测子节点的运行状态,若节点出现故障则通知所述系统管理模块进行节点更换及数据转移;节点故障检测模块依赖于Redis集群自身的故障检测功能:集群搭建时,节点会进行握手通信,之后每个节点都会定期发送PING/PONG命令来进行故障检测。

一种基于Redis集群的分布式动态杜鹃过滤系统的过滤方法,包括以下几个步骤:

步骤1:利用一致性哈希算法搭建Redis集群,为真实节点设置多个虚拟节点并将其排布到一个具有2^32个均匀布点的圆环上,同时记录虚拟节点与真实节点对应的哈希记录表;

步骤2:在Redis集群各子节点上添加一个DCF并初始化,将哈希记录表反馈给所述系统管理模块;

步骤3:数据接收模块接收Redis客户端输入的数据及指令;

步骤4:存储节点选择模块计算Redis客户端输入数据的键信息的哈希值,哈希值->子节点的映射关系与搭建Redis集群所采用的哈希值->圆环节点位置的映射关系相同,并根据该映射关系选择相应子节点,然后构造数据、哈希值、操作类型的三元组交由所述系统管理模块发送至相应子节点;

步骤5:子节点利用所述系统管理模块发送的三元组中的构造数据、哈希值、操作类型算数据的指纹信息f和bucket候选位置信息i1,i2;

步骤6:在子节点中根据数据的指纹信息f、bucket候选位置信息i1,i2以及Redis客户端发送的操作命令进行相应的数据操作,数据操作包含数据插入、查询、删除方法,并将操作结果提供给所述结果反馈模块;所述结果反馈模块将数据操作结果反馈给Redis客户端。

所述步骤5中的指纹信息f和bucket候选位置信息i1,i2具体通过以下公式得到:

f=fingerprint(x);

i1=hash(x);

i2=i1⊕hash(f)。

所述步骤6中的数据插入方法,包括以下步骤:

步骤6.1:将指纹信息f插入当前curCF指针指向的CF中,若插入成功,则将数据插入Redis集群子节点中并进入步骤6.3,否则保存被踢出的数据的指纹信息f’进入步骤6.2;

步骤6.2:将f’插入当前curCF指针连接的下一个CF中,并将数据插入Redis集群子节点中;

步骤6.3:检查当前curCF指针是否已到达CF末尾,若到达则进入步骤4,否则结束;

步骤6.4:检查当前curCF指针是否指向DCF的最后一个CF,若是,则分配一个新的CF在DCF末尾,并令当前curCF指针指向该CF,否则让当前curCF指向DCF中的下一个CF。

所述步骤6.1具体包括:

步骤6.1.1:若bucket两个候选位置i1,i2任意一个包含空entry存储单元,则将数据的指纹信息插入其中任意一个候选位置,并将数据插入Redis集群子节点,返回插入成功信息;若i1,i2均不为空,则随机选择一个候选位置进入步骤6.1.2;

步骤6.1.2:在选定的候选位置中随机选择一个entry存储单元,将存储在其中的数据的指纹信息踢出并保存为f’,进入步骤6.1.3;

步骤6.1.3:若踢出数据指纹信息次数在最大踢出次数之内,则进入步骤6.1.4,否则表示该CF已满,返回插入失败信息,进入步骤6.2;

步骤6.1.4:根据f’计算该数据的另一个bucket候选位置,若该候选位置包含空entry存储单元,则将f’插入其中,并将数据插入Redis集群子节点,返回插入成功信息;若该候选位置不包含空entry存储单元,则进入步骤6.1.2。

所述步骤6.2具体包括:

步骤6.2.1:令nextCF指针指向当前curCF指针;

步骤6.2.2:检查当前nextCF指针是否指向DCF的最后一个CF,若是,则分配一个新的CF值DCF末尾,并令当前nextCF指针指向该CF,否则让当前nextCF指向DCF中的下一个CF;

步骤6.2.3:在nextCF指向的CF中插入f’,若插入成功,则将数据插入Redis集群子节点,返回插入成功信息;若插入失败,则进入步骤6.2.2。

所述步骤6中的数据查询方法,包括以下步骤:

步骤6.5:初始化计数器n=1;

步骤6.6:遍历DCF中的第n个CF,1≤n≤k,DCF中包含k个CF,,若CF存在则进入步骤6.7,否则返回查询失败信息,不必进入Redis集群子节点查找数据信息;

步骤6.7:若第n个CF中bucket候选位置i1,i2中存在指纹信息f,则进入Redis集群子节点查找相应数据信息,并返回查询成功信息;若不存在,则令n加1,进入步骤6.6。

所述步骤6中的数据删除方法,包括以下步骤:

步骤6.8:初始化计数器n=1;

步骤6.9:遍历DCF中的第n个CF,1≤n≤k,DCF中包含k个CF,若CF存在则进入步骤6.10;若不存在,则返回删除失败信息,不必进入Redis集群子节点删除数据信息;

步骤6.10:若第n个CF中bucket候选位置i1,i2中存在指纹信息f,则将其和Redis集群子节点中的数据信息一起删除,并返回删除成功信息;若不存在,则令n加1,进入步骤6.9。

有益效果是:

本发明相对于传统的单机数据过滤器方案,一方面采用了高效数据结构动态杜鹃过滤器,仅存储数据的指纹信息,能够适应动态规模的数据自动伸缩容量,显著降低内存开销,同时还解决了Bloom Filter无法删除数据的问题;另一方面将数据过滤器与分布式存储系统即Redis集群相结合,利用Redis集群高效的数据存储能力,实现了多机过滤器的数据共享及高效利用,在面对海量数据时,利用数据过滤器能够节省对无效数据的检索时间,获得相对于传统分布式存储系统而言更加高效的数据检索性能。

附图说明

图1是本发明实施例提供的一种基于Redis集群的分布式动态杜鹃过滤系统框架图;

图2是本发明实施例提供的DDCF系统子节点架构图;

图3是本发明实施例提供的一种基于Redis集群的分布式动态杜鹃过滤系统的使用方法流程图;

图4是本发明实施例提供的一种基于Redis集群的分布式动态杜鹃过滤系统的数据插入流程图;

图5是本发明实施例提供的一种基于Redis集群的分布式动态杜鹃过滤系统的数据查询流程图;

图6是本发明实施例提供的一种基于Redis集群的分布式动态杜鹃过滤系统的数据删除流程图;

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

图1所示为本发明实施例提供的一种基于Redis集群的分布式动态杜鹃过滤系统(以下简称基于Redis集群的DDCF系统),包括基于Redis集群的DDCF系统中心模块和多个基于Redis集群子节点的DDCF系统子节点,多个DDCF系统子节点分布在一个具有2^32个均匀布点的圆环上,基于Redis集群的DDCF系统中心模块独立于圆环之外,基于Redis集群的DDCF系统中心模块用于完成系统的初始化、数据的接收到存储节点的映射以及子节点的全局管理,DDCF系统子节点用于完成数据的指纹信息和bucket候选位置信息计算,并根据该信息完成相应的数据操作例如数据的插入、查询和删除。

动态Cuckoo Filter(简称DCF)是由多个Cuckoo Filter(简称CF)通过链表形式连接构成的CF的一个紧凑型变体,其中,每个CF都是一个bucket数组,每个数组有4个用于存储数据指纹信息的entry基本单元,DCF拥有一个当前CF指针curCF和一个下一个CF指针curCF用于完成基本的数据操作。由于其链表结构,DCF能动态变化CF的数量以满足不同数据规模的存储需求,相比需要预估数据规模进行设计的Bloom Filter及其各种变体灵活性更高,大大提高了空间利用率。

如图1所示,基于Redis集群的DDCF系统中心模块包括:系统初始化模块、系统管理模块、数据接收模块、存储节点选择模块以及节点故障检测模块。

系统初始化模块,用于利用一致性哈希算法部署Redis集群各节点服务器,首先选取哈希函数计算节点服务器的哈希值,将其分布到0~2^32的圆环上,此时由于节点服务器分布不均匀,所以为真实节点设置多个虚拟节点这样就解决了节点服务器少时数据分配不均匀的问题。

如图2所示为节点1、2分别添加三个虚拟节点,使其在圆环上达到均匀分布的效果,同时记录虚拟节点与真实节点对应的哈希记录表,然后在各真实节点上附加一个DCF,该DCF初始状态下只有一个CF并且当前CF指针curCF指向该CF,nextCF指针指向下一个CF,最后将哈希记录表并反馈给所述系统管理模块。

数据接收模块,用于接收来自Redis客户端传入的数据及指令并将其提供给存储节点选择映射模块(各模块及DDCF系统子节点均借助Redis集群总线进行通信);

存储节点选择模块,用于利用DDCF系统初始化模块中一样的哈希函数计算传入数据的键信息的哈希值,并根据该哈希值及传入指令构造数据、哈希值、操作类型的三元组交由所述系统管理模块发送至相应子节点;

系统管理模块,用于完成子节点的数据分配,具体地,如图2所示,将数据的键信息的哈希值落在圆环上,将其传入使用二分法顺时针查找到的第一个DDCF子节点中,若查找到的第一个子节点为虚拟节点,则按照哈希记录表映射到相应的真实节点中,交由子节点进行数据操作,同时,该模块还负责子节点的全局管理如二次扩展、数据备份、故障处理等功能;

节点故障检测模块,用于定期检测子节点的运行状态,若节点出现故障则通知所述系统管理模块进行节点更换及数据转移,具体地,其也依赖于Redis集群自身的故障检测与故障处理功能。

本发明实施例还提供一种基于Redis集群的分布式动态杜鹃过滤系统的使用方法,如图3所示,包括:

步骤1:利用一致性哈希算法搭建Redis集群,为真实节点设置多个虚拟节点并将其排布到一个具有2^32个均匀布点的圆环上,同时记录虚拟节点与真实节点对应的哈希记录表;

步骤2:在Redis集群各子节点上添加一个DCF并初始化,将哈希记录表反馈给所述系统管理模块;

步骤3:数据接收模块接收Redis客户端输入的数据及指令;

步骤4:计算所述输入数据的键信息的哈希值,哈希值->子节点的映射关系与搭建Redis集群所采用的哈希值->圆环节点位置的映射关系相同,并根据该映射关系选择相应子节点,然后构造数据、哈希值、操作类型的三元组交由所述系统管理模块发送至相应子节点;

步骤5:子节点利用所述系统管理模块发送的三元组中的信息计算数据的指纹信息f和bucket候选位置信息i1,i2;

步骤6:在子节点中根据数据的指纹信息f、bucket候选位置信息i1,i2以及Redis客户端发送的操作命令进行相应的数据操作,并反馈操作结果。

更进一步的,所述步骤5中计算数据x的指纹信息f和bucket候选位置信息i1,i2具体为:

f=fingerprint(x)

i1=hash(x)

i2=i1⊕hash(f)。

图4为本发明对应的基于Redis集群的分布式动态杜鹃过滤系统的使用方法步骤6中数据插入方法的流程图,包括以下步骤:

步骤6.1:将数据的指纹信息f插入当前curCF指针指向的CF中,若插入成功,则将数据信息插入Redis集群子节点中并进入步骤6.3,否则,若插入失败,则保存被踢出的数据的指纹信息f’进入步骤6.2;

步骤6.2:将f’插入当前curCF指针连接的下一个CF中,并将数据信息插入Redis集群子节点中;

步骤6.3:检查当前curCF指针是否已到达CF末尾,若到达则进入步骤6.4,若未到达则结束;

步骤6.4:检查当前curCF指针是否指向DCF的最后一个CF,若是,则分配一个新的CF在DCF末尾,并令当前curCF指针指向该CF,否则让当前curCF指向DCF中的下一个CF;

更进一步的,所述步骤6.1具体包括:

步骤6.1.1:若bucket两个候选位置i1,i2任意一个包含空entry存储单元,则将数据的指纹信息插入其中任意一个候选位置,并将数据插入Redis集群子节点,返回插入成功信息;若i1,i2均不为空,则随机选择一个候选位置进入步骤6.1.2;

步骤6.1.2:在选定的候选位置中随机选择一个entry存储单元,将存储在其中的数据的指纹信息踢出并保存为f’,进入步骤6.1.3;

步骤6.1.3:若踢出数据指纹信息次数在最大踢出次数之内,则进入步骤6.1.4,否则表示该CF已满,返回插入失败信息,进如步骤6.2;

步骤6.1.4:根据f’计算该数据的另一个bucket候选位置,若该候选位置包含空entry存储单元,则将f’插入其中,并将数据插入Redis集群子节点,返回插入成功信息;若该候选位置不包含空entry存储单元,则进入步骤6.1.2;

更进一步的,所述步骤6.2包括:

步骤6.2.1:令nextCF指针指向当前curCF指针;

步骤6.2.2:检查当前nextCF指针是否指向DCF的最后一个CF,若是,则分配一个新的CF值DCF末尾,并令当前nextCF指针指向该CF,否则让当前nextCF指向DCF中的下一个CF;

步骤6.2.3:在nextCF指向的CF中插入f’,若插入成功,则将数据插入Redis集群子节点,返回插入成功信息;若插入失败,则进入步骤6.2.2。

图5为本发明对应的基于Redis集群的分布式动态杜鹃过滤系统的使用方法步骤6中数据查询方法的流程图,包括以下步骤:

步骤6.5:初始化计数器n=1;

步骤6.6:遍历DCF中的第n个CF,1≤n≤k(DCF中包含k个CF),若CF存在则进入步骤3;若不存在,则返回查询失败信息,不必进入Redis集群子节点查找数据信息;

步骤6.7:若第n个CF中bucket候选位置i1,i2中存在指纹信息f,则进入Redis集群子节点查找相应数据信息,并返回查询成功信息;若不存在,则令n加1,进入步骤6.6。

图6为本发明对应的基于Redis集群的分布式动态杜鹃过滤系统的使用方法步骤6中数据删除方法的流程图,包括以下步骤:

步骤6.8:初始化计数器n=1;

步骤6.9:遍历DCF中的第n个CF,1≤n≤k(DCF中包含k个CF),若CF存在则进入步骤6.10;若不存在,则返回删除失败信息,不必进入Redis集群子节点删除数据信息;

步骤6.10:若第n个CF中bucket候选位置i1,i2中存在指纹信息f,则将其和Redis集群子节点中的数据信息一起删除,并返回删除成功信息;若不存在,则令n加1,进入步骤6.9。

本发明方案所公开的技术手段不限于上述实施方式所公开的技术手段,还包括由以上技术特征任意组合所组成的技术方案。

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