我在 Kubernetes 环境中部署了一个 Java 应用程序作为 pod,以及具有 3 节点集群的 Cassandra。我正在使用 Cassandra 服务 FQDN 连接到 Cassandra。由于 Cassandra pod 重新启动,其所有 IP 均已更改,并且 Cassandra 客户端/java 仍连接到旧 IP。以下错误:
Error while opening new channel ( \
ConnectionInitException: [s0|connecting...] \
Protocol initialization request, step 1 (STARTUP {\
CQL_VERSION=3.0.0, \
DRIVER_NAME=Apache Cassandra Java Driver, \
DRIVER_VERSION=4.18.0, \
CLIENT_ID=c6ddf75c-3ffd-433a-b6ee
}): failed to send request (java.nio.channels.NotYetConnectedException))
尽管我们通过服务 FQDN 连接,如何使 java 应用程序(使用 Java 17)连接到最新的 IP?
Java版本:17,cassandra驱动程序版本:4.18
Cassandra Java 驱动程序的默认行为是将服务 FQDN(联系点)解析为 IP 地址一次。这些 IP 地址由驱动程序缓存并用于后续连接尝试。
这种行为在动态环境中显然是有问题的,例如 Kubernetes 部署,其中当底层 Pod 重新启动/重新调度时,Cassandra 节点的 IP 地址会发生变化。
在 Java 驱动程序 4.0 中,添加了一个新的配置选项来覆盖默认行为 (JAVA-1978):
datastax-java-driver {
advanced {
resolve-contact-points = false
}
}
这告诉驾驶员保留未解析的联系点地址。如果驱动程序出于某种原因需要重新连接到节点,它将再次解析服务 FQDN,以便在 IP 地址发生更改时获取新的 IP 地址。这也意味着您无需重新启动应用程序即可强制驱动程序刷新其集群元数据副本。
有关
resolve-contact-points
选项的更多信息,请参阅 Cassandra Java 驱动程序参考配置。干杯!