18

我知道有几个线程,NoHostAvailableException但它们根本没有为我的问题提供解决方案。

我无法使用 Datastax Java Cassandra 驱动程序连接到 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();

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

4

5 回答 5

30

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

于 2013-09-10T21:52:09.023 回答
7

改变public IP to private IP

  • 如果您的 cassandra 在 EC2 中,则需要在 yaml 配置中配置私有 IP rpc_address: PRIVATE_IP

  • 如果您的客户端程序(用于连接 cassandra 的 java 应用程序)也在 EC2 中,那么您应该在代码中添加私有 IP .addContactPoint("PRIVATE_IP").build();

  • 如果您的 cassandra 在 EC2 中,而您的客户端应用程序不在 EC2 中(表示本地网络中的客户端 Java 应用程序),您需要配置private IP in yaml configurationspublic IP in your java app

然后重点是提及native_transport_port: 9042,允许access for port 9042Firewall configurations。我认为你做的这些事情是正确的。并确保您已endpoint_snitch: Ec2Snitch在 yaml 文件中正确配置了端点告密者。如果您按照以下步骤操作,我希望它会起作用....

于 2015-01-02T06:17:33.660 回答
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 后,错误消失了。

于 2017-08-25T13:25:17.693 回答
0

使用 java 驱动程序访问 Cassandra 很大程度上取决于驱动程序版本和驱动程序的依赖关系。对我有用的最后一件事是获取捆绑在服务器下载上的 lib(jars)。就我而言,它是窗户。但我确信 linux tar 包中也会包含驱动程序和依赖项。获取服务器下载中附带的 jar,并在您的 java 客户端的类路径中使用它们,而不是从 Internet 单独下载驱动程序

于 2016-07-05T17:27:21.437 回答
0

遇到同样的问题,后来发现是Driver版本和CQL版本不兼容,根据兼容性图获取最新的3.0 Driver

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

于 2016-04-14T16:51:30.693 回答