AllNodesFailedException:无法到达任何联系点

时间:2019-09-20 16:51:56

标签: java docker cassandra

我已经通过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:错误书写)

3 个答案:

答案 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;
      }
}