Cassandra数据建模避免墓碑

Cassandra Data modeling avoiding tombstone

我最初的想法是用 spark-kafka-cassandra(在 kubernetes 上)重写庞大的 spark-kafka-hbase 应用程序。

我有以下数据模型,一种支持全时插入,另一种支持更新插入

方法一:

create table test.inv_positions(
location_id int,
item bigint,
time_id timestamp,
sales_floor_qty int,
backroom_qty int,
in_backroom boolean,
transit_qty int,
primary key ((location_id), item,time_id) ) with clustering order by (item asc,time_id DESC);

这个 table 不断插入,因为 timeid 是聚类列的一部分。我正在考虑通过 fetch 1 读取最新的(timeid 是 desc)并通过在键列上设置 TTL 或在一夜之间删除它们以某种方式删除旧记录。

疑虑:TTL 或删除旧记录会创建墓碑。

方法二:

create table test.inv_positions(
location_id int,
item bigint, time_id timestamp,
sales_floor_qty int,
backroom_qty int,
in_backroom boolean,
transit_qty int,
primary key ((location_id), item) ) with clustering order by (item asc);

这 table 如果同一位置和项目出现新记录,它会更新它。它易于阅读,无需担心清除旧记录

问题:我在 Cassandra 上有另一个应用程序在不同的时间更新不同的列,我们仍然有读取问题。也就是说,upsert 也会创建墓碑,但与方法 1 相比有多糟糕?或者任何其他更好的建模方法?

第一种方法似乎不错。 TTL 和删除,都创建墓碑。您可以参考基于 TTL 的删除的压缩策略。 TWCS 更适合基于 TTL 的删除,否则您可以使用 STCS 进行简单删除。此外,相应地配置 gc_grace_seconds 以顺利清除墓碑,因为沉重的墓碑会导致读取延迟。