我已经通过docker在三个数据中心(DC1,DC2和DC3)中设置了三个Cassandra节点(cas1,cas2和cas3)。我想使用Java API在cas1上建立会话,但它无法连接并引发异常。
我尝试手动设置端口并寻找可用的解决方案,但是它们没有用。
cas1创建:
docker run --name cas1 -p 19041:9042 -e CASSANDRA_CLUSTER_NAME=MyCluster -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_DC=DC1 -e CASSANDRA_RACK=RAC1 -d cassandra
Java代码:
InetAddress addr = InetAddress.getByName("172.17.0.2");
InetSocketAddress addrSoc = new InetSocketAddress(addr,19041);
CqlSession session = CqlSession.builder().addContactPoint(addrSoc).build();
预期结果:会话应该已经建立。
错误:
datastax.oss.driver.api.core.AllNodesFailedException:无法到达任何联系点,请确保您提供了有效地址(显示前1个,使用getErrors()获取更多信息:com.datastax.oss.driver。 internal.core.metadata.DefaultNode@605c5ab0(null,/ 172.17.0.2:19041):com.datastax.oss.driver.api.core.connection.ConnectionInitException:[s0 | control | connecting ...]初始化查询STARTUP:错误书写)
答案 0 :(得分:0)
有效。我使用IP:127.0.0.1而不是全局IP和端口19041(我已明确配置),并且它设法连接。
答案 1 :(得分:0)
所有DataStax驱动程序都从内置的DataCenter故障转移和联系点的本地推断中转移。 (source)
如果使用Spring / Springboot,则您必须指定数据中心名称。将此行添加到您的application.properties:
spring.data.cassandra.local-datacenter=datacenter1
使用数据中心的名称,“ datacenter1”是默认名称。您可以使用以下命令在cqlsh中找到数据中心的名称:select data_center from system.local;
此外,不要忘记关闭cqlsh会话,因为它可能导致在下一个请求中到达单节点cassandra群集时出现一些问题。
Session.close()
答案 2 :(得分:0)
遇到同样的问题。通过在配置类中将节点ip(172.18.0.2)改为全局ip'127.0.0.1'解决。
我使用 docker-compose 命令来运行 cassandra。请查看我的 docker-compose.yml 文件:
version: '3'
services:
n1:
build: .
image: cassandra-with-cqlshrc
networks:
- cluster
ports:
- "9042:9042"
networks:
cluster:
Java 中的我的 CassandraConfiguration 文件:
@Configuration
@EnableCassandraRepositories
public class CassandraConfiguration extends AbstractCassandraConfiguration {
@Override
public String getContactPoints() {
return "127.0.0.1";
}
@Override
protected String getKeyspaceName() {
return "stockmarket";
}
@Override
protected int getPort() {
return 9042;
}
}