十 hugegraph 手动清理cassandra 墓碑
hugegraph数据基本存在 graph_edges_in; graph_edges_out, graph_vertices, graph_secondary_indexes 中
大量手动删除数据在 cassandra 是不推荐的, 删除的数据通常会已墓碑的形式存在, 查询的时候过滤调,实际是个逻辑删除。(为啥需要墓碑,可以参考本文 https://www.jianshu.com/p/ce1bc6926085)
主要的思路就是处理分布式删除中的一致性问题,
比如有三个节点, a,b,c。 现在要删除person 老罗。
a,b 都删除了,这个时候 c 挂了。老罗没有删除。
当c 恢复的时候, 整个集群会认为 老罗是新数据, 又复制到了a,b, 这个称之为僵死数据。
cassandra处理方式,是a,b 删除后,标记为老罗 已经被删除,有个墓碑。
c起来后,看到老罗是墓碑数据,就知道是要删除的。
但是墓碑不能一直存在数据库里面, 过了一定的时间之后,系统会自己清除 tombstone。
以 graph_secondary_indexes 为例,
cqlsh:industrychain> describe graph_secondary_indexes;
CREATE TABLE industrychain.graph_secondary_indexes (
field_values text,
index_label_id int,
element_ids text,
PRIMARY KEY (field_values, index_label_id, element_ids)
) WITH CLUSTERING ORDER BY (index_label_id ASC, element_ids 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';
gc_grace_seconds 默认为 10天,也就是墓碑会保留10天。
我们需要 设置为 0
alter table graph_secondary_indexes with GC_GRACE_SECONDS =0;
然后在 bin目录下使用nodetool工具;
Nodetool compact
执行完之后,需要把 时间设置回来原
alter table graph_secondary_indexes with GC_GRACE_SECONDS =864000;