知识库

"无法使用服务器更新路由表"错误说明

如果在您的$NEO4J_HOME/logs/debug.log中遇到类似于无法使用服务器更新路由表的错误,

ERROR 1 --- [o4jDriverIO-5-2] LoadBalancer : Failed to update routing table. Current routing table: Ttl 1582554193442, currentTime 1582554193471, routers AddressSet=[], writers AddressSet=[], readers AddressSet=[]

Suppressed: org.neo4j.driver.exceptions.DiscoveryException: Failed to update routing table with server 'server-foo:7687'.

Caused by: org.neo4j.driver.exceptions.ClientException: There is no procedure with the name `dbms.cluster.routing.getRoutingTable` registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed.

可以通过检查您的 DNS 条目来解决此问题。路由驱动程序是通过bolt+routing URI 创建的,例如 bolt+routing://graph.example.com:7687。URI 中的地址必须是核心服务器的地址。因此,如果您遇到上述错误,很可能您有一个单一的 DNS 名称解析到核心节点和读取副本节点。读取副本不应该在 DNS 记录中具有条目。当主机名解析到核心节点 IP 地址时,一切都会正常工作。但是,当主机名解析到读取副本 IP 地址时,驱动程序将无法连接到数据库,因为它无法从该服务器获取路由表。

修复方法

更改您的 DNS 条目,以确保名称解析仅包括核心节点,而不包括读取副本。

如果只想连接到读取副本怎么办?

我们的一些客户有特定的需求,他们只向读取副本发送读取请求。如果您有类似的要求,您可以执行以下操作 -

  • 将所有核心节点添加到一个 DNS 名称下,例如 - core.graph.example.com

  • 将所有读取副本添加到另一个(单个)DNS 名称下,例如 - rr.graph.example.com

  • 然后,您可以使用以下 URI 连接到读取副本 - bolt://rr.graph.example.com:7687

此选项的优点是,即使核心节点宕机,应用程序仍然可以连接到读取副本。

缺点是每个应用程序只能与一个读取副本通信,因为它使用了bolt协议。这意味着多个应用程序可能连接到单个读取副本,并且可能无法利用所有可用的读取副本。

Neo4j 驱动程序手册中的参考