NoNodeAvailableException:没有节点可用于执行查询

Posted

技术标签:

【中文标题】NoNodeAvailableException:没有节点可用于执行查询【英文标题】:NoNodeAvailableException: No node was available to execute the query 【发布时间】:2020-02-05 08:08:12 【问题描述】:

我没有使用 Elasticssearch。我正在尝试使用 CQL 在 cassandra 中执行一些数据库操作。我正在使用线程。在运行代码时,我总是在一段时间后在线程中遇到异常:com.datastax.oss.driver.api.core.。

我什至用一个线程进行了测试。错误仍然存​​在。这是我的代码:

InetAddress addrOne = InetAddress.getByName("52.15.195.41");
InetSocketAddress addrSocOne = new InetSocketAddress(addrOne,9042);
CqlSession sessionOne = CqlSession.builder().addContactPoint(addrSocOne).withLocalDatacenter("us-east-2").withKeyspace("test").build();

while(counter <= 100)

    String query = "select max(id) FROM samplequeue";
    ResultSet rs = session.execute(query);
    for (Row row : rs) 
    
        int exS = row.getInt("system.max(id)");
    
    counter++;
    Thread.sleep(50);

这是一个非常简单的修改示例,只是为了演示问题。我无法解决它。所有线程都退出并给出相同的异常。我在 AWS 上运行 cassandra 3.11.4。我的所有节点都已启动并运行,我可以在后端很好地执行操作。

【问题讨论】:

你是如何初始化会话对象的? @CarlosMonroyNieblas 我现在已经在我的问题的代码部分添加了它。 威廉在下面提出了一个很好的观点。当您运行nodetool status 时,您的数据中心的名称是什么? 【参考方案1】:

.withLocalDatacenter("us-east-2") 更改为.withLocalDatacenter("datacenter1") 并重试。

【讨论】:

您能解释一下为什么会这样吗?是硬编码的值吗? 我很惊讶这能奏效,但它确实奏效了,尽管我的数据中心的名称不同于“datacenter1”(由nodetool status 确认)。设置为“datacenter1”虽然有效。对我来说,在我这样做之前我会得到不一致的结果,有时工作有时不工作,但在我这样做之后,效果很好。 更新:似乎它可能与使用 Java 驱动程序的机器上是否运行 C* 实例有关。我正在连接到在外部 AWS 上运行的 C*,但 C*(特别是 DSE)在我的本地机器上运行,并且必须使用 .withLocalDatacenter("datacenter1")。但是当我停止本地 C* 实例(sudo service dse stop),然后再试一次,现在它无法连接,并抱怨给出错误,如下一条评论所示 You specified datacenter1 as the local DC, but some contact points ar e from a different DC: Node(endPoint=/&lt;my-ip&gt;:9042, hostId=&lt;my-id&gt;, hashCode=4a395efc)=SearchGraph; please provide the correct local DC, or check your contact points【参考方案2】:

您可以在cassandra中执行nodetool status,您将获得Datacenter的名称。那就是你必须在withLocalDatacenter 方法中输入的值:

/opt/apache-cassandra-3.11.2/bin$ ./nodetool status
Datacenter: **dc1**
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens       Owns (effective)  Host ID    Rack

【讨论】:

【参考方案3】:

在本地运行时,最好在连接到 Cassandra 实例时运行 nodetool status 命令获取 dc 名称并在应用程序中使用。

【讨论】:

以上是关于NoNodeAvailableException:没有节点可用于执行查询的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 2.0 整合 elasticsearch NoNodeAvailableException

解决ES报错NoNodeAvailableException[None of the configured nodes are available:问题

Exception in thread "main" NoNodeAvailableException[None of the configured nodes are avail

如何修改ESCrawlTopology以便它在本地而不是远程运行? 'NoNodeAvailableException'异常

Elasticsearch使用java读取数据报错NoNodeAvailableException: None of the configured nodes are available: [127.

Spring Boot整合Elasticsearch启动报错