我知道NoHostAvailableException
有几个主题,但它们根本无法解决我的问题。
我无法使用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();
我不知道该怎么办,因为我总是得到这个错误。有什么建议吗?
答案 0 :(得分:29)
检查你的casssandra.yaml文件。 native_transport使用与rpc_address相同的地址绑定。如果它绑定到“54.221.241.107”之外的另一个地址,您将遇到此问题。 尝试将其设置为
rpc_address: 0.0.0.0
或
rpc_address: 54.221.241.107
看看它是否有帮助。请记住,ec2-ips可能会在重新启动时发生变化。
我的猜测是绑定到ec-2的内部ip。如果以这种方式向公众开放数据库,请记住添加一些安全性: - )
答案 1 :(得分:7)
更改 public IP to private IP
。
如果你的cassandra在EC2中,你需要在yaml中配置私有IP
配置 rpc_address: PRIVATE_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文件中正确配置了端点小故障 endpoint_snitch: Ec2Snitch
。我希望你按照这些步骤行事......
答案 2 :(得分:1)
我最近也偶然发现了这个问题。我的环境不同,原因也不同。 我们使用 SpringBoot 1.5.3.RELEASE 作为父库和 Datastax cassandra驱动程序版本3.3.0:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
............
<dependencies>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.3.0</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
</exclusion>
</exclusions>
</dependency>
.......
继承自SpringBoot的父POM和Datastax的Netty库发生了冲突。排除Netty之后,错误就消失了。
答案 3 :(得分:0)
有同样的问题。后来发现驱动程序版本和CQL版本不兼容。根据兼容性图表获取最新的3.0 Driver
http://www.datastax.com/dev/blog/java-driver-2-1-2-native-protocol-v3
答案 4 :(得分:0)
使用java驱动程序访问Cassandra在很大程度上取决于驱动程序版本和驱动程序的依赖性。对我有用的最后一件事是采用捆绑在服务器下载上的lib(jars)。在我的情况下,这是窗户。但我确信linux tar ball也会有驱动程序和依赖项。拿下服务器下载中提供的jar并在java客户端的类路径中使用它们,而不是从Internet上单独下载驱动程序