我不确定我是否遗漏了某些东西,但是当由于OutOfMemoryError导致cassandra节点出现故障时,我的DataStax Java驱动程序没有检测到它并仍然向它发送读取请求。如果我手动将节点关闭,那么它的工作正常。我使用默认值进行重新连接和重试策略:
LoadBalancingPolicy loadBalancingPolicy;
if (datacenter != null) {
loadBalancingPolicy = new DCAwareRoundRobinPolicy(datacenter);
} else {
loadBalancingPolicy = new RoundRobinPolicy();
}
loadBalancingPolicy = new TokenAwarePolicy(loadBalancingPolicy);
loadBalancingPolicy = LatencyAwarePolicy.builder(loadBalancingPolicy).build();
Builder builder = Cluster.builder().addContactPoints(endpoints).withLoadBalancingPolicy(loadBalancingPolicy);
任何建议?
答案 0 :(得分:1)
每当cassandra节点由于OutOfMemoryError而关闭时,我的DataStax Java驱动程序都没有检测到它并仍然向它发送读取请求。
从你的描述中,我收集了Cassandra节点OOM,但并没有真正关闭(进程没有退出),我怀疑如果真的发生故障,驱动程序会检测到它。如果是这种情况,我会认为这是来自服务器的错误行为,而且Cassandra确实不会在OOM上尽快(或者根本)死亡,请参阅CASSANDRA-7507。
也就是说,当Cassandra行为不端时,司机应该更好地保护你,JAVA-426会改善。