【发布时间】:2021-10-07 17:09:46
【问题描述】:
我基本上有一个像这样的data 表(一个分区id,以及一个序列化值serialized_value):
CREATE TABLE keyspace.data (
id bigint,
serialized_value blob,
PRIMARY KEY (id)
) WITH caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'enabled': 'true'}
AND compression = { 'class' : 'LZ4Compressor'};
用例涉及维护数据的多个版本(serialized_value 用于给定的id)。
每天,我都必须向 Cassandra 发送一个新版本的数据。每次涉及 1 亿行/分区。
当然,我不需要维护所有版本的数据,只需要最近 4 天(所以最近的四个version_id)。
我确定了三种解决方案:
解决方案 1:TTL
这个想法是在插入时设置一个 TTL。这样,最旧版本的数据会被自动删除,而不会出现与 thombstone 相关的问题。
优点:
- 没有读取性能损失 (?)
- 没有与墓碑相关的问题
缺点:
- 如果几天摄取失败,我可能会因为 TTL 自动删除而丢失 Cassandra 集群中的所有数据
解决方案 2:动态表格
表创建变为:
CREATE TABLE keyspace.data_{version_id} (
id bigint,
serialized_value blob,
PRIMARY KEY (id)
) ...;
表名包含version_id。
优点:
- 表格(对应一个版本)很容易删除
- 没有读取性能损失
- 没有与墓碑相关的问题
缺点:
- 向集群动态添加表可能需要每次都启动所有节点。
- 有点难处理客户端(查询特定的表名,而不是同一个)
解决方案 3:大量删除
在这种情况下,所有数据都保留在一个表中,并且将version_id 添加到主键中。
CREATE TABLE keyspace.data (
version_id int,
id bigint,
serialized_value blob,
PRIMARY KEY ((version_id,id))
) ...;
优点:
- 在整个应用程序生命周期中只需创建和维护一个表
缺点:
- 可能会因大量 thombstone 而导致读取性能下降
- thombstones相关问题,因为需要删除大量数据,以清除所有与旧version_id相关的数据。
删除将只匹配确切的分区键,因此它将生成
partition thombstones而不是cell thombstones。但因此,我害怕这样做的表现..
实现这一目标的最佳方法是什么? :-)
【问题讨论】:
标签: cassandra datastax datastax-enterprise