【问题标题】:How to properly connect client application to Scylla or Cassandra?如何正确地将客户端应用程序连接到 Scylla 或 Cassandra?
【发布时间】:2021-02-03 02:33:39
【问题描述】:

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

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

  • 是否需要为应用指定所有 3 个 DB 节点的 IP 地址?
  • 如果随着时间的推移一个或多个节点死亡并在其他 IP 上复活怎么办?我是否必须手动重新配置应用程序?
  • 如何在具有数十个数据库服务器(可能位于不同数据中心)的大型实际生产案例中正确完成?

我将非常感谢有关如何将 Java 应用程序连接到多节点集群的代码示例。

【问题讨论】:

    标签: cassandra scylla


    【解决方案1】:

    需要指定联系点(可以使用DNS名称代替IP)——几个节点(一般2-3个),驱动会连接其中一个,连接后会发现集群的所有节点(请参阅driver's documentation)。连接建立后,驱动保持单独的control connection处于打开状态,通过它接收节点上下、加入或离开集群等信息,从而保持集群拓扑的最新信息。 -日期。

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

    【讨论】:

      【解决方案2】:

      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/

      【讨论】:

      • Scylla 是否关心指定为连接端点的节点是否是种子节点?这对我来说听起来很奇怪。
      • 不,它没有。种子节点对于服务器->服务器通信很重要(在较新版本中不太重要),而不是对于客户端->服务器通信。
      • 短语“种子节点”与原始问题无关。 “种子节点”是 Scylla 内部的一个实现细节,它与 Scylla 集群中的新节点如何相互了解有关。客户根本不关心“种子节点”的概念。他们可以连接到任何一个现存的 Scylla 节点并了解所有其他节点。话虽如此,客户端确实需要一种方法来找到至少一个这样的节点,而 Scylla 并没有告诉你如何去做。
      【解决方案3】:

      回答具体问题:

      我需要为应用程序指定所有 3 个 DB 节点的 IP 地址吗?

      没有。您的应用只需要一个即可运行。但拥有一些可能不是一个坏主意,以防万一出现故障。

      如果随着时间的推移一个或多个节点死亡并在其他 IP 上复活怎么办?

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

      我必须手动重新配置应用程序吗?

      如果您指定 IP 地址,可以。

      如何在具有数十台数据库服务器的大型实际生产案例中正确完成,可能位于不同的数据中心?

      通过抽象出对特定 IP 的需求,使用 Consul 之类的东西。如果您愿意,您可以轻松构建一个简单的 RESTful 服务来公开库存列表,甚至是 nodetool status 的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 2018-04-02
        • 1970-01-01
        • 2019-10-06
        相关资源
        最近更新 更多