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 "*
还要检查日志级别,
周末,我们开始在 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 "*
还要检查日志级别,