我使用的是Cassandra 3.6数据库,表定义是这样的。
CREATE TABLE sg.products (
date_updated text,
time_added int,
id text,
best_seller text,
company text,
PRIMARY KEY (date_updated, time_added, id)
) WITH CLUSTERING ORDER BY (time_added ASC, id ASC)
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'}
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.1
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';
表有数百万个数据。
在“products”表中,我删除了best_seller列,成功删除了列。 但是当我检查空间盘时,它没有判定,
所以我点击谷歌上的查询,我发现这个词“墓碑”,
所以Cassandra没有删除数据,有点保存到墓碑中。
现在我的问题是如何删除墓碑数据?所以我可以保存内存。
或者有什么办法可以节省内存吗?
提前致谢。
答案 0 :(得分:3)
Tombstones drop
只有在数据所属的表上定义的local_delete_time + gc_grace_seconds
之后,Cassandra才会在压缩触发时完全删除这些逻辑删除。请记住,所有节点都应该在gc_grace_seconds内修复,以确保正确分布逻辑删除并防止删除的数据重新出现。
答案 1 :(得分:2)
从表格定义中查看此行:
AND gc_grace_seconds = 864000
这是墓碑生存的时间段。 864000秒== 10天。在此期间存在逻辑删除,以便有足够的时间将其分发到群集中的其他节点。这样,所有其他节点都知道删除,并且不返回过时的值。
一旦10天过去了,下次此表触发压缩(在10天之后),墓碑将被删除。
请注意,您可以通过修改表定义中的该属性来缩短该时间段。只需确保您在该时间范围内运行维修。