【发布时间】:2015-03-10 13:24:56
【问题描述】:
8 个实例构成我的 Neo4j HA 集群(Neo4j 版本 2.1.2)
我使用新闻提要算法执行该技术的基准测试。
单个客户端每个实例同时执行 50 个读取(!)查询,目标是部署到所有实例的 server plugin。
基准测试在所有实例都从主实例引导数据后开始。请求由客户端循环分发。
如果我使用具有 3 或 4 个实例的集群,一切正常。 负载均匀分布在所有实例中(根据 CPU 负载),并且达到了低请求延迟。
但是,对于 8 个实例,其中 2 个实例立即具有很高的请求延迟。
由于高请求率,它们在 3 秒内从 500 毫秒增加到 10 秒,并随着基准持续时间进一步增加。
这些实例的 CPU 负载最大。
其余 6 个实例现在 CPU 负载较低,因为客户端仍在等待挂起的请求。
如果我不对 2 个实例发出请求,其余 6 个实例将按预期执行。
如果我更改顺序,相同的实例会被阻塞,因此这与服务器 ID 无关。
如果我从集群中删除其中一个实例,另一个实例仍处于阻塞状态。
这似乎与具体实例有关,但所有8个实例的设置都是相同的,因为它们是虚拟机。
日志文件也不包含提示。所有实例都在主服务器的console.log 中标记为可用。
任何想法是什么导致了这个问题以及如何解决它?
作为一个肮脏的修复,我将启动一个包含 10 个实例的集群并只使用其中的 8 个,但这不是一个好的解决方案。
编辑: 由于节点属性上的索引创建,我观察到类似的行为。 每个节点的第一个请求加载索引并等待 10 秒以使其可用,这在某些情况下时间太短了。 我立即停止了基准测试。所有节点的 CPU 负载都很高,当 CPU 空闲时,我只是重新启动了 Neo4j 服务器。 当它们再次上涨时,指数就可用了——在大多数情况下。
因此,这可能是与索引相关的问题。在 HA 集群中创建索引的正确方法是什么?
【问题讨论】:
-
也许你可以分享你的插件代码,也可以查看受影响实例的堆栈跟踪(jstack
或 kill -3 )