无法连接到cassandra - NoHostAvailableException

时间:2013-09-10 16:30:29

标签: cassandra datastax-java-driver

我知道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();

我不知道该怎么办,因为我总是得到这个错误。有什么建议吗?

5 个答案:

答案 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上单独下载驱动程序