Cassandra - 一个节点

时间:2018-02-27 11:39:19

标签: java cassandra cassandra-3.0

我的开发人员环境中有一个包含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));

我想提一下,我重新启动,修复并清理了所有节点。

1 个答案:

答案 0 :(得分:0)

您要求QUORUM复制因子为2.由于您实际上是在请求ALL,因此效果不佳。对于法定人数,大多数节点需要响应您的查询。

您可以使用(RF / 2)+1(使用整数运算)计算法定人数的节点数,因此RF = 2给出(2/2)+ 1 = 2 - 您需要两个副本并且可以'有一个下来。某些查询起作用的原因是那些不使用10.132.0.9。

您可以使用RF = 3的复制因子或使用CL.ONE。