我知道有几个关于_892747的线程,但他们根本没有提供我的问题的解决方案 .
我无法使用Datastax Java Cassandra Driver连接到Cassandra . 我得到错误:
com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询失败的所有主机(已尝试:[/54.221.241.107])
我确信配置是正确的 . 我在cassandra.yaml中设置了配置:
start_native_transport: true
# port for the CQL native transport to listen for clients on
native_transport_port: 9042
我的Cassandra安装是AWS上EC2实例上的标准安装 . 我已将AWS配置为允许端口9042 .
Cassandra在Windows Server 2008 R2上运行,我还在9042上将防火墙配置为入站和出站连接 .
我的代码如下所示:
cluster = Cluster.builder()
.withPort(9042)
.addContactPoint("54.221.241.107").build();
我不知道该怎么办,因为我总是得到这个错误 . 有什么建议?
5 回答
检查你的casssandra.yaml文件 . native_transport使用与rpc_address相同的地址绑定 . 如果它绑定到“54.221.241.107”之外的另一个地址,您将遇到此问题 . 尝试将其设置为
或者
并看看它是否有帮助 . 请记住,ec2-ips可能会在重新启动时发生变化 .
我的猜测是绑定到ec-2的内部ip . 如果以这种方式向公众开放数据库,请记住添加一些安全性:-)
改变 public IP to private IP .
如果您的cassandra在EC2中,则需要在yaml配置 rpc_address: PRIVATE_IP 中配置专用IP .
如果您的客户端程序(用于连接cassandra的Java应用程序)也在EC2中,那么您应该在代码 .addContactPoint("PRIVATE_IP").build(); 中添加私有IP .
如果你的cassandra在EC2中并且你的客户端应用程序在EC2之外(意味着本地网络中的客户端java应用程序),则需要配置 private IP in yaml configurations 和 public IP in your java app
那么重要的一点是提到 native_transport_port: 9042 ,允许 access for port 9042 和 Firewall configurations . 我认为你做的这些事情是正确的 . 并确保您已在yaml文件中正确配置了 endpoints 小部件 endpoint_snitch: Ec2Snitch . 我希望你按照这些步骤行事......
我最近也偶然发现了这个问题 . 我的环境不同,原因也不同 . 我们使用 SpringBoot 1.5.3.RELEASE 作为父库和 Datastax cassandra driver 版本3.3.0:
从SpringBoot的父POM和Datastax继承的Netty库发生了冲突 . 排除Netty之后,错误就消失了 .
有同样的问题 . 后来发现驱动程序版本和CQL版本不兼容 . 根据兼容性图表获取最新的3.0 Driver
http://www.datastax.com/dev/blog/java-driver-2-1-2-native-protocol-v3
使用java驱动程序访问Cassandra在很大程度上取决于驱动程序版本和驱动程序的依赖性 . 对我有用的最后一件事是采用捆绑在服务器下载上的lib(jars) . 在我的情况下,这是窗户 . 但我确信linux tar ball也会有驱动程序和依赖项 . 拿下服务器下载中的jar并在java客户端的类路径中使用它们,而不是从Internet单独下载驱动程序