【问题标题】:Data loss in cassandra because of frequent delete and insert of same column in a row由于在一行中频繁删除和插入同一列,cassandra 中的数据丢失
【发布时间】:2016-07-29 15:08:57
【问题描述】:

我有一列家庭帖子,用于存储我的 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 是我的用户 ID,columnkey 是 postid,value 是 post json。每当我在浏览器中刷新我的应用程序时,它都会从 facebook 获取数据并删除和添加现有 postid 的数据。有时我会错过一些来自 cassandra 的帖子。可能在同一行的同一列中频繁删除和插入会导致数据丢失?我该如何管理?

【问题讨论】:

    标签: cassandra cassandra-2.0 datastax-java-driver


    【解决方案1】:

    这并不是真正的数据丢失,如果您以非常高的频率(如数千次更新/秒)更新 same 列,则可能会出现不可预知的结果。

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

    目前,时间戳的分辨率是毫秒级的,所以如果你的更新率非常高,例如在同一毫秒内对同一列进行两次更新,则较大的 JSON 将胜出。

    更大,我的意思是使用postJson1.compareTo(postJson2)。排序由您的列的 type 确定,在您的情况下它是一个字符串,因此 Cassandra 通过按字典顺序比较 post JSON 数据来打破平局。

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

    有很多方法可以生成这样的 TimeUUID,例如使用 Java 驱动程序类com.datastax.driver.core.utils.UUIDs.timeBased()

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多