如何将客户端应用程序正确连接到 Scylla 或 Cassandra?

How to properly connect client application to Scylla or Cassandra?

假设我在我的本地网络中有一个包含 3 个节点的 ScyllaDB 集群(它可以是 AWS VPC)。 我的 Java 应用程序 运行 在同一个本地网络中。

我很关心如何将应用程序正确连接到数据库。

如果能提供有关如何将 Java 应用程序连接到多节点集群的代码示例,我将不胜感激。

您需要指定联系点(您可以使用 DNS 名称而不是 IP)- 几个节点(通常是 2-3 个),驱动程序将连接到其中一个,并在之后发现集群的所有节点连接(查看 driver's documentation). After connection is established, driver keeps the separate control connection 已打开,并通过它接收有关正在上升和下降的节点、加入或离开集群等的信息,因此它能够使有关集群拓扑的信息保持最新。

如果您要指定 DNS 名称而不是 IP 地址,那么最好将配置参数 datastax-java-driver.advanced.resolve-contact-points 指定为 true(参见 docs),这样名称将是在每次重新连接时解析为 IP,而不是在应用程序开始时解析。

Alex Ott 的回答是正确的,但我想添加更多背景,使其看起来不那么随意。

要连接的 2 个或 3 个节点的选择在 https://docs.scylladb.com/kb/seed-nodes/

但是,展望未来,Scylla 希望不再区分种子节点和非种子节点。因此,在未来的版本中,答案可能会有所不同。有关这些发展的详细信息,请访问: https://www.scylladb.com/2020/09/22/seedless-nosql-getting-rid-of-seed-nodes-in-scylla/

回答具体问题:

Do I need to specify all 3 IP addresses of DB nodes for the app?

没有。您的应用程序只需要一个即可运行。但是有几个可能不是一个坏主意,以防万一一个坏了。

What if over time one or several nodes die and get resurrected on other IPs?

只要您的应用不停止,它就会保持自己的八卦版本。因此它将看到正在添加的新节点并根据需要连接到它们。

Do I have to manually reconfigure application?

如果您要指定 IP 地址,是的。

How is it done properly in big real production cases with tens of DB servers, possibly in different data centers?

通过抽象出对特定 IP 的需求,使用类似 Consul 的方法。如果愿意,您可以轻松地构建一个简单的 restful 服务来公开库存列表甚至 nodetool status.

的结果