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

时间:2015-01-15 23:29:30

标签: cassandra

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

引起:com.datastax.driver.core.exceptions.UnavailableException:没有足够的副本可用于一致性查询(需要1个但只有0个活着)     at com.datastax.driver.core.exceptions.UnavailableException.copy(UnavailableException.java:79)

没有意义的部分是" 1需要但只有0活着"声明。有两个节点,这意味着一个节点应该是" alive"用于复制。

或者我误解了错误信息?

感谢。

4 个答案:

答案 0 :(得分:27)

您可能会收到此错误,因为您要查询的表所属的键空间的复制因子的复制因子为1,是否正确?

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

如果您希望能够处理多个节点不可用,那么您可以做的是查看altering your keyspace以设置更高的复制因子,在这种情况下最好是三个,然后运行{{3在每个节点上获取所有节点上的所有数据。通过此更改,您将能够在丢失2个节点后继续读取,并以一致性级别读取。

nodetool repair是了解节点数,复制因子和一致性级别的一个很好的参考。

答案 1 :(得分:3)

我今天点击这个,因为数据中心字段区分大小写。如果你的dc是'somedc01',那就不行了:

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

无论如何,这不是那么直观,希望这会有所帮助。

答案 2 :(得分:0)

在我的情况下,我收到了一条消息0,但是cassandra已经启动并且cqlsh工作正常,问题是从java访问:查询是针对一个完整的表,而一些记录是不可访问的(所有节点都包含它们) 。从cqlsh中,select * from table works,仅显示可访问的记录。因此,解决方案是恢复节点,并可能通过以下方式更改复制因子:

 ALTER KEYSPACE ....
nodetool repair -all 

然后使用nodetool状态来查看更改和集群结构

答案 3 :(得分:0)

对我来说,我的endpoint_snitch仍然设置为SimpleSnitch而不是GossipingPropertyFileSnitch。这阻止了多DC集群正确连接并在上述错误中显现。