首页 文章

Cassandra NoHostAvailableException,但仍有活动节点

提问于
浏览
6

我在一个DC中有两个C * 2.0.2节点(在cassandra.yaml中有默认配置)和一个RF = 2的密钥空间 . 两个客户端使用Datastax Java Driver 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,因为一次至少有一个活动节点并且使用了CL = ONE?

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

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

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

1 回答

  • 0

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

    我会说 RetryPolicy 可以根据您的需要进行固定的重试次数 . 不幸的是,Cassandra Driver 1.0.3不确定't have it bundled (I'我不确定以后的版本是否会这样做 . 不过,它可能会像这样实现:

    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) ,它至少应该显着减少失败次数 .

    如果仍然存在一些失败(如1000中的1),则可能需要查看 com.datastax.driver.core.ConvictionPolicy ,查找其用法并进一步调查 .

相关问题