首页 文章

无法连接到cassandra - NoHostAvailableException

提问于
浏览
17

我知道有几个关于_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 回答

  • 7

    检查你的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 . 如果以这种方式向公众开放数据库,请记住添加一些安全性:-)

  • 28

    改变 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 configurationspublic IP in your java app

    那么重要的一点是提到 native_transport_port: 9042 ,允许 access for port 9042Firewall configurations . 我认为你做的这些事情是正确的 . 并确保您已在yaml文件中正确配置了 endpoints 小部件 endpoint_snitch: Ec2Snitch . 我希望你按照这些步骤行事......

  • 0

    我最近也偶然发现了这个问题 . 我的环境不同,原因也不同 . 我们使用 SpringBoot 1.5.3.RELEASE 作为父库和 Datastax cassandra driver 版本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之后,错误就消失了 .

  • 1

    有同样的问题 . 后来发现驱动程序版本和CQL版本不兼容 . 根据兼容性图表获取最新的3.0 Driver

    http://www.datastax.com/dev/blog/java-driver-2-1-2-native-protocol-v3

  • 0

    使用java驱动程序访问Cassandra在很大程度上取决于驱动程序版本和驱动程序的依赖性 . 对我有用的最后一件事是采用捆绑在服务器下载上的lib(jars) . 在我的情况下,这是窗户 . 但我确信linux tar ball也会有驱动程序和依赖项 . 拿下服务器下载中的jar并在java客户端的类路径中使用它们,而不是从Internet单独下载驱动程序

相关问题