2

在并发写入的情况下,Cassandra 是否保证副本的一致性?例如,如果 N=3,W=3 并且有 3 个并发写入者,是否有可能在每个副本上得到 3 个不同的值?

这是 Cassandra 特有的问题,还是规范的 Dynamo 设计也有这个问题,尽管它使用了矢量时钟?

4

2 回答 2

3

在这种情况下,Cassandra 使用客户端提供的时间戳,以确保每个副本都保持“最新”值。在您的示例中,您写入每个副本,即使副本以不同的顺序接收写入,它们也会使用写入提供的时间戳来决定保留哪个。将具有较旧时间戳的相同密钥写入副本将被忽略。

这种机制不仅需要处理并发写入 - Cassandra 可以在很长一段时间内接收乱序写入(即回复提示到最近关闭的节点)。为了解决这个问题,当 Cassandra 压缩 SSTables 并遇到两个相同的键时,它将使用时间戳来决定保留哪一个。

同样,Cassandra 有一个称为读取修复的功能。在读取时,Cassandra 将比较每个副本给出的时间戳,并将与最新时间戳关联的值返回给客户端。然后它将这个值写回任何过期的副本(这可能会对性能产生影响,因此它进行后续写入的机会是可调整的)。

于 2012-08-30T13:26:02.917 回答
0

只是添加 tom.wilkie 的答案如果您想保证数据的良好一致性并保持最新值,请尝试始终以 LOCAL_QUORUM 或 QUORUM 一致性进行读写。

于 2012-08-31T16:52:11.607 回答