我有一个带有三个节点的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"用于复制。
或者我误解了错误信息?
感谢。
答案 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集群正确连接并在上述错误中显现。