我的开发人员环境中有一个包含3个节点的集群,其密钥空间和复制因子= 2,最初我在这个集群中只有一个节点,但后来又逐个添加了2个节点。 Cassandra版本是3.7。
所有这些节点都是“克隆”,所以我只是为每个节点修改了cassandra.yaml和相应的IP。
我已经在每个节点上进行了修复和清理,在我的应用程序中,我有一个一致性级别。
这是nodetool状态输出:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.132.0.4 50.54 GiB 256 70.2% 50dc5baf-b8b3-4e19-8173-cf828afd36af rack1
UN 10.132.0.3 50.31 GiB 256 65.3% 2a45b7a5-41ce-4533-ba63-60fd3c5cc530 rack1
UN 10.132.0.9 33.88 GiB 256 64.5% e601fb16-6608-4e72-a820-dd4661977946 rack1
在Cassandra.yaml中,我只有10.132.0.3作为种子节点。
所以在这一点上,一切正常并且如预期的那样,如果我拒绝一个节点,一切都保持“正常”,除非这个节点是10.132.0.9,如果我拒绝这个“坏”节点,一切都会崩溃,以下错误:
org.apache.cassandra.exceptions.UnavailableException:无法达到一致性级别QUORUM
当我停止坏节点时,好的节点在他的system.log文件中显示此错误(我只复制错误而不是整个StackTrace):
错误[SharedPool-Worker-1] 2018-02-27 10:59:16,449 QueryMessage.java:128 - 查询期间出现意外错误 com.google.common.util.concurrent.UncheckedExecutionException:com.google.common.util.concurrent.UncheckedExecutionException:java.lang.RuntimeException:org.apache.cassandra.exceptions.UnavailableException:无法达到一致性级别QUORUM
我不明白这个节点有什么问题,我找不到解决方案......
修改
我的连接代码:
cluster_builder = Cluster.builder()
.addContactPoints(serverIP.getCassandraList(sysvar))
.withAuthProvider(new PlainTextAuthProvider(serverIP.getCassandraUser(sysvar), serverIP.getCassandraPwd(sysvar))).withPoolingOptions(poolingOptions)
.withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.ONE));
cluster = cluster_builder.build();
session = cluster.connect(keyspace);
我的查询:
statement = QueryBuilder.insertInto(keyspace, "measurement_minute").values(this.normal_names, (List<Object>) values);
执行:
ResultSetFuture future = session.executeAsync(statement.setConsistencyLevel(ConsistencyLevel.ONE));
我想提一下,我重新启动,修复并清理了所有节点。
答案 0 :(得分:0)
您要求QUORUM
复制因子为2.由于您实际上是在请求ALL
,因此效果不佳。对于法定人数,大多数节点需要响应您的查询。
您可以使用(RF / 2)+1(使用整数运算)计算法定人数的节点数,因此RF = 2给出(2/2)+ 1 = 2 - 您需要两个副本并且可以'有一个下来。某些查询起作用的原因是那些不使用10.132.0.9。
您可以使用RF = 3的复制因子或使用CL.ONE。