【问题标题】:Neo4j v2.2.3 Embedded HA: can't create clusterNeo4j v2.2.3 Embedded HA:无法创建集群
【发布时间】:2015-06-25 22:03:02
【问题描述】:

我有一个嵌入式 Neo4j v2.2.3 三个相同的服务器设置,我试图将单个数据库转换为 HA 设置。我已经尝试使用每种数据库组合开始 HA 过程:全部为空,全部为空,并且全部使用相同的数据库,但无济于事。 AFAIK 出于某种原因,Neo4j 实例无法相互连接。我已经验证了IP地址是正确的,并且5001端口应该是开放的。我也开了6001。

这是我的messages.log。

2015-06-25 20:37:16.461+0000 INFO  [o.n.k.i.DiagnosticsManager]: --- INITIALIZED diagnostics START ---
2015-06-25 20:37:16.462+0000 INFO  [o.n.k.i.DiagnosticsManager]: Neo4j Kernel properties:
2015-06-25 20:37:16.467+0000 INFO  [o.n.k.i.DiagnosticsManager]: ha.server_id=1
2015-06-25 20:37:16.467+0000 INFO  [o.n.k.i.DiagnosticsManager]: ha.server=:6001
2015-06-25 20:37:16.467+0000 INFO  [o.n.k.i.DiagnosticsManager]: online_backup_server=0.0.0.0:6362
2015-06-25 20:37:16.467+0000 INFO  [o.n.k.i.DiagnosticsManager]: ephemeral=false
2015-06-25 20:37:16.467+0000 INFO  [o.n.k.i.DiagnosticsManager]: ha.initial_hosts=[IP1]:5001,[IP2]:5001,[IP3]:5001
2015-06-25 20:37:16.467+0000 INFO  [o.n.k.i.DiagnosticsManager]: online_backup_enabled=true
2015-06-25 20:37:16.468+0000 INFO  [o.n.k.i.DiagnosticsManager]: ha.cluster_server=:5001
2015-06-25 20:37:16.468+0000 INFO  [o.n.k.i.DiagnosticsManager]: store_dir=/var/neo4j
2015-06-25 20:37:16.468+0000 INFO  [o.n.k.i.DiagnosticsManager]: org.neo4j.server.webserver.address=0.0.0.0
2015-06-25 20:37:16.468+0000 INFO  [o.n.k.i.DiagnosticsManager]: org.neo4j.server.database.mode=HA
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: Diagnostics providers:
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: org.neo4j.kernel.configuration.Config
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: org.neo4j.kernel.info.DiagnosticsManager
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: SYSTEM_MEMORY
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: JAVA_MEMORY
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: OPERATING_SYSTEM
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: JAVA_VIRTUAL_MACHINE
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: CLASSPATH
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: LIBRARY_PATH
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: SYSTEM_PROPERTIES
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: LINUX_SCHEDULERS
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: NETWORK
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: NodeCache
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: RelationshipCache
2015-06-25 20:37:16.469+0000 INFO  [o.n.k.i.DiagnosticsManager]: HighAvailabilityDiagnostics

....

2015-06-25 21:55:36.502+0000 INFO  [o.n.k.i.DiagnosticsManager]: High Availability diagnostics
Member state:PENDING
State machines:
   AtomicBroadcastMessage:start
   AcceptorMessage:start
   ProposerMessage:start
   LearnerMessage:start
   HeartbeatMessage:start
   ElectionMessage:start
   SnapshotMessage:start
   ClusterMessage:start
Current timeouts:

最终两分钟后我得到一个交易异常:

Caused by: org.neo4j.graphdb.TransactionFailureException: Timeout waiting for database to become available and allow new transactions. Waited 2m. 2 reasons for blocking: Database is stopped, Cluster state is 'PENDING'.

我创建了一个graphDatabaseFactory = new HighlyAvailableGraphDatabaseFactory(),用于创建

DatabaseServiceImpl(
    graphDatabaseFactory
      .newEmbeddedDatabaseBuilder(neo4jStoreDir)
      .loadPropertiesFromFile(configFileLocation)
      .newGraphDatabase())

这就是我的 neo4j.properties 的样子:

online_backup_enabled=true
online_backup_server=0.0.0.0:6362
org.neo4j.server.webserver.address=0.0.0.0
org.neo4j.server.database.mode=HA
ha.server_id=1
ha.cluster_server=0.0.0.0:5001
ha.server=0.0.0.0:6001
ha.initial_hosts=[IP1]:5001,[IP2]:5001,[IP3]:5001

我尝试了很多不同的属性组合,还添加了来自 neo4-server.properties 的 suggested 值,但没有任何帮助。我应该在哪里将 neo4j-server.properties 置于嵌入式模式,还是不需要它们(这是我最初的猜测)?

可能出了什么问题?甚至可以使用嵌入式 Neo4j 设置 HA 集群吗?

编辑。我确保每台服务器都在同一个子网中,并且服务器可以无障碍地相互连接。

【问题讨论】:

    标签: neo4j high-availability


    【解决方案1】:

    Neo4j 绝对支持嵌入式模式的集群——您甚至可以在同一个集群中混合服务器和嵌入式实例。

    在嵌入式模式下运行时,您根本不需要来自neo4j-server.properties 的设置。

    需要检查的一些事项:

    1. 确保 3 个集群成员在同一个子网上。如果它们不是并且它们在物理上错位,请考虑建立一个 VPN(例如通过 openvpn)以使它们位于同一子网中。
    2. 允许集群成员之间的任何 IP 流量,它们将打开额外的端口。

    【讨论】:

    • 谢谢! Wrt:“他们将开放额外的端口”,我目前只开放了 5001 和 6001 端口,但可以开放一个端口范围。有没有办法知道 Neo4j 尝试打开哪些端口?
    • 推荐设置是启用集群成员之间的任何通信。过于挑剔可能会导致难以调试的问题,例如Neo4j 的未来版本会更改有关通信渠道的实现。
    • 我正在尝试在 Docker 上运行它,目前似乎不可能公开每个端口。问题可能出在 ha.server 和 ha.cluster_server 设置上。我不太明白它们是什么,或者我可以将它们设置为 0.0.0.0 还是应该使用其他东西。我有一个 MongoDB 集群在同一台机器上成功运行,在容器内,所以不应该有任何 IP 问题。除了我不知道要公开哪些端口。我尝试了 5000-7000,但没有奏效。
    • 也许你可以检查这个 docker setup 以获得一些想法/提示:github.com/ekino/docker-neo4j-cluster
    • 感谢链接,我自己没找到!不幸的是,它使用的是位于同一台机器上的 DNS。这可能有效,但另一种选择是大使的事情,正如在此相同问题中所建议的那样:reddit.com/r/Neo4j/comments/349sev/neo4j_ha_behind_docker 最奇怪的是,有关于 HA 的日志:我的 messages.log 不包含任何关于 HA 的错误。这让我想知道 HA 设置是否正确?我的messages.log 中唯一与HA 相关的信息是“高可用性诊断”,但没有打印任何其他信息。
    【解决方案2】:

    所以问题原来是我正在使用new HighlyAvailableGraphDatabaseFactory().addKernelExtensions(myKernelExtensionsArray) 设置的内核扩展。 addKernelExtensions 方法已弃用,但这些扩展适用于单个服务器设置。但是,在此 HA 服务器设置中,它们由于某种原因而失败。

    通过将addKernelExtensions 的调用替换为registerTransacionEventHandler,我能够重用我的内核扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      相关资源
      最近更新 更多