我通过docker在三个数据中心(dc1、dc2和dc3)中设置了三个cassandra节点(cas1、cas2和cas3)。我想使用javaapi在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(空,/172.17.0.2:19041):com.datastax.oss.driver.api.core.connection.connectioninitexception:[s0 | control | connecting…]初始化查询启动:写入错误)
2条答案
按热度按时间9udxz4iz1#
成功了。我使用了ip:127.0.0.1,而不是全局ip和端口19041(我显式配置),它成功地连接了。
z4bn682m2#
所有datastax驱动程序都从内置的数据中心故障转移和来自接触点的本地推断转移((来源)
如果使用spring/springboot,则必须指定数据中心名称。将此行添加到application.properties:
spring.data.cassandra.local-datacenter=datacenter1
对于数据中心的名称,“datacenter1”是默认名称。您可以在cqlsh中使用以下命令找到数据中心的名称:select data_center from system.local;
另外,不要忘记关闭cqlsh会话,因为它可能会导致在下一个请求中到达单节点cassandra集群时出现一些问题。Session.close()