Cassandra:单节点集群中没有足够的副本错误

Cassandra: Not enough replica error in single node cluster

周末,我们开始在 Cassandra 中看到错误。本质上,抱怨它无法将足够的节点聚集在一起以实现串行一致性。

这似乎是 AWS vpn 跨区域的问题。因此,为了简化,我删除了另一个节点(当时只有两个节点)。我通过从最后一个剩余节点的 cassandra.yaml:

中删除种子来做到这一点
seed_provider:
...
- seeds: "single node ip"

我还在旧节点上 运行 nodetool removenode(显示死机状态)。

所以拓扑非常简单。应用程序是一个 Java 应用程序,它通过 Java API.

连接到 Cassandra 节点

下面是我现在看到的错误:

Caused by: com.datastax.driver.core.exceptions.UnavailableException: Not enough replica available for query at consistency QUORUM (2 required but only 1 alive)
        at com.datastax.driver.core.Responses$Error.decode(Responses.java:45)
        at com.datastax.driver.core.Responses$Error.decode(Responses.java:34)
        at com.datastax.driver.core.Message$ProtocolDecoder.decode(Message.java:182)
        at org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:66)
        ... 21 more

这与之前的错误完全相同,除了我们有 QUORUM 之前我们有 SERIAL 的节点。


我刚刚尝试将复制因子设置为 1:

ALTER KEYSPACE my_keyspace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

并重新启动了 cassandra。没有变化。

也只是 运行 nodetool cleanup keyspace_name 基于下面的回答。也没有变化。


为了清楚起见,拓扑结构是这样的:

Java 应用 -> 单个 Cassandra 节点

仍然看到:Not enough replica available for query at consistency QUORUM (2 required but only 1 alive)

您提到您删除了一个节点。鉴于您正在使用 QUORUM 并且它需要 2 个副本,我们可以假设您的复制因子为 2 或 3。您现在有多少个节点,您的复制因子是多少?根据您的问题,我认为您是在表示您还剩 1 个,但我不确定。如果你只有 1 个节点,而你的 RF 是 2 或 3,你将永远无法满足仲裁一致性。

您可以 alter your replication factor 到 1 来解决这个问题,即:

ALTER KEYSPACE keyspace_name WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

如果这样做,您还应该在每个节点上 运行 nodetool cleanup keyspace_name 以获取以前的复制数据。

另一种选择是添加足够的节点来帮助您满足复制因子的 QUORUM 一致性级别。

使用单节点集群时将 QUORUM 更改为 ONE

除此之外,

检查 cassandra 日志。 "logs/debug..."

如果节点端的墓碑太多。你应该清理墓碑。例如 日志输出:

*"ReadCommand.java:569 - Read 1000 live rows and 1272327 tombstone cells for query SELECT * FROM "*

还要检查日志级别,