在并发写入的情况下,Cassandra是否保证副本的一致性?例如,如果N = 3,W = 3并且有3个并发写入器,是否可能在每个副本上最终得到3个不同的值?
它是否是Cassandra特有的问题,或者规范的Dynamo设计是否也有这个问题,尽管它使用了矢量时钟?
答案 0 :(得分:3)
在这种情况下,Cassandra使用客户端提供的时间戳,以确保每个副本保留“最新”值。在您的示例中,您写入每个副本的位置,即使副本以不同的顺序接收写入,它们也将使用写入提供的时间戳来决定保留哪个。将具有较旧时间戳的相同密钥写入副本将被忽略。
这种机制不仅仅需要处理并发写入 - Cassandra可以在很长一段时间内无序地接收写入(即向最近关闭的节点回复提示)。为了解决这个问题,当Cassandra压缩SSTable并遇到两个相同的键时,它将使用时间戳来决定保留哪一个。
同样,Cassandra有一个名为read repair的功能。在读取时,Cassandra将比较每个副本给出的时间戳,并将与最新时间戳关联的值返回给客户端。然后它会将此值写回任何过时的副本(这可能会对性能产生影响,因此进行后续写入的可能性是可调整的。)
答案 1 :(得分:0)
只是添加tom.wilkie的答案 如果您希望保证与数据保持良好的一致性,并保持最新值,请尝试始终以LOCAL_QUORUM或QUORUM一致性读取和写入。