【问题标题】:Connect to Cassandra on Kubernetes using java-driver使用 java-driver 连接到 Kubernetes 上的 Cassandra
【发布时间】:2022-01-06 07:29:08
【问题描述】:

我们正在建立一个 Cassandra 集群,使用 k8ssandra helm chart,它公开了几个服务,我们的客户端应用程序使用 datastax Java-Driver 并在与 Cassandra 集群相同的 k8s 集群上运行(这是测试阶段)

CqlSessionBuilder builder = CqlSession.builder();

将应用程序(通过驱动程序)连接到 Cassandra 的推荐方法是什么?

添加所有节点?

for (String node :nodes) {
   builder.addContactPoint(new InetSocketAddress(node, 9042));
}

只添加服务地址?

 builder.addContactPoint(new InetSocketAddress(service-dns-name , 9042))

将服务地址添加为未解析? (这还能用吗?)

 builder.addContactPoint(InetSocketAddress.createUnresolved(service-dns-name , 9042))

【问题讨论】:

    标签: kubernetes cassandra cassandra-4.0 cass-operator k8ssandra


    【解决方案1】:

    添加所有节点?

    您绝对不需要将所有节点都添加为接触点。即使在香草 Cassandra 中,只添加一些也可以,因为驱动程序会闲聊并找到其余的。

    只添加服务地址?

    您需要做的就是绑定服务地址的第二个选项。服务地址的好处在于,它将考虑更改/删除集群中的 IP。

    【讨论】:

    • 感谢 Aaron,正如我在上面所写的,驱动 API 与 InetSocketAddress 一起工作的问题是,此类构造函数立即将服务名称解析为 IP,只采用第一个 IP 地址
    【解决方案2】:

    k8ssandra Helm 图表部署了 CassandraDatacenter 对象和 cass-operator 以及许多其他资源。 cass-operator 负责管理 CassandraDatacenter。它创建 StatefulSet(s) 并创建多个无头服务,包括:

    • 数据中心服务
    • 种子服务
    • 所有 pod 服务

    种子服务仅解析为种子的豆荚。它的名称格式为<cluster-name>-seed-service。由于 pod 的短暂性,cass-operator 可以将不同的 C* 节点指定为种子节点。不要使用种子服务来连接客户端应用程序。

    所有 pods 服务解析到所有 Cassandra pod,无论它们是否准备就绪。它的名称格式为<cluster-name>-<dc-name>-all-pods-service。该服务旨在促进监控。不要使用 all pods 服务来连接客户端应用程序。

    数据中心服务解析为就绪的 pod。它的名称格式为<cluster-name>-<dc-name>-service 这是您应该用于连接客户端应用程序的服务。不要直接使用 pod IP,因为它们会随着时间而改变。

    【讨论】:

    • 感谢@John Sanda,这很有帮助!问题是驱动 API 看起来像这样: addContactPoint(@NonNull InetSocketAddress contactPoint) InetSocketAddress 构造函数解析地址并获取第一个 IP: addr = InetAddress.getByName(hostname);那么如果立即解析,使用服务 dns 名称有什么用呢?
    • 使用该服务的要点是,如果第一个接触点失败,那么您可以尝试后续的。
    猜你喜欢
    • 2018-12-16
    • 2016-12-11
    • 2013-05-22
    • 2015-06-15
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多