没有足够的副本可用于一致性 ONE 的查询(需要 1 个,但只有 0 个存活)

Not enough replica available for query at consistency ONE (1 required but only 0 alive)

我有一个包含三个节点的 Cassandra 集群,其中两个已启动。他们都在同一个DC中。当我的 Java 应用程序开始写入集群时,我的应用程序出现错误,这似乎是由 Cassandra 的某些问题引起的:

原因:com.datastax.driver.core.exceptions.UnavailableException:没有足够的副本可用于一致性 ONE 的查询(需要 1 个,但只有 0 个存活) 在 com.datastax.driver.core.exceptions.UnavailableException.copy(UnavailableException.java:79)

没有意义的部分是“需要 1 个但只有 0 个存活”的语句。有两个节点up,也就是说其中一个应该是"alive"用于replication.

还是我误解了错误信息?

谢谢。

您可能会收到此错误,因为您正在查询的 table 所属键空间的复制因子的复制因子为 1,对吗?

如果您正在读取/更新的分区没有足够的可用副本(具有该数据的节点)来满足一致性级别,您将收到此错误。

如果您希望能够处理 1 个以上的节点不可用,您可以在每个节点上查看 altering your keyspace to set a higher replication factor, preferably three in this case, and then running a nodetool repair 以获取所有节点上的所有数据。通过此更改,您将能够在丢失 2 个节点的情况下以 1 的一致性级别进行读取。

This cassandra parameters calculator 是了解节点数、复制因子和一致性级别注意事项的良好参考。

我今天点击这个是因为数据中心字段区分大小写。如果您的 dc 是 'somedc01',这将不起作用:

replication = 
    {
        'class': 'NetworkTopologyStrategy',
        'SOMEDC01': '3'  #  <-- BOOM!
    }
    AND durable_writes = true;

总之,不是很直观,希望对您有所帮助。

在我的例子中,我收到一条消息 0,但 cassandra 已启动并且 cqlsh 工作正常,问题是从 java 访问:查询是针对完整的 table 和一些记录不可访问(包含它们的所有节点都关闭)。来自 cqlsh,select * from table 有效,只显示可访问的记录。因此,解决方案是恢复节点,并可能更改复制因子:

 ALTER KEYSPACE ....
nodetool repair -all 

然后 nodetool status 查看变化和集群结构

对我来说,我的 endpoint_snitch 仍然设置为 SimpleSnitch,而不是像 GossipingPropertyFileSnitch 这样的东西。这会阻止 multi-DC 集群正确连接并出现上述错误。