背景:

neo4j 社区版不支持集群,故存在单点故障问题。在使用过程中,发现neo4j 单节点运算处理能力大概在一亿范围内性能还是比较客观的。所以在生产环境中,假如数据量不是特别大的话可以使用社区版,前提是解决单点故障问题。

构思:
每部署一个neo4j服务就是一个单节点。假如在写数据的时候采用多写(或者数据同步)的方式,单其中一个节点挂了,其他节点及时顶上也是一种个不错的方案。那么如何进行多写或者数据同步呢?
同时,社区版最高只能使用4核CPU。如何抗住并发量比较高的使用场景,假如有多个实例组成集群,通过负载均衡一起并提供服务,岂不是可以扛起高并发?
以下是我在考虑neo4j 社区版数据同步的一些构思: 有多写的方式,有通过运维部署的方法,还有通过程序上数据同步的方式。

1. 多写的方案

应用程序配置多数据源。在CRUD时进行多数据源处理,一个完整的操作使用事务。
这种方案特别low,原因入下:

  1. 多数据源处理,增加了处理的复杂性。多个节点同步时是不是得配置多个数据源?
  2. 多个节点性能不一,一个CRUD操作事务在多个节点处理万一其中一个操作失败或者网络堵塞,如何操作岂不是失败了?处理效率不客观,且容易失败。

2. 数据同步方案

2.1 采用部署的方式解决
方案一: neo4j 数据文件(data)保存在oss上,只有数据变更及时能够同步到oss,其他节点通过感知目录的变化进行同步文件
(未实现,好像同步不了oss)
方案二: neo4j 数据文件(data)保存在NAS上,只有数据变更及时能够同步到NAS,其他节点通过感知目录的变化进行同步文件
(待运维实验) 结果: 方案被驳回,原因是NAS保存数据文件,假如网络抖不满足则数据库的要求。
方案三: Neo4j+DRBD+Keepalived高可用架构
(这种架构属于比较老的,不推荐运维比较复杂)
参考资料:
https://blog.csdn.net/wangdonghello/article/details/83622176
Neo4j+DRBD+Keepalived高可用架构
https://blog.csdn.net/zhanaolu4821/article/details/80894180
方案四: 将neo4j 通过docker的方式进行部署。利用docker中允许共享数据文件的特性,在docker容器中启动多个neo4j实例。通过这样的方式进行数据同步,同时还可以有多个实例提供服务,提高并发量(该方法假如有人要是采用的话,需要注意写数据的时候这里可能有一些坑)。
这个法子是我一个偶然的机会,想起来的。到网上一查,发现我广大网友也想到了并且已实现了。
实现的博客
该方式我最后没有去实现,原因有两个,第一:项目的压力,没有时间去实施和测试。第二:运维方面表示该方案不是官方的方案指不定有不少坑在里头。我: (⊙︿⊙)

3. 采用程序同步的方式

3.1 监听数据变更,及时将变革的数据同步出来
该手段的灵感参考了neo4j-elasticsearch 数据同步的插件。当需要强大的检索功能,所有需要被查询的数据都在neo4j。就可以使用该插件了。
该插件的原理:程序中实现了neo4j 某个接口(Storage类),当数据变更时,通过监听回调可以拿到变更的数据,进而可以把数据同步一份到ES中来。
这个插件的用途就是配合ES强大的模糊匹配查询功能,弥补neo4j 模糊查询方面的欠缺。类似于给neo4j做二次索引的一个功效。
插件资料: (1) 插件介绍 (2)插件github地址
本人追踪未实现,原因是从新编码,需要实现关系同步,全量数据同步的问题。同步的性能未知。时间上不允许我去实现 (⊙︿⊙) ,只能后续抽空自己去学习实现了。
3.2 mysql 同步到neo4j
知道有手段直接将数据同步到neo4j 而且性能还不满,可以从这个入口进行下手。理想状态就是:有相应比较可靠的工具,将MySQL数据同步到多个neo4j 并且支持全量/量同步。
问题: 将mysql里头的数据同步到neo4j 可以实现 但是mysql 库 和你 neo4j 实力是多对对的关系,如何将他们同步呢?
简化一下,如何将mysql 同步到多个neo4j 中呢? 插件? 定时任务?
3.3 neo4j-apoc  load.csv + apoc.load.relationship
通过利用APOC 插件可以高效的实现热备。所以是不是可以将数据全量/或者增量的备份呢?
大体过程是这样子:
(1)通过定时任务去定时(30分钟)neo4j 主库的数据备份出来保存成一个csv文件。
(2)然后把改文件的内容保存到neo4j 从库。
(3)通过定时任务(30分钟)将新的文件导入neo4j 从库。
这样的话,就可以满足数据同步的要求。这种方式对于数据要求实时性的场景不太适用,因为备份同步过程中的新增,或变更的数据是同步不到的。不过对于实时性要求不高比如,T+1 ,一个小时之内生效的数据到时没有什么问题。这样的实现方式不是还可以做数据备份么,一举多得 (ps :本人就是这样子做数据备份的。不知道有没有同行也是被逼无奈采用这样的方式进行解决数据备份问题。哈哈哈哈)
性能实测:4 核 + 8G 4W 节点 + 8万边 备份时间:2秒 导入时间 3 秒
实现注意细节:
1. 备份还原的数据最好建立所有。不然导入数据特别慢。ps:理论上这么大的数据也有应该创建索引,假如导入特别慢则检查从节点是否忘记创建索引了

3.4 neo4j etl
这种方式没有细想,更上边的es类似。不过可以参考一下怎么把变更的数据捞出来。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐