2013-05-27 47 views
0

我有一个非常简单的Neo4j HA设置,带有一个主实例和一个嵌入式HA实例,我想用它来批量加载数据。这里的主实例配置(一个我推出“正常”,作为Windows服务):Neo4j HA(2.0-快照),超时等待群集选举主人

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服务和消防查询如常。当我开始我的应用程序时,它连接得很好并且扮演一个从节点的角色。我可以加载我的数据没有问题,主节点似乎是同步的,工作正常。现在,如果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 .:如果我重新启动第二个实例,则主实例返回到“normal”。

回答

3

这是预期的行为。就集群而言,集群中有两个实例,如果有一个实例没有达到法定人数,那么出于安全原因它就变得不可用。在你的设置中,解决这个问题的方法是在主实例上启动一个独立的仲裁器,以便总共有3个可用实例中的2个,因此该群集被视为处于启动状态。

+0

感谢您的信息。因此,任何HA设置的最小值都是两个节点,它们必须始终保持一致。 – Michael

+0

@ rickard-berg您能否提供一些指导,如何启动仲裁实例?我也浏览了官方文档,但无法在上面回答。 – agpt