我需要使用 cassandra 进行版本控制。
以下是我的列族定义
create table file_details(id text primary key, fname text, version int, mimetype text);
我在 fname 列上创建了一个二级索引。
每当我为相同的“fname”插入时,版本应该增加。当我用 fname 检索一行时,它应该返回最新版本的行。
请建议需要采取什么方法。
如果不能放宽版本增加 1 的要求,一种选择是使用计数器。
为数据创建一个表:
create table file_details(id text primary key, fname text, mimetype text);
以及版本的单独表格:
create table file_details_version(id text primary key, version counter);
这需要是一个单独的表,因为表可以包含所有计数器或不包含计数器。
然后对于更新,您可以执行以下操作:
insert into file_details(id, fname, mimetype) values ('id1', 'fname', 'mime');
update file_details_version set version = version + 1 where id = 'id1';
然后从file_details读取总是会返回最新的,你可以从file_details_version中找到最新的版本号。
但是,这有很多问题。您不能使用计数器进行原子批处理,因此这两个更新不是原子的 - 一些失败场景可能导致仅插入到 file_details 被持久化。此外,没有读取隔离,因此如果您在更新期间读取,则可能会在两个表之间获得不一致的数据,最后,Cassandra 中的计数器更新不能容忍故障,因此如果在计数器更新期间发生故障,您可能会加倍计数即增加版本太多。
我认为所有涉及计数器的解决方案都会遇到这些问题。您可以通过为每次更新生成一个唯一 ID(例如,一个大的随机数)并将其插入单独表中的一行来避免计数器。版本将是该行中的 ID 数。现在您可以进行原子更新,并且计数可以容忍失败。但是,读取时间将是 O(更新次数)并且读取仍然不会被隔离。