由于频繁删除和插入同一行中的同一列,导致cassandra中的数据丢失



我有一个列家族帖子,用于存储我的facebook帐户的帖子详细信息。我使用的是cassandra 2.0.9和datastax java驱动程序3.0。

CREATE TABLE posts (
  key blob,
  column1 text,
  value blob,
  PRIMARY KEY ((key), column1)
) WITH COMPACT STORAGE;

其中rowkey是我的userid,columnkey是postid,value是post-json。每当我在浏览器中刷新我的应用程序时,它都会从facebook中获取数据,并删除和添加现有帖子的数据。有时我会错过卡桑德拉的一些帖子。频繁地在同一行的同一列中删除和插入是否会导致数据丢失?我该怎么办?

这并不是真正的数据丢失,如果您以非常高的频率(如每秒数千次更新)更新同一列,则可能会产生不可预测的结果。

为什么?因为Cassandra使用insert时间戳,通过比较不同副本中同一列的时间戳,在读取时确定哪个值是正确的。

目前,时间戳的分辨率是毫秒级的,所以如果更新率非常高,例如在同一列上更新2次,持续同一毫秒,则较大的后JSON将获胜。

更大,我指的是使用postJson1.compareTo(postJson2)。排序由列的类型决定,在您的情况下,它是一个字符串,因此Cassandra通过字典式比较后JSON数据来打破平局。

为了避免这种情况,您可以在客户端通过为自己生成一个唯一的timmeuuid()来提供写时间戳。

有许多内部操作可以生成这样的TimeUUID,例如通过使用Java驱动程序类com.datastax.driver.core.utils.UUIDs.timeBased()

相关内容

最新更新