连接到部署在 GCP 上的 cassandra 集群
Connect to cassandra cluster deployed on GCP
我在 Kubernetes 的 GCP 上有一个 3 节点集群 运行。我能够转发端口并使用我的数据库工具连接到集群:
$ kubectl port-forward elassandra-0 9042
当我尝试从我的 Spring 引导应用程序连接到 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.operationComplete(Connection.java:167)
at com.datastax.driver.core.Connection.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-数据框架正在从集群中拉出其他主机。
我做错了什么?
谢谢。
回答自己的问题:
您需要按照此处所述指定自定义地址解析驱动程序端:
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() {}
}
要添加更多详细信息,因为您启用了自动地址解析,您的客户端正在尝试向集群中的所有节点添加联系点:
10.4.3.3:9042
10.4.2.4:9042
127.0.0.1:9042
但是,无法从您的本地主机找到前 2 个节点,因为它们未被代理。如果您将它们添加为代理,它也不会工作,因为您无法在笔记本电脑的同一端口上进行代理。 @AlexTbk 提到的解决方案是使用单个联系点,但在客户端上使用单个 127.0.0.1:9042
联系点指定地址解析。
我在 Kubernetes 的 GCP 上有一个 3 节点集群 运行。我能够转发端口并使用我的数据库工具连接到集群:
$ kubectl port-forward elassandra-0 9042
当我尝试从我的 Spring 引导应用程序连接到 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.operationComplete(Connection.java:167)
at com.datastax.driver.core.Connection.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-数据框架正在从集群中拉出其他主机。
我做错了什么?
谢谢。
回答自己的问题:
您需要按照此处所述指定自定义地址解析驱动程序端:
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() {}
}
要添加更多详细信息,因为您启用了自动地址解析,您的客户端正在尝试向集群中的所有节点添加联系点:
10.4.3.3:9042
10.4.2.4:9042
127.0.0.1:9042
但是,无法从您的本地主机找到前 2 个节点,因为它们未被代理。如果您将它们添加为代理,它也不会工作,因为您无法在笔记本电脑的同一端口上进行代理。 @AlexTbk 提到的解决方案是使用单个联系点,但在客户端上使用单个 127.0.0.1:9042
联系点指定地址解析。