使用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();
}
答案 0 :(得分:13)
在我的情况下,我遇到了这个问题,因为我在连接期间使用了默认的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");
}
答案 1 :(得分:5)
我遇到了这个问题,并通过在SocketOptions中设置 ReadTimeout 进行排序:
Cluster cluster = Cluster.builder().addContactPoint("localhost").build();
cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(HIGHER_TIMEOUT);
答案 2 :(得分:4)
转到Apache Cassandra conf目录并启用二进制协议
Cassandra二进制协议 Java驱动程序使用Cassandra 1.2中引入的二进制协议。它仅适用于大于或等于1.2的Cassandra版本。此外,二进制协议服务器不是使用Cassandr a 1.2中的默认配置文件启动的。您必须编辑每个节点的cassandra.yaml文件:
start_native_transport: true
然后重启节点。
答案 3 :(得分:4)
我也有同样的问题。我已经在单独的Linux电脑上安装了Cassandra并试图通过Window pc连接。我不被允许创建连接。
但是当我们编辑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
答案 4 :(得分:3)
当我收到该错误消息时,只为那些可能遇到同样问题的人发布此信息。结果是我的复杂依赖树带来了旧版本的com.google.collections,这打破了CQL驱动程序。删除这种依赖并完全依赖番石榴解决了我的问题。
答案 5 :(得分:3)
我在使用一个节点测试新群集时遇到了同样的问题。
从“群集”构建器中删除后,我能够连接:
.withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("US_EAST"))
能够连接。
答案 6 :(得分:2)
在我的情况下,这是一个端口问题,我忘了更新
旧RPC端口为9160
新的二进制端口为9042
答案 7 :(得分:2)
我也遇到了这个问题,它是由正在提交的语句中的一个简单错误引起的。
session.prepare(null);
显然,错误信息具有误导性。
答案 8 :(得分:1)
编辑
/etc/cassandra/cassandra.yaml
并更改
rpc_address
到0.0.0.0
,broadcast_rpc_address和listen_address到群集的IP地址。
答案 9 :(得分:0)
检查以下几点:
i)检查服务器ip
ii)检查侦听端口
iii)数据堆栈客户端依赖项必须与服务器版本匹配。
关于yaml文件,最新版本启用了以下属性:
start_native_transport: true
native_transport_port: 9042
答案 10 :(得分:0)
假设您有默认配置,请检查驱动程序版本兼容性。并非所有驱动程序版本都与所有版本的Cassandra兼容,尽管它们声称具有向后兼容性。请参阅以下链接。
http://docs.datastax.com/en/developer/java-driver/3.1/manual/native_protocol/
我遇到了类似的问题&更改驱动程序版本解决了我的问题。
注意:希望您使用Maven(或类似的东西)来解决依赖关系。否则,您可能必须为更高版本的驱动程序下载大量依赖项。