我使用在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
问题是在一开始,
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已启动(已验证),并且连接成功。这里有什么东西不见了吗?
所以这里的问题是键空间的定义。
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的作用相反)? 问题答案: 关于如何以一致的,易于理解的和可移植的方式执行此操作的问题已有很长时间的讨论。尚无完整的解决方案,但我会将您链接到下面的讨论。 无论如何,您都想尝