【问题标题】:Error while connecting to Cassandra using Java Driver for Apache Cassandra 1.0 from com.example.cassandra使用来自 com.example.cassandra 的 Java Driver for Apache Cassandra 1.0 连接到 Cassandra 时出错
【发布时间】:2013-05-22 22:23:25
【问题描述】:

在通过 DataStax 使用 Cannsandra 的 java 驱动程序连接到 Cassandra 客户端时,它会抛出以下错误..

线程“main”com.datastax.driver.core.exceptions.NoHostAvailableException 中的异常:所有主机都尝试查询失败(尝试:[/127.0.0.1])

请建议...

谢谢!

我的java代码是这样的:

package com.example.cassandra;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;

public class SimpleClient {

private Cluster cluster;

public void connect(String node){

    cluster = Cluster.builder().addContactPoint(node).build();
    Metadata metadata = cluster.getMetadata();
    System.out.println(metadata.getClusterName());
}   


public void close()
{
cluster.shutdown();
}

public static void main(String args[]) {

SimpleClient client = new SimpleClient();
client.connect("127.0.0.1");
client.close();
}

【问题讨论】:

  • 只是为了增加清晰度:我确定我已连接到 cassandra。它仍然显示此错误

标签: cassandra datastax-java-driver


【解决方案1】:

在我的例子中,我遇到了这个问题,因为我在连接期间使用了默认的 RPC 端口 9160。可以在 cassandra.yaml 中为 CQL 找到不同的端口 -

start_native_transport: true
# port for the CQL native transport to listen for clients on
native_transport_port: 9042

一旦我将代码更改为使用端口 9042,连接尝试就成功了 -

public BinaryDriverTest(String cassandraHost, int cassandraPort, String keyspaceName) {
    m_cassandraHost = cassandraHost;
    m_cassandraPort = cassandraPort;
    m_keyspaceName = keyspaceName;

    LOG.info("Connecting to {}:{}...", cassandraHost, cassandraPort);
    cluster = Cluster.builder().withPort(m_cassandraPort).addContactPoint(cassandraHost).build();
    session = cluster.connect(m_keyspaceName);
    LOG.info("Connected.");
}

public static void main(String[] args) {
    BinaryDriverTest bdt = new BinaryDriverTest("127.0.0.1", 9042, "Tutorial");
}

【讨论】:

    【解决方案2】:

    我遇到了这个问题,它是通过在 SocketOptions 中设置 ReadTimeout 进行排序的:

    Cluster cluster = Cluster.builder().addContactPoint("localhost").build();
    cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(HIGHER_TIMEOUT);
    

    【讨论】:

      【解决方案3】:

      转到您的 Apache Cassandra conf 目录并启用二进制协议

      Cassandra 二进制协议 Java 驱动程序使用 Cassandra 1.2 中引入的二进制协议。它仅适用于大于或等于 1.2 的 Cassandra 版本。此外,在 Cassandr a 1.2 中,二进制协议服务器不是使用默认配置文件启动的。您必须为每个节点编辑 cassandra.yaml 文件:

      start_native_transport: true
      

      然后重启节点。

      【讨论】:

        【解决方案4】:

        我也遇到了同样的问题。我已经在单独的 Linux 电脑中安装了 Cassandra,并尝试通过 Window 电脑进行连接。不允许我创建连接。

        但是当我们编辑 cassandra.yaml 时,将我的 linux pc ip 地址设置为 rpc_address 并重新启动,它可以让我成功连接,

        # The address or interface to bind the Thrift RPC service and native transport
        # server to.
        #
        # Set rpc_address OR rpc_interface, not both. Interfaces must correspond
        # to a single address, IP aliasing is not supported.
        #
        # Leaving rpc_address blank has the same effect as on listen_address
        # (i.e. it will be based on the configured hostname of the node).
        #
        # Note that unlike listen_address, you can specify 0.0.0.0, but you must also
        # set broadcast_rpc_address to a value other than 0.0.0.0.
        #rpc_address: localhost
        rpc_address: 192.168.0.10
        

        【讨论】:

          【解决方案5】:

          当我收到错误消息时,仅为可能遇到与我相同问题的人发布此消息。原来我的复杂依赖树带来了旧版本的 com.google.collections,它破坏了 CQL 驱动程序。移除这种依赖并完全依赖 guava 解决了我的问题。

          【讨论】:

            【解决方案6】:

            我在使用一个节点测试新集群时遇到了同样的问题。

            从集群构建器中删除它后,我能够连接:

            .withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("US_EAST"))
            

            它能够连接。

            【讨论】:

              【解决方案7】:

              在我的情况下,这是一个端口问题,我忘记更新了

              旧的 RPC 端口是 9160
              新的二进制端口是9042

              【讨论】:

                【解决方案8】:

                我也遇到过这个问题,是因为提交的语句有一个简单的错误造成的。

                session.prepare(null);
                

                显然,错误信息具有误导性。

                【讨论】:

                  【解决方案9】:

                  编辑

                  /etc/cassandra/cassandra.yaml 
                  

                  改变

                  rpc_address0.0.0.0,broadcast_rpc_address 和listen_address 到集群的ip 地址。

                  【讨论】:

                    【解决方案10】:

                    假设您有默认配置,请检查驱动程序版本兼容性。并非所有驱动程序版本都与 Cassandra 的所有版本兼容,尽管它们声称向后兼容。请看下面的链接。

                    http://docs.datastax.com/en/developer/java-driver/3.1/manual/native_protocol/

                    我遇到了类似的问题,更改驱动程序版本解决了我的问题。

                    注意:希望您使用 Maven(或类似的东西)来解决依赖关系。否则,您可能需要为更高版本的驱动程序下载大量依赖项。

                    【讨论】:

                      【解决方案11】:

                      检查以下几点:

                      i) 检查服务器 ip

                      ii) 检查监听端口

                      iii) 数据堆栈客户端依赖项必须与服务器版本匹配。

                      关于 yaml 文件,最新版本启用了以下属性:

                          start_native_transport: true
                          native_transport_port: 9042
                      

                      【讨论】:

                        猜你喜欢
                        • 2015-06-15
                        • 2022-01-06
                        • 2018-12-16
                        • 2016-12-11
                        • 2015-08-16
                        • 2015-02-28
                        • 1970-01-01
                        • 2020-10-04
                        • 2016-09-06
                        相关资源
                        最近更新 更多