无法连接到Cassandra - NoHostAvailableException

19

我知道有几个关于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();

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


2
你确定这是端口问题吗?也有可能是IP解析问题。你能ping或以某种方式访问这个IP地址吗? - Alex
3
您能使用 cqlsh 进行连接吗?每次我看到这个问题时,都与客户端机器无法访问 IP 或端口未开放有关。 - Alex Popescu
它在本地主机上工作吗? - abhi
您所接受的答案并不是完美的解决方案。请参考我下面的回答。 - Jaya Ananthram
我也遇到了同样的问题。我知道这不是Cassandra实例的问题。我可以从Datagrip连接并且可以从Python代码连接。但是使用Java驱动程序时,我遇到了这个问题。我找不到解决方案。你找到解决方案了吗? - alltej
5个回答

31

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


2
我在EC2上也遇到了同样的问题,将RPC地址设置为0.0.0.0解决了该问题。 - Ali
根据您的解决方案,如果我尝试停止和启动ec2实例,我需要修改rpc_address,是这样吗?这样做是否正确?指向私有IP是最佳解决方案。如果您停止实例,它不会更改。请参阅下面的答案。 - Jaya Ananthram
1
"0.0.0.0作为RPC地址也可以,"这是错误的。如果您要移动到集群,则使用0.0.0.0作为RPC地址将不允许任何节点加入集群。因此,指定PrivateIP是最佳解决方案。" - Jaya Ananthram
我们在ec2实例中使用Cassandra集群,并将rpc_address设置为0.0.0.0。并且已经集群化。 - polve
谢谢你!谢谢你!谢谢你! :-) - eladyanai
显示剩余6条评论

8

公共IP更改为私有IP

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

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

  • 如果您的Cassandra在EC2中,而您的客户端应用程序在EC2之外(即您的本地网络中的客户端Java应用程序),则需要在yaml配置中配置私有IPJava应用程序中的公共IP

重要的是提及native_transport_port: 9042,允许访问端口9042防火墙配置。我认为您已经正确完成了这些事情。还要确保您已在yaml文件中正确配置了您的终端节点嗅探器endpoint_snitch: Ec2Snitch。如果您按照这些步骤操作,希望它能起作用....


1
我最近也遇到了这个问题。我的环境和原因都不同。 我们使用的是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>
.......

Netty库继承了SpringBoot的父POM和Datastax,导致冲突。排除Netty后错误消失。


0

使用Java驱动程序访问Cassandra非常依赖于驱动程序版本和驱动程序的依赖项。最终对我有用的是获取服务器下载捆绑的lib(jars)。在我的情况下,它是Windows。但我相信Linux tar球也会包含驱动程序和依赖项。获取服务器下载中提供的JAR文件,并将其用于您的Java客户端类路径,而不是从互联网单独下载驱动程序。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接