由于频繁删除和插入一行中的同一列,cassandra 中的数据丢失
Data loss in cassandra because of frequent delete and insert of same column in a row
我有一个列族 posts,用于存储我的 Facebook 帐户的 post 详细信息。我正在使用 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 的 post。在一行的同一列频繁删除和插入会导致数据丢失吗?我该如何管理?
这并不是真正的数据丢失,如果您以非常高的频率(例如数千 updates/sec)更新 相同的 列,您可能会得到不可预知的结果。
为什么?因为 Cassandra 使用插入 timestamp 在读取时通过比较来自不同副本的同一列的时间戳来确定哪个值是正确的。
目前,时间戳的分辨率是毫秒级的,所以如果你的更新率非常高,例如同一列上同一毫秒更新2次,越大post JSON 会赢的
更大,我的意思是使用postJson1.compareTo(postJson2)
。排序由您的列的 类型 决定,在您的情况下它是一个字符串,因此 Cassandra 通过按字典顺序比较 post JSON 数据来打破平局。
为避免这种情况,您可以通过为自己生成一个唯一的 timmeuuid() 来在客户端提供写入时间戳。
有很多方法可以生成这样的 TimeUUID,例如使用 Java 驱动程序 class com.datastax.driver.core.utils.UUIDs.timeBased()
我有一个列族 posts,用于存储我的 Facebook 帐户的 post 详细信息。我正在使用 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 的 post。在一行的同一列频繁删除和插入会导致数据丢失吗?我该如何管理?
这并不是真正的数据丢失,如果您以非常高的频率(例如数千 updates/sec)更新 相同的 列,您可能会得到不可预知的结果。
为什么?因为 Cassandra 使用插入 timestamp 在读取时通过比较来自不同副本的同一列的时间戳来确定哪个值是正确的。
目前,时间戳的分辨率是毫秒级的,所以如果你的更新率非常高,例如同一列上同一毫秒更新2次,越大post JSON 会赢的
更大,我的意思是使用postJson1.compareTo(postJson2)
。排序由您的列的 类型 决定,在您的情况下它是一个字符串,因此 Cassandra 通过按字典顺序比较 post JSON 数据来打破平局。
为避免这种情况,您可以通过为自己生成一个唯一的 timmeuuid() 来在客户端提供写入时间戳。
有很多方法可以生成这样的 TimeUUID,例如使用 Java 驱动程序 class com.datastax.driver.core.utils.UUIDs.timeBased()