如果我想删除数十亿个条目,如何选择tombston_failure_threshold值



我有一个表有大约150亿个条目,我想从中删除大约130亿个条目。我不能一次写130亿个逻辑删除,因为磁盘空间紧张。

我计划分块删除数据,所以我将一次性创建4亿个墓碑。

现在,我有两个问题:

  1. 对于上述情况,tombstone_failure_threshold的最佳值是多少
  2. 在我的情况下,删除130亿条的最佳方法是什么

[EDIT]正在添加架构&查询

CREATE TABLE Coupons (
key text PRIMARY KEY,
code text
) WITH COMPACT STORAGE
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4', 'tombstone_compaction_interval': '604800', 'unchecked_tombstone_compaction': 'true'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.0
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
  • 读取查询:使用分区键读取
  • 删除查询:使用分区键删除

如果您只使用分区键进行读取,而不使用Spark等进行全表扫描的东西,那么您可以删除数据,而不修改tombstone_failure_threshold

原因是Cassandra在读取tombstone时会对其进行计数,例如,如果您有一个内部有多行的分区。但在您的情况下,每个分区有一行,所以当您按分区键读取时,对于给定的分区,您最多可以读取一个tombstone。

但是,当您使用Spark、DSBulk或自定义代码同时读取多个分区时,情况就不同了——然后会读取多个tombstone,并根据该阈值进行计数。

最新更新