til*_*lex 6 java cassandra datastax-java-driver
我在一个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)
Run Code Online (Sandbox Code Playgroud)
在那一堆例外之后,客户端继续成功地与另一个仍然存活的节点一起工作.我应该怎么做才能收到任何NoHostAvailableException,因为一次至少有一个活动节点并且使用了CL = ONE?
更新: 当我关闭两个节点中的一个时,我有时会在我的应用程序日志中看到以下异常:
[Reconnection-1] [ERROR] [Control connection] Cannot connect to
any host, scheduling retry
Run Code Online (Sandbox Code Playgroud)
如果我只关闭一个节点,为什么两个节点都不可用?第二个还活着,我可以用cqlsh连接到它.
Wil*_*ire -1
如果您使用 CL=ONE 执行请求,驱动程序将尝试仅查询单个节点。因此,如果对该节点的请求失败(或该节点不可用),则会立即抛出异常。此行为由com.datastax.driver.core.policies.RetryPolicy创建Cluster.
我想说,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>
}
Run Code Online (Sandbox Code Playgroud)
我不确定是否MyRetryPolicy(2)足够,因为我没有深入研究驱动程序的内部结构。可能会再次尝试向同一主机发送相同的请求。你可以尝试一下MyRetryPolicy(10),至少应该能显着减少失败的次数。
如果仍然存在一些失败(例如 1000 个中的 1 个),则可能值得查看com.datastax.driver.core.ConvictionPolicy、找到其用法并进一步调查。
| 归档时间: |
|
| 查看次数: |
3652 次 |
| 最近记录: |