【问题标题】:Connect to cassandra cluster deployed on GCP连接到部署在 GCP 上的 cassandra 集群
【发布时间】:2019-04-17 17:02:36
【问题描述】:

我有一个在 Kubernetes 的 GCP 上运行的 3 节点集群。我能够转发端口并使用我的数据库工具连接到集群:

$ kubectl port-forward elassandra-0 9042

当我尝试从我的 Spring Boot 应用程序连接到 cassandra 集群时,我收到以下错误:

2018-11-14 17:43:36,339 INFO  [5914] [localhost-startStop-1] c.d.d.c.Cluster [Cluster.java:1587] New Cassandra host /10.4.3.3:9042 added
2018-11-14 17:43:36,339 INFO  [5914] [localhost-startStop-1] c.d.d.c.Cluster [Cluster.java:1587] New Cassandra host /10.4.2.4:9042 added
2018-11-14 17:43:36,340 INFO  [5915] [localhost-startStop-1] c.d.d.c.Cluster [Cluster.java:1587] New Cassandra host /127.0.0.1:9042 added
2018-11-14 17:43:41,391 WARN  [10966] [cluster1-nio-worker-2] c.d.d.c.HostConnectionPool [HostConnectionPool.java:184] Error creating connection to /10.4.2.4:9042

com.datastax.driver.core.exceptions.TransportException: [/10.4.2.4:9042] Cannot connect
at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:167)
at com.datastax.driver.core.Connection$1.operationComplete(Connection.java:150)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:121)

我正在尝试连接到 127.0.0.1:9042,其他主机正在被 spring-data 框架从集群中拉出。

我在这里做错了什么?

谢谢。

【问题讨论】:

  • 您的应用正在 Kubernetes 中运行?
  • 没有。在 kubernetes (ClusteIP: none) 上运行的本地连接工作正常。我正在尝试找到一种从外部连接的方法。例如用于调试目的。它通过端口转发连接到指定的本地主机,但是主机返回其他2个内部IP地址,无法从外部直接访问。

标签: cassandra kubernetes google-cloud-platform spring-data-cassandra


【解决方案1】:

回答自己的问题:

您需要按照此处所述指定自定义地址解析驱动程序端:

https://docs.datastax.com/en/developer/java-driver/2.1/manual/address_resolution/

当您只想使用一个节点时详细说明:

public class MyAdressTranslator implements AddressTranslator {
    @Override
    public void init(Cluster cluster) {}

    public InetSocketAddress translate(InetSocketAddress address) {
        return new InetSocketAddress("127.0.0.1", 9042);
    }

    @Override
    public void close() {}
}

【讨论】:

    【解决方案2】:

    由于您启用了自动地址解析,因此要添加更多详细信息,您的客户端正在尝试将联系点添加到集群中的所有节点:

    10.4.3.3:9042
    10.4.2.4:9042
    127.0.0.1:9042
    

    但是,无法从您的 localhost 中找到前 2 个节点,因为它们没有被代理。如果您将它们添加为代理,它也将不起作用,因为您无法在笔记本电脑的同一端口上进行代理。像@AlexTbk 提到的解决方案是使用单个联系点,但在客户端上使用单个127.0.0.1:9042 联系点指定地址解析。

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 2023-04-06
      • 2016-08-27
      • 2021-08-26
      • 2015-05-02
      • 1970-01-01
      • 2020-10-04
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多