“未能使用服务器更新路由表”错误解释
如果在 $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 驱动程序手册的参考资料
此页面有帮助吗?