掌桥专利:专业的专利平台
掌桥专利
首页

数据存储方法、数据获取方法、装置和存储介质

文献发布时间:2023-06-19 11:52:33


数据存储方法、数据获取方法、装置和存储介质

技术领域

本发明涉及云计算技术,尤其涉及一种数据存储方法、数据获取方法、装置和计算机可读存储介质。

背景技术

集群技术是一项在较低成本下能有效提高系统整体性能、可靠性、灵活性和可扩展性,并广泛应用于生产系统的必备技术。以面向网络的数据库(Neo4j图形数据库,简称Neo4j)集群为例,Neo4j集群需要具备即使在网络或者硬件发生故障时,仍然可以继续提供服务的能力。如果集群中的一个节点损坏或者网络连接断开,Neo4j集群应该能够继续提供服务,而不是完全失去服务能力。

现有的Neo4j集群只在Neo4j企业版提供数据库集群的功能,而Neo4j社区版不支持集群的功能。

发明内容

有鉴于此,本发明的主要目的在于提供一种数据存储方法、数据获取方法、装置和计算机可读存储介质。

为达到上述目的,本发明的技术方案是这样实现的:

本发明实施例提供了一种数据存储方法,所述方法包括:

获取待存储数据,对所述待存储数据进行封装,得到封装数据;

将所述封装数据保存在消息队列;所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中。

上述方案中,所述获取待存储数据,包括以下至少之一:

自动收集待存储数据;

接收目标数据表格,所述目标数据表格包括以预设格式保存的数据。

本发明实施例提供了一种数据存储方法,所述方法包括:

从消息队列中获取封装数据;

将所述封装数据保存在相应消费者群组对应的节点中。

上述方案中,将所述封装数据保存在相应消费者群组对应的节点中之前,所述方法还包括:

对所述封装数据进行数据校验,确定所述封装数据校验合格时,对所述封装数据进行解封装,获得解封装数据;

相应地,将所述封装数据保存在相应消费者群组对应的节点中,包括:

确定预设的存储格式;

对所述解封装数据进行格式处理,获得所述存储格式的解封装数据,作为目标存储数据;

将所述目标存储数据发送给相应消费者群组对应的节点中,所述目标存储数据由所述相应消费者群组对应的节点保存。

上述方案中,所述方法还包括:

相应于消费者群组对应的节点未能接收并存储所述目标存储数据,消费者群组重新将所述目标存储数据发送给所述消费者群组对应的节点,直至所述消费者群组对应的节点完成存储。

本发明实施例提供了一种数据获取方法,所述方法包括:

接收终端发送的查询请求;

确定至少一个节点中各节点的状态,将所述查询请求发送给符合预设条件的节点,以获得所述查询请求对应的数据,将获得的所述数据发送给终端;所述至少一个节点中各节点均保存有消费者群组发送的目标存储数据。

本发明实施例提供了一种数据存储装置,所述装置包括:第一处理模块和第二处理模块;其中,

所述第一处理模块,用于获取待存储数据,对所述待存储数据进行封装,得到封装数据;

所述第二处理模块,用于将所述封装数据保存在消息队列;所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中。

上述方案中,所述第一处理模块,用于获取待存储数据,包括以下至少之一:

自动收集待存储数据;

接收目标数据表格,所述目标数据表格包括以预设格式保存的数据。

本发明实施例提供了一种数据存储装置,所述装置包括:第三处理模块和第四处理模块;

所述第三处理模块,用于从消息队列中获取封装数据;

所述第四处理模块,用于将所述封装数据保存在相应消费者群组对应的节点中。

上述方案中,所述第四处理模块,还用于对所述封装数据进行数据校验,确定所述封装数据校验合格时,对所述封装数据进行解封装,获得解封装数据;

所述第四处理模块,具体用于确定预设的存储格式;

对所述解封装数据进行格式处理,获得所述存储格式的解封装数据,作为目标存储数据;

将所述目标存储数据发送给相应消费者群组对应的节点中,所述目标存储数据由所述相应消费者群组对应的节点保存。

上述方案中,所述第三处理模块,还用于相应于消费者群组对应的节点未能接收并存储所述目标存储数据,将所述目标存储数据发送给所述消费者群组对应的节点,直至所述消费者群组对应的节点完成存储。

本发明实施例提供了一种数据获取装置,所述装置包括:第五处理模块和第六处理模块;其中,

所述第五处理模块,用于接收终端发送的查询请求;

所述第六处理模块,用于确定至少一个节点中各节点的状态,将所述查询请求发送给符合预设条件的节点,以获得所述查询请求对应的数据,将获得的所述数据发送给终端;所述至少一个节点中各节点均保存有消费者群组发送的目标存储数据。

本发明实施例提供了一种数据处理装置,所述装置包括:处理器和用于存储能够在处理器上运行的计算机程序的存储器;其中,

所述处理器用于运行所述计算机程序时,执行所述数据存储方法的步骤;或者,执行所述数据获取方法的步骤。

本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述数据存储方法的步骤;或者,所述计算机程序被处理器执行时实现所述数据获取的步骤。

本发明实施例所提供的数据存储方法、数据获取方法、装置和计算机可读存储介质,获取待存储数据,对所述待存储数据进行封装,得到封装数据;将所述封装数据保存在消息队列;所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中;如此,通过各消费者群组获得相应数据并存储在相应节点中,以在Neo4j社区版实现数据库集群的功能。

附图说明

图1为相关技术中一种企业版集群架构的示意图;

图2为本发明实施例提供的一种数据存储方法的流程示意图;

图3为本发明实施例提供的另一种数据存储方法的流程示意图;

图4为本发明实施例提供的一种数据获取方法的流程示意图;

图5为本发明实施例提供的一种Neo4j社区版集群实现架构的示意图;

图6为本发明实施例提供的一种Neo4j社区版集群运行时的流程示意图;

图7为本发明实施例提供的一种数据接收层处理方法的流程示意图;

图8为本发明实施例提供的一种数据存储层处理方法的流程示意图;

图9为本发明实施例提供的一种负载均衡层处理方法的流程示意图;

图10为本发明实施例提供的一种基础对象节点结构示意图;

图11为本发明实施例提供的一种关系对象结构示意图;

图12为本发明实施例提供的一种数据存储装置的结果示意图;

图13为本发明实施例提供的另一种数据存储装置的结果示意图;

图14为本发明实施例提供的一种数据获取装置的结果示意图;

图15为本发明实施例提供的一种数据处理装置的结构示意图。

具体实施方式

在对本发明实施例作进一步详细的说明之前,先对集群技术进行以下说明。

现有的Neo4j集群方案中,只有Neo4j企业版提供有数据库集群的功能,以满足需要在大规模环境下部署生产系统的企业或者研发人员;而Neo4j社区版不支持集群功能。

图1为相关技术中一种企业版集群架构的示意图;如图1所示,Neo4j企业版集群架构包括:一个主节点(Master)、零个或者多个从节点(Slave)。为保持数据一致性,所述从节点将与主节点同步处理写入,然而更新操作最终是从主节点传播到从节点,所以各从节点的写入在其他从节点上不是立即可见的。Neo4j企业版中,当主节点出现故障时,会自动选举一台从节点成为新的主节点,以确保集群的高可用性。

综上所述,Neo4j的集群方案只支持企业版,存在如下不足:

1、Neo4j企业版对比Neo4j社区版,虽然在容量、并发、性能等方面均有提高,但就一些中小应用场景下并没有必要使用Neo4j企业版,而应该选择更加轻量级的Neo4j社区版,降低系统复杂度,同时也能够满足系统需求;

但由于Neo4j集群只支持企业版,使得中小应用涉及到Neo4j的一些系统无法做到底层Neo4j集群高可用,对整个系统的稳定性和健壮性造成了隐患。

2、Neo4j企业版的数据同步是从主节点传播到从节点,从而一个从节点的写入在其他所有从节点上不是立即可见的。

3、Neo4j企业版需要收费,这对一些中小企业来说会有经济成本问题。

基于此,在本发明的各种实施例中,获取待存储数据,对所述待存储数据进行封装,得到封装数据;将所述封装数据保存在消息队列;所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中;如此,通过各消费者群组获得相应数据并存储在相应节点中,以在Neo4j社区版实现数据库集群的功能。

下面结合实施例对本发明再作进一步详细的说明。

图2为本发明实施例提供的一种数据存储方法的流程示意图;如图2所示,所述方法包括:

步骤201、获取待存储数据,对所述待存储数据进行封装,得到封装数据;

步骤202、将所述封装数据保存在消息队列;

其中,所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中。

这里,所述数据存储方法可以适用于Neo4j集群架构,具体适用于Neo4j社区版;即所述节点为Neo4j集群架构中的任一节点。

例如,所述数据存储方法可以应用于第一服务器(即节点),所述第一服务器属于所述Neo4j社区版的架构中的一部分。

具体地,步骤201中,所述获取待存储数据,包括以下至少之一:

自动收集待存储数据;

接收目标数据表格,所述目标数据表格包括以预设格式保存的数据;如excel形式的表格;

接收目标终端发送的数据,所述目标终端设有人机交互界面,所述目标终端发送的数据由用户通过人机交互界面输入。

这里,所述自动收集待存储数据,可以运用Agent程序实现;即通过Agent程序采集待存储数据,具体可以页面导入或者页面录入各种方式来进行;Agent程序采集待存储数据并发送,所述第一服务器接收所述待存储数据,并执行本发明实施例提供的数据存储方法。

具体地,所述消息队列可以采用推模式和拉模式以实现数据交互;其中,所述推模式是指消息队列给消费者群组推(即发送)数据,消费者群组被动接收;所述拉模式是指消费者群组主动从消息队列拉取(即获取)数据。上述两种模式均可以采用,最终效果就是数据由消息队列流入到消费者群组,并进行下一步处理。

具体来说,在一实施例中,将所述封装数据保存在消息队列之后,所述方法还可以包括:

向至少一个消费者群组发送针对所述消息队列的通知消息;这里,通过向至少一个消费者群组发送针对所述消息队列的通知消息,用以告知所述至少一消费者群组中各消费者群组所述消息队列更新,以通知所述至少一消费者群组中各消费者群组获取封装数据(也即待存储数据)。这里,所述通知消息可以通过广播的方式发送给各消费者群组。

在另一实施例中,将所述封装数据保存在消息队列之后,所述方法可以包括:

向至少一个消费者群组发送所述消息队列中的封装数据(即待存储数据);所述消息队列中的封装数据由所述至少一个消费者群组中各消费者群组接收。

这里,对所述待存储数据进行封装,得到封装数据,包括:

按照预设的封装规则对所述待存储数据进行封装,得到所述封装数据。

通过图2所示方法,由第一服务器向各消费者群组发送所述消息队列中的封装数据,各消费者群组获得相应数据并存储在相应节点中,即通过消费者群组在Neo4j社区版实现数据库集群的功能。

本发明实施例中,所述数据存储方法所运用的所述消息队列也可以部署集群,即所述图2所示的数据处理方法可以应用于第一服务器,也可以应用于第一服务器集群(包括多个第一服务器),不一定是单一服务器,相应情况下,上述第一服务器所做操作由第一服务器集群实现,这里不再赘述。

需要说明的是,Neo4j社区版中的节点需存储有节点信息、节点之间的关系,因此原始数据、即所述待存储数据需要包含如下信息:起始节点的标识(每个节点对应一个标识,所述标识在Neo4j系统中唯一)、类型及节点属性;以及,结束节点的标识、类型及节点属性。

图3为本发明实施例提供的一种数据存储方法的流程示意图;如图3所示,所述方法包括:

步骤301、从消息队列中获取封装数据;

步骤302、将所述封装数据保存在相应消费者群组对应的节点中。

这里,所述方法可以应用于至少一个消费者群组中各消费者群组,即所述Neo4j社区版中的任意一个消费者群组。各消费者群组可以分别在任意一个第二服务器上实现,所述第二服务器属于所述Neo4j社区版的架构中的一部分。

这里,针对每个消费者群组来说,所述消费者群组包括至少一个消费者,可以理解为可以并行执行相同服务(任务)。

一个消费者可以对应一个或多个节点,即一个消费者接收到的数据可以向一个或多个节点发送,从而可以同时将同一数据保存在不同节点中。

具体地,所述消息队列可以采用推模式和拉模式以实现数据交互;

相应地,所述从消息队列中获取封装数据,包括以下任意一种:

所述第二服务器直接接收消息队列(即第一服务器)发送的封装数据;

所述第二服务器接收针对所述消息队列的通知消息,根据所述通知消息从所述消息队列中获取封装数据。

具体地,将所述封装数据保存在相应消费者群组对应的节点中之前,所述方法还包括:

对所述封装数据进行数据校验,确定所述封装数据校验合格时,对所述封装数据进行解封装,获得解封装数据;

这里,所述校验可以按预设的校验规则进行相应校验;所述解封装的方法可以采用相应于图2所示方法中的封装方法对应的解封装方法。

相应地,将所述封装数据保存在相应消费者群组对应的节点中,包括:

确定预设的存储格式;

对所述解封装数据进行格式处理,获得所述存储格式的解封装数据,作为目标存储数据;

将所述目标存储数据发送给相应消费者群组对应的节点中,所述目标存储数据由所述相应消费者群组对应的节点保存。

这里,所述预设的存储格式可以由开发人员预先设定并保存。

具体地,所述方法还包括:

相应于消费者群组对应的节点未能接收并存储所述目标存储数据,消费者群组重新将所述目标存储数据发送给所述消费者群组对应的节点,直至所述消费者群组对应的节点完成存储。

这里,所述消费者群组将所述目标存储数据保存在所述节点中的过程中需要检测相应节点是否接收完成并保存完成,若出现问题(如网络抖动)导致相应节点未能完成接收并保存,所述消费者群组需要重新发送所述目标存储数据,以保证相应节点完成所述目标存储数据的保存。

通过图3所示方法,由第二服务器(即消费者群组)获得相应数据并存储在相应节点中,从而在Neo4j社区版实现数据库集群的功能。

图4为本发明实施例提供的一种数据获取方法的流程示意图;如图4所示,所述方法包括:

步骤401、接收终端发送的查询请求;

步骤402、确定至少一个节点中各节点的状态,将所述查询请求发送给符合预设条件的节点,以获得所述查询请求对应的数据,将获得的所述数据发送给终端;

这里,所述至少一个节点中各节点均保存有消费者群组发送的目标存储数据。

这里,所述数据获取方法可以应用于数据获取装置,所述数据获取装置可以加载在第三服务器中实现;所述第三服务器可以采用图2、图3所示方法所应用的第一服务器、第二服务器,也可以在其他服务器中实现,这里不做限定。所述第三服务器属于所述Neo4j社区版的架构中的一部分。

具体地,所述终端具有人机交互界面,持有终端的用户通过所述人机交互界面输入需要查询的数据,所述终端基于用户的输入生成查询请求,将所述查询请求发送给所述数据获取装置。

具体地,所述确定至少一个节点中各节点的状态,包括:

实时检测所述至少一个节点中各节点与所述第三服务器之间的网络连接关系,以确定至少一个节点中各节点的状态,即所述状态可以指网络连接状态;

这里,所述状态可以表征相应节点是否可以接收获取请求并发送所述获取请求对应的数据。

这里,所述符合预设条件的节点表征可以接收获取请求并发送所述获取请求对应的数据的节点,即网络连接正常的节点。

相应地,所述终端侧提供有一种数据获取方法,包括:

确定查询请求,向数据获取装置发送所述查询请求;

接收所述数据获取装置发送的数据。

通过图4所示方法,终端可以在Neo4j社区版中任一节点获取相应数据,即所述Neo4j社区版实现数据库集群的功能。

需要说明的是上述图2-4中的节点具体指Neo4j社区版中用于存储相应数据的节点。

应理解,上述实施例中说明各步骤的顺序并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。

以上图2-4所述的方法可以加载在同一服务器(如上述第一服务器、第二服务器或第三服务器);加载在同一服务器时,图2-4的方法可以在相应服务器中的不同模块中实现;也可以根据需要进行分配,加载在多个服务器实现,以完成以上描述的全部或部分处理,这里不做限定。

本发明实施例提供的数据存储方法是在能够发送针对消息队列的通知消息到不同消费者群组的基础上,从而实现同一份数据在不同Neo4j社区版中节点上的共享,即实现Neo4j社区版集群。使用HAProxy(一个使用C语言编写的自由及开放源代码软件)代理前端(即进行数据查询的终端)查询调用,从而实现开源版本的Neo4j社区版集群。

具体地,基于消息队列和HAProxy的Neo4j社区版集群实现方法可以采用图5所示的架构,所述架构包括:多个节点(图5中以2个节点组成集群作为示例,如需多个节点,只需要增加消费者群组(Mq-Consumer Group)和Neo4j社区版节点的数量即可)。

图5为本发明实施例提供的一种Neo4j社区版集群运行时的流程示意图;如图5所示,待存储数据以一定的格式封装好,通过事先开发好的程序(Endpoint)接收数据,所述程序(Endpoint)将接收到的待存储数据发送到消息队列生产者(Mq-Producer);所述消息队列生产者(Mq-Producer)对数据进行封装后,将封装后的数据发送到消息队列(Mq-Broker);多个消费者群组(Mq-ConsumerGroup)以组为单位从所述消息队列(Mq-Broker)中获取同一批数据,对获得的封装后的数据进行数据校验,校验通过后将得到的数据封装成最终需要存储的格式,存储于相应消费者群组对应的Neo4j社区版节点(如:节点1、节点2)中;多个Neo4j社区版节点(以下简称Neo4j节点)之间存储的数据完全一样。

数据查询时,由负载均衡软件对查询请求进行分发,选择健康的节点接收查询请求,当某个节点出现故障时,负载均衡软件会自动重定向到健康的节点继续处理查询请求,保证整个Neo4j社区版集群的高可用性。

本发明实施例提供的Neo4j社区版集群实现方式,对于未来合理规划底层架构,降低企业运营成本具有极大的积极意义,具体来说:

从开发者的角度,对于有消息队列和负载均衡软件使用经验的开发者来说,能够很容易的基于本发明方案使用基于Neo4j社区版集群,该方案中用到的组件,均是主流并常规的组件,易于获取;

从应用系统角度,Neo4j企业版集群在容量、并发、性能上面的优势;在大数据的应用下,对于一些中小应用Neo4j社区版已经完全能够满足要求,使用Neo4j社区版集群使得整个系统轻量化;

从经济的角度,Neo4j企业版集群需要收费,而采用上述Neo4j社区版的集群开源免费,对企业来说可以降低成本。

图6为本发明实施例提供的一种Neo4j社区版集群整体架构的示意图;如图6所示,所述Neo4j社区版集群,包括:

数据流入层,用于获取需要存储到Neo4j社区版集群中的原始数据(即所述待存储数据);

数据接收层,用于通过RESTful(是一种网络应用程序的设计风格和开发方式,全称为Representational State Transfer)方式暴露的接口(API),作为程序(EndPoint)来接收原始数据,并将原始数据发送给消息队列生产者;

数据存储层,用于通过消息队列生产者将预处理好的原始数据发送到消息队列中,消息队列消费者则从消息队列中获取数据,二次封装后向底层Neo4j节点发起存储请求;

负载均衡层,用于实时监控Neo4j社区版集群各节点的状态,将前端的查询请求发送到健康的节点;

数据查询层,包括用于发起查询请求的各种终端。

具体地,原始数据通过所述数据流入层进入Neo4j社区版集群;所述数据流入层采用以下至少之一集中方式:

接收网页(web)端手工录入的数据;

接收事先按照一定格式人工整理的数据;所述数据可以汇总成表格,如excel等形式;

通过第三方agent程序自动收集数据。

所述原始数据至少需要包含以下至少之一:

起始节点的标识、类型及节点属性;

结束节点的标识、类型及节点属性。

在一实施例中,所述数据接收层需要能够对原始数据进行接收。一般采用通用的接口(即上述RESTful方式的API)接收原始数据;将接收的数据发送给消息队列生产者(Mq-Producer)预处理,封装成通用的格式(如json格式)后发送给消息队列,供消费者群组获取。

图7为本发明实施例提供的一种数据接收层处理方法的流程示意图;如图7所示,所述数据接收层处理方法,包括:数据接收层接收原始数据(即待存储数据),具体通过RESTful接口接收;由消息队列生产者(Mq-Producer)对所述原始数据进行校验,确定校验成功,则得到通过校验后的数据;消息队列生产者对所述校验后的数据进行预处理,预处理后在再进行封装,将封装后的数据(json格式)存储在消息队列中;确定校验不成功,则通过RESTful接口反馈校验结果。

在一实施例中,所述数据存储层中存在多个消费者群组,每个消费者群组从消息队列中拿到同样的一批数据,并逐步解析单条消息(可以理解为图3所示方法中的校验、解封装等)。

消费者群组从所述消息队列中获取数据,基于获取的数据可能确定以下任一情况:

1、开始节点和结束节点全部存在;

2、开始节点存在,结束节点不存在;

3、开始节点不存在,结束节点存在;

4、开始节点和结束节点均不存在;

确定第1种情况,则直接进行存储;若是第2、3、4种情况需要先构建不存在的节点,再进行存储。

针对消费者在处理数据过程中可能出现的异常情况,消费者需要具备重试制,避免如下情况发生:

假设存在2个消费者群组:消费者群组A和消费者群组B;消费者群组A正常处理数据,并将数据存储到对应的Neo4j节点;消费者群组B因为其与对应的Neo4j节点的网络出现抖动,导致数据存储失败;

若就此处理完毕,则消费者群组A和消费者群组B对应的Neo4j节点将产生数据不一致的情况,所以消费者群组B需要针对存储失败的数据进行重试,待网络状况恢复以后,消费者群组B负责的数据需要正常存储到对应的Neo4j节点中,从而保证各个Neo4j节点最终保存相同的数据,即满足最终一致性。

图8为本发明实施例提供的一种数据存储层处理方法的流程示意图;如图8所示,所述数据存储层处理方法可以包括:消费者群组从消息队列中获取数据,对获取的数据进行二次封装(通过对获取的数据进行二次封装,获得对应Neo4j节点所需格式的数据);将二次封装后的数据存储到相应消费者群组对应的Neo4j节点中,并判断存储是否成功,存储成功则Neo4j节点持久化相应数据;若存储失败,则重新进行存储操作,直至存储成功。

在一实施例中,所述负载均衡层利用负载均衡软件管理多个Neo4j节点;接收终端发送的查询请求,将查询请求发送给健康的节点;一旦某个Neo4j节点出现异常,负载均衡层能够实时感知到异常的出现,并把请求重定向到健康的节点。

这里,所述负载均衡层通过负载均衡软件实时监控与各Neo4j节点是否能够连接(即网络连接是否正常),网络连接正常则认为相应Neo4j节点健康,否则认为该Neo4j节点出现问题。

图9为本发明实施例提供的一种负载均衡层处理方法的流程示意图;如图9所示,所述负载均衡层处理方法包括:终端发起查询请求后,负载均衡软件(相当于图4所示方法所应用的第三服务器)接收相应的查询请求,确定选择的Neo4j节点是否健康(即联网是否正常,也即是否可以获得相应数据),若不健康则重新选择健康的节点;若健康,则向对应的节点请求数据,从相应节点中查询得到对应的数据。

在一实施例中,所述数据查询层包括发起数据查询请求的各种终端。这里,所述终端通过与负载均衡层交互,以发起查询请求。

本发明还提供一种仿真实验方法,例如,可以通过表1和表2中的组件构建Neo4j社区版集群的软件环境和硬件环境;

表1

表2

对于Neo4j社区版集群来说,社区版单节点服务是集群的基础,因此需要搭建至少2个Neo4j社区版节点;需要注意的是,若在单机实验(验证伪集群),则需要注意避免两个Neo4j社区版节点的端口号冲突。这里,可以将两个Neo4j社区版节点分别部署到2台浪潮服务器上。

对于消息队列来说,消息队列是Neo4j社区版中各节点保持数据同步的关键,所以建议搭建消息队列集群(包括多个消息队列节点,以保证必然有一个消息队列可用),以保证在消息队列这一环节是高可用的。如做方案验证,可以先使用单节点的消息队列。这里,可以将消息队列集群、即表1或2中的rocketmq集群(2个节点)分别部署到2台浪潮服务器上。

对于负载均衡服务层来说,Neo4j社区版集群需要具备即使在网络或者硬件发生故障时,仍然可以继续提供服务的能力。如果集群中的一个节点损坏或者网络连接断开,Neo4j社区版集群应该能够继续提供服务,而不是完全失去服务的能力。

消息队列已经实现不同Neo4j社区版节点间共享数据,前端查询调用则通过Haproxy来负载均衡,当底层某一个Neo4j社区版节点丧失服务能力后,Haproxy服务能够自动切换到正常的Neo4j社区版节点上,保证Neo4j社区版的集群的服务能力。负载均衡软件和服务Haproxy可用部署到浪潮服务器1上,负责接收数据查询请求,以及实时监控Neo4j社区版集群中2个节点的健康状态,将查询请求转发到健康的Neo4j社区版节点上。

对于消息队列生产者(即表1或2中的生产者)来说,消息队列生产者用于构造Neo4j社区版集群中节点及节点间关系,因节点类型及节点属性的多样性(不同节点具有不同类型和属性),消息队列生产者需要维护的实体类需要支持动态节点类型和节点属性,以此达到通用性。其次,节点之间的关系也必须能够通用。因此,本实验基于Java平台、SpringBoot框架,有如下模型设计:

1)基础节点对象(BaseNode):

基础节点对象是对Neo4j社区版中节点对象的抽象,提供最基础的id属性,equals方法(用于检测两个对象是否相等)、哈希码(hashCode)方法。重点维护节点关系列表(relationships)、节点类型列表(labelList)及节点动态属性(attributeMap)。具体如图10提供的一种基础对象节点结构示意图所示。

其中,动态属性组织成键值对(Map)类型的变量,借助Neo4j官方Java API中提供的复合属性转换器(CompositeAttributeConverter),在运行时根据键值对(Map)中的键(key)动态生成节点属性。

2)关系对象(BaseRelationship):

因基础节点(BaseNode)能够支持动态类型和属性,以此所有节点都可以封装成基础节点(BaseNode)。关系对象在此基础上自然能够做到通用性,它只需要维护开始节点(startNode)、结束节点(endNode),并且维护一些关系对象本身的属性,如:创建时间(createTime)、关系名称(name)等即可。具体如图11提供的一种关系对象结构示意图所示。

3)发送数据到消息队列

存储到Neo4j社区版节点的信息一般为较重要信息,所以在基于Rocketmq的情况下,消息队列生产者可采用安全性事务性较高的同步发送方式,以保证每次发送到消息队列的数据都是被正确接收的。

对于消费者(Consumer)来说,每一组消费者对应一个Neo4j社区版节点服务,它的功能是把消息队列中的内容持久化到对应的每个消费者群组对应的Neo4j社区版节点中,针对诸如网络问题等导致持久化失败的情况,消费者需要有重试机制。但诸如垃圾数据的情况,不应该重试。采用捕获异常,根据不同异常的情况来处理。

消息队列(Rocketmq)的消费客户端原生带有失败重试机制(其他消息队列的客户端,可自行编码实现重试机制),根据异常来决定是否重试,本实验重点关注网络异常的重试。

根据通过上述方法搭建的Neo4j社区版集群架构进行实验,得到如下结果分析:

1)数据一致性

为了验证Neo4j社区版集群中的两个Neo4j社区版节点中存储相同的数据,分别使用不同数据量(节点组即一组节点包括开始节点和结束节点,并且这两个节点维护了一个关系)进行了测试,结果如表3数据一致性结果表所示:

表3

由实验所得,本发明提供的方法能够保证Neo4j社区版集群中所有节点都存储相同的数据,并且通过控制台能够被查询到。

2)性能比较

在开发机用Java程序制造模拟数据,分别采用两种方式存储数据:

方式一:对上述搭建的Neo4j社区版集群的RESTful接口发送数据;

方式二:直接对单节点的Neo4j社区版节点存储数据;

查看同样的数据量需要消耗的时间,结果如表4性能数据表所示:

表4

通过上述表格对比可以看出本发明提供的Neo4j社区版集群方案和单节点的Neo4j社区版节点相比,针对相同的数据量,耗时几乎差不多。

3)高可用

在实验时,手工把集群中某个Neo4j社区版节点关掉,验证是否能够搜索到数据,依靠Haproxy能够自动把查询请求节点切换到服务正常的Neo4j社区版节点上,能够正常获取数据;可用看出Neo4j社区版集群中只要有一个节点健康,整个集群还是能够正常提供服务。

图12为本发明实施例提供的一种数据存储装置的结构示意图;如图12所示,所述装置包括:第一处理模块和第二处理模块;其中,

所述第一处理模块,用于获取待存储数据,对所述待存储数据进行封装,得到封装数据;

所述第二处理模块,用于将所述封装数据保存在消息队列;所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中。

具体地,所述第一处理模块,用于获取待存储数据,包括以下至少之一:

自动收集待存储数据;

接收目标数据表格,所述目标数据表格包括以预设格式保存的数据。

需要说明的是:上述实施例提供的装置在进行相应处理时,仅以上述各程序模块的划分进行举例说明,实际应用中,可以根据需要而将上述处理分配由不同的程序模块完成,即将服务器的内部结构划分成不同的程序模块,以完成以上描述的全部或者部分处理。另外,上述实施例提供的装置与相应方法的实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图13为本发明实施例提供的另一种数据存储装置的结构示意图;如图13所示,所述装置包括:第三处理模块和第四处理模块;

所述第三处理模块,用于从消息队列中获取封装数据;

所述第四处理模块,用于将所述封装数据保存在相应消费者群组对应的节点中。

具体地,所述第四处理模块,还用于对所述封装数据进行数据校验,确定所述封装数据校验合格时,对所述封装数据进行解封装,获得解封装数据;

具体地,所述第四处理模块,具体用于确定预设的存储格式;

对所述解封装数据进行格式处理,获得所述存储格式的解封装数据,作为目标存储数据;

将所述目标存储数据发送给相应消费者群组对应的节点中,所述目标存储数据由所述相应消费者群组对应的节点保存。

具体地,所述第三处理模块,还用于相应于消费者群组对应的节点未能接收并存储所述目标存储数据,将所述目标存储数据发送给所述消费者群组对应的节点,直至所述消费者群组对应的节点完成存储。

需要说明的是:上述实施例提供的装置在进行相应处理时,仅以上述各程序模块的划分进行举例说明,实际应用中,可以根据需要而将上述处理分配由不同的程序模块完成,即将服务器的内部结构划分成不同的程序模块,以完成以上描述的全部或者部分处理。另外,上述实施例提供的装置与相应方法的实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图14为本发明实施例提供的一种数据获取装置的结构示意图;如图14所示,所述装置包括:第五处理模块和第六处理模块;其中,

所述第五处理模块,用于接收终端发送的查询请求;

所述第六处理模块,用于确定至少一个节点中各节点的状态,将所述查询请求发送给符合预设条件的节点,以获得所述查询请求对应的数据,将获得的所述数据发送给终端;所述至少一个节点中各节点均保存有消费者群组发送的目标存储数据。

需要说明的是:上述实施例提供的装置在进行相应处理时,仅以上述各程序模块的划分进行举例说明,实际应用中,可以根据需要而将上述处理分配由不同的程序模块完成,即将服务器的内部结构划分成不同的程序模块,以完成以上描述的全部或者部分处理。另外,上述实施例提供的装置与相应方法的实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图15为本发明实施例提供的一种数据处理装置的结构示意图。所述装置150包括:处理器1501和用于存储能够在所述处理器上运行的计算机程序的存储器1502;其中,

所述处理器应用于第一服务器时,所述处理器1501用于运行所述计算机程序时,执行:获取待存储数据,对所述待存储数据进行封装,得到封装数据;将所述封装数据保存在消息队列;所述消息队列中的所述封装数据由至少一个消费者群组中各消费者群组从所述消息队列中获取,并将所述封装数据保存在相应消费者群组对应的节点中。

需要说明的是:上述实施例提供的数据处理装置与第一服务器侧的数据存储方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

所述处理器应用于第二服务器时,所述处理器1501还用于运行所述计算机程序时,执行:从消息队列中获取封装数据;将所述封装数据保存在相应消费者群组对应的节点中。

需要说明的是:上述实施例提供的数据处理装置与第二服务器侧的数据存储方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

所述处理器应用于第三服务器时,所述处理器1501还用于运行所述计算机程序时,执行:接收终端发送的查询请求;确定至少一个节点中各节点的状态,将所述查询请求发送给符合预设条件的节点,以获得所述查询请求对应的数据,将获得的所述数据发送给终端;所述至少一个节点中各节点均保存有消费者群组发送的目标存储数据。

需要说明的是:上述实施例提供的数据处理装置与第三服务器侧的数据获取方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

实际应用时,所述装置150还可以包括:至少一个网络接口1503。数据处理装置150中的各个组件通过总线系统1504耦合在一起。可理解,总线系统1504用于实现这些组件之间的连接通信。总线系统1504除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图15中将各种总线都标为总线系统1504。其中,所述处理器1501的个数可以为至少一个。网络接口1503用于数据处理装置150与其他设备之间有线或无线方式的通信。

本发明实施例中的存储器1502用于存储各种类型的数据以支持装置150的操作。

上述本发明实施例揭示的方法可以应用于处理器1501中,或者由处理器1501实现。处理器1501可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器1501中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器1501可以是通用处理器、数字信号处理器(DSP,DiGital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。处理器1501可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本发明实施例所公开的方法的步骤,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于存储介质中,该存储介质位于存储器1502,处理器1501读取存储器1502中的信息,结合其硬件完成前述方法的步骤。

在示例性实施例中,数据处理装置150可以被一个或多个应用专用集成电路(ASIC,Application Specific Integrated Circuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable LogicDevice)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)、通用处理器、控制器、微控制器(MCU,Micro Controller Unit)、微处理器(Microprocessor)、或其他电子元件实现,用于执行前述方法。

本申请实施例还提供了一种存储介质,具体为计算机存储介质,更具体的为计算机可读存储介质。其上存储有计算机指令,即计算机程序,该计算机指令被处理器执行时上述服务器侧一个或多个技术方案提供的方法。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。

上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。

另外,在本发明各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

相关技术
  • 数据获取方法、数据存储方法、装置、设备及存储介质
  • 数据存储控制方法、数据存储方法、数据获取方法及装置
技术分类

06120113084282