java - Cassandra NoHostAvailableException 仍然存在节点

标签 java cassandra datastax-java-driver

我在一个 DC 中有两个 C* 2.0.2 节点(在 cassandra.yaml 中有一个默认配置)和一个 RF=2 的键空间。两个客户端使用 Datastax Java 驱动程序 1.0.3 连接到此 DC。客户端使用 CL=ONE 从 C* 读写数据,没有任何错误。 但是当我关闭一个节点时,两个客户端都会收到大量异常:

com.datastax.driver.core.exceptions.NoHostAvailableException:
All host(s) tried for query failed (no host was tried)

在那一堆异常之后,客户端继续成功地与另一个仍然存在的节点一起工作。我应该怎么做才能收到任何 NoHostAvailableException,因为一次至少有一个 Activity 节点并且使用了 CL=ONE?

更新: 当我关闭两个节点之一时,我有时会在我的应用程序日志中看到以下异常:

[Reconnection-1] [ERROR] [Control connection] Cannot connect to
any host, scheduling retry

如果我只关闭一个节点,为什么两个节点都不可用?第二个现在还活着,我可以用 cqlsh 连接到它。

最佳答案

如果您使用 CL=ONE 执行请求,驱动程序将尝试仅查询单个节点。因此,如果对该节点的请求失败(或该节点不可用),则会立即抛出异常。此行为由创建 Cluster 时指定的 com.datastax.driver.core.policies.RetryPolicy 控制。

我会说一个固定重试次数的 RetryPolicy 会满足您的需要。不幸的是,Cassandra Driver 1.0.3 没有捆绑它(我不确定以后的版本是否有)。不过,它可能会像这样实现:

public class MyRetryPolicy implements RetryPolicy {

    final int attempts;

    public MyRetryPolicy(int attempts) {
        this.attempts = attempts;
    }

    @Override
    public RetryDecision onReadTimeout(Query query, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) {
        return (nbRetry >= attempts) ? RetryDecision.rethrow() : RetryDecision.retry(cl)
    }        

    ... <onWriteTimeout & onUnavailable methods with similar implementation>
}

我不确定 MyRetryPolicy(2) 是否足够,因为我没有深入研究驱动程序的内部结构。可能会再次尝试向同一主机发送相同的请求。您可以尝试 MyRetryPolicy(10),它至少应该显着减少失败次数。

如果仍然存在一些失败(例如 1 of 1000),可能值得查看 com.datastax.driver.core.ConvictionPolicy,找到它的用法并进一步调查。

关于java - Cassandra NoHostAvailableException 仍然存在节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20507904/

相关文章:

database - Cassandra:如何在没有EQ或IN限制的PRIMARY KEY的情况下使用 'ORDER BY'?

cassandra - Datastax Java 驱动程序 4.x : How to get cluster name?

java - 将 2 响应主体改造为自定义类

cassandra - scylla sstableloader 在将 sstables 从 cassandra 复制到 scylla 时出错?

Java Unicode 变量名称梵文

c++ - 点燃缓存加载时间的选择查询

cassandra - 为 Cassandra 设置一致性级别和复制因子的最佳实践

authentication - 无法在启用密码身份验证的情况下将 java 客户端连接到 cassandra

java - 捕获 C++ lambda 表达式错误中的 JNIENV*

java - 使用Spring编写DB单元测试: java. lang.IllegalStateException:无法加载ApplicationContext