Neo4j HA(2.0-Snapshot),超时等待群集选举主人

时间:2013-05-27 11:34:21

标签: java neo4j cypher

我有一个非常简单的Neo4j HA设置,其中包含一个主实例和一个嵌入式HA实例,我想将其用于批量数据加载。这是主实例配置(我正常“启动”,作为Windows服务):

node_auto_indexing=true
node_keys_indexable=key,entity,annotation
relationship_auto_indexing=true
relationship_keys_indexable=key, weight, label
keep_logical_logs=true
online_backup_enabled=true

ha.server_id=1
ha.initial_hosts=:5001
ha.server=0.0.0.0:6001
ha.cluster_server=:5001
ha.pull_interval=10
ha.tx_push_factor=0
ha.tx_push_strategy=fixed

cypher_parser_version=2.0
remote_shell_enabled=true
remote_shell_port=1377

org.neo4j.server.database.mode=HA

我希望能够按需启动和停止嵌入式设备。所以这是我在Java应用程序中加载的配置:

node_auto_indexing=true
node_keys_indexable=key,annotation
relationship_auto_indexing=true
relationship_keys_indexable=key, weight, label
keep_logical_logs=true

org.neo4j.server.database.mode=HA
ha.server_id=2
ha.slave_only=true

ha.initial_hosts=:5001
ha.server=:6002
ha.cluster_server=:5002

ha.pull_interval=10
cypher_parser_version=2.0

我们的想法是能够将第一个(Windows服务)实例作为单个/独立节点启动,并在需要时启动批处理加载器。

问题

我可以成功启动Windows服务并像往常一样启动查询。当我启动我的应用程序时,它连接得很好,并扮演从属节点的角色。我可以毫无问题地加载我的数据,主节点似乎是同步的,工作正常。现在,如果Java应用程序因任何原因崩溃或完成并关闭,主实例将停止工作,并且任何Cypher查询都会返回以下跟踪:

TransactionFailureException
Timeout waiting for cluster to elect master
StackTrace:
org.neo4j.kernel.ha.HighlyAvailableGraphDatabase.beginTx(HighlyAvailableGraphDatabase.java:207)
org.neo4j.kernel.TransactionBuilderImpl.begin(TransactionBuilderImpl.java:39)
org.neo4j.kernel.InternalAbstractGraphDatabase.beginTx(InternalAbstractGraphDatabase.java:882)
org.neo4j.cypher.ExecutionEngine.prepare(ExecutionEngine.scala:102)
org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:70)
org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:85)
org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:80)
org.neo4j.server.rest.web.CypherService.cypher(CypherService.java:95)
java.lang.reflect.Method.invoke(Unknown Source)
org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112)

我的配置有什么问题吗?

Btw。:如果我重新启动第二个实例,主实例将返回“正常”。

1 个答案:

答案 0 :(得分:3)

这是预期的行为。就集群而言,集群中有两个实例,如果一个实例已关闭,则没有仲裁,因此出于安全原因它变得不可用。在你的设置中,解决这个问题的方法是在主实例上启动一个单独的仲裁器,这样总有3个实例中有2个可用,因此集群被认为是up。