当前位置: 首页 > 知识库问答 >
问题:

Cassandra容器数据库NoNodeAvailableException

相温文
2023-03-14

我使用在docker容器上运行的Cassandra docker映像和Spring Boot服务,并使用Datastax Java驱动程序

我可以连接Cassandra,也可以查看日志,下面是docker compose文件,

version: '3.5'

networks:
  my-network:

 cassandra-db:
    container_name: cassandra-db
    image: cassandra:4.0-beta1
    ports:
      - "9042:9042"
    restart: on-failure
    environment:
      - CASSANDRA_CLUSTER_NAME='cassandra-cluster'
      - CASSANDRA_NUM_TOKENS=256
      - CASSANDRA_RPC_ADDRESS=0.0.0.0
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
    volumes:
      - ./out/cassandra_data:/var/lib/cassandra
    networks:
      - my-network


 client-service:
    container_name: client-service
    image: data/client-service
    environment:
      - SPRING_PROFILES_ACTIVE=dev
    ports:
      - 8087:8087
    depends_on:
      - cassandra-db
    links:
      - cassandra-db
    networks:
      - my-network

我的密钥空间查询是,

CREATE KEYSPACE IF NOT EXISTS SensorKeySpace WITH replication = {'class':'NetworkTopologyStrategy','replication_factor':3}

以及使用,

.addContactEndPoint(new DefaultEndPoint(
                        InetSocketAddress.createUnresolved("cassandra-db",9042)))
                .withLocalDatacenter("DC1")
                .withKeyspace(CassandraConstant.KEY_SPACE_NAME.getValue())
                .build();

Cassandra已经启动并运行了,并且验证了它,

CONTAINER ID        IMAGE         COMMAND                  CREATED             STATUS              PORTS                                  NAMES
57d1d29dbf00  client-service      "java -Djava.securit…"   4 minutes ago       Up 4 minutes   0.0.0.0:8087->8087/tcp                      client-service
00548a4058e6  cassandra:4.0-beta1  "docker-entrypoint.s…"   4 minutes ago  Up 4 minutes   7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp   cassandra-db

问题是在一开始,

  1. 我使用了simplestregy来创建键空间,得到了以下错误:
Caused by: [com.datastax.oss.driver.api.core.CqlSession]: Factory method 'session' threw exception; nested exception is java.lang.IllegalStateException: Since you provided explicit contact points, the local DC must be explicitly set (see basic.load-balancing-policy.local-datacenter in the config, or set it programmatically with SessionBuilder.withLocalDatacenter). Current contact points are: Node(endPoint=cassandra-db:9042, hostId=729bd04f-b345-4df3-a148-80545d30e032, hashCode=5563e4c4)=datacenter1. Current DCs in this cluster are: datacenter1

然后配置. with LocalDatacenter("DC1")-在docker撰写中的CASSANDRA_ENDPOINT_SNITCH=不过。

The Select Query is [SELECT NAME,VALUE FROM READING ]
client-service       | 2020-09-08 11:12:38.480 ERROR 1 --- [nio-8087-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.util.concurrent.ExecutionException: org.springframework.data.cassandra.CassandraConnectionFailureException: Query; CQL [com.datastax.oss.driver.internal.core.cql.DefaultSimpleStatement@1265401a]; No node was available to execute the query; nested exception is com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query] with root cause
client-service       | com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query

我看了API文档https://docs.datastax.com/en/drivers/java/4.0/com/datastax/oss/driver/api/core/NoNodeAvailableException.html告诉我

This can happen if all nodes are down, or if all the contact points provided at startup were invalid.

我的Cassandra DB已启动(已验证),并且连接成功。这里有什么东西不见了吗?


共有1个答案

颛孙博易
2023-03-14
匿名用户

所以这里的问题是键空间的定义。

CREATE KEYSPACE IF NOT EXISTS SensorKeySpace WITH replication = 
    {'class':'NetworkTopologyStrategy','replication_factor':3}

网络拓扑策略支持数据中心。这意味着需要为每个数据中心设置复制。据我所见,你的代码似乎在寻找“DC1”数据中心。

.withLocalDatacenter("DC1")

但是,你的日志告诉你:

集群中的当前DC是:数据中心1

这意味着您的密钥空间定义应该如下所示:

CREATE KEYSPACE IF NOT EXISTS SensorKeySpace WITH replication = 
    {'class':'NetworkTopologyStrategy','datacenter1':3}

你的代码应该是:

.withLocalDatacenter("datacenter1")

注意:数据中心名称区分大小写。确保验证您在cassandra rackdc中使用的数据中心名称。属性文件。

 类似资料:
  • 我试着在Cassandra 2.1.12上使用spring-data-cassandra 1.3.4和最新的cassandra-driver-core:3.0.(DSE4.8.4的一部分),结果一切正常。同样的spring批处理不能用于普通的Cassandra3.x版本。我在Cassandra 3.2、3.3和3.4上试用了它。 我得到了,它在下面的堆栈跟踪中提到。 现在我完全理解了这是由于“co

  • 问题内容: 我是Docker的新手。是否可以将sqlite数据库嵌入docker容器中,并在每次运行该容器中的脚本时对其进行更新? 问题答案: 安装sqlite3的Dockerfile示例 将db文件保留在主机OS文件夹/ home / dbfolder中

  • 我在我的项目中使用postgres docker映像。对于初始化,我使用以下命令来创建和初始化我的数据库(表、视图、数据…) 复制sql_dump.sql /docker-entrypoint-initdb.d 容器停止和删除后是否可以保留这些数据?例如,当我运行postgres的图像时,它将使用这些数据创建数据库,而每次容器启动时都没有加载脚本。只需加载第一次运行创建的数据。 我做了一些研究,发

  • 目前情况: 我通过执行以下命令创建了一个新的Cassandra映像“Cassandra”和一个名为“container-node”的容器: Docker pull Cassandra Docker images grep Cassandra Docker run-d--name cassandra-node--publish 9042:9042 cassandra 连接到容器:docker exe

  • 在将Django docker容器连接到Postgres数据库时,我收到以下错误。 下面是运行容器的Dockerfile pg_hba.conf->宿主all all 0.0.0.0/0 md5 我已经读到上面的以下细节打开数据库上的连接。

  • 问题内容: 如果我在某个主机上运行mysql数据库,并且该主机也正在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库? 例如,是否有一种方法可以将主机端口发布到容器(与docker run -p的作用相反)? 问题答案: 关于如何以一致的,易于理解的和可移植的方式执行此操作的问题已有很长时间的讨论。尚无完整的解决方案,但我会将您链接到下面的讨论。 无论如何,您都想尝