Cassandra数据建模避免墓碑

时间:2018-11-30 16:00:21

标签: cassandra cassandra-3.0

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

我有以下数据模型,一个支持全时插入,另一个支持upserts

方法1:

  

创建表test.inv_positions(
  location_id int,
  项bigint,
   time_id时间戳,
  sales_floor_qty int,
  backroom_qty int,
  in_backroom布尔值,
  Transit_qty int,
  主   键((location_id),item,time_id))   按(项目   asc,time_id DESC);

该表不断插入,因为timeid是群集col的一部分。我正在考虑通过获取1来读取最新记录(timeid为desc),并通过在关键列上设置TTL或在一夜之间删除它们以某种方式删除旧记录。

问题:TTL或删除旧记录会创建墓碑。

方法2:

  

创建表test.inv_positions(
  location_id int,
   项目bigint,   time_id时间戳,
  sales_floor_qty int,
  backroom_qty int,
  in_backroom布尔值,
   Transit_qty int,
   主键((location_id),   item))的聚类顺序为(item asc);

此表如果有相同位置和项目的新记录,则会对其进行补缺。它易于阅读,无需担心清除旧记录

关注点:我在Cassandra上还有另一个应用程序,该应用程序在不同的时间更新了不同的col,但我们仍然遇到阅读问题。也就是说,高手也会创建墓碑,但是与方法1相比,情况有多糟?还是其他更好的建模方法?

1 个答案:

答案 0 :(得分:2)

第一种方法似乎很好。 TTL和删除均创建逻辑删除。您可以参考基于TTL的删除的压缩策略。 TWCS更好地用于基于TTL的删除,否则您可以使用STCS进行简单的删除。另外,相应地配置gc_grace_seconds以平滑清除逻辑删除,因为重的逻辑删除会导致读取延迟。