问题描述
nodetool repair
操作失败后,我得到了两个大的 sstable 文件(下面列表中的最后两个)而不是一个,每个文件的大小都与之前的单个文件相同。现在这些文件无法通过常用工具(nodetool clean、nodetool compact、nodetool repair)合并回来。表被复制到另一个 cassandra 节点(replication_factor: 2),现在也有两个大的 sstable 文件。
-rw-r--r-- 1 cassandra cassandra 16M Mar 5 12:36 mc-116413-big-Data.db
-rw-r--r-- 1 cassandra cassandra 34M Mar 5 01:21 mc-116320-big-Index.db
-rw-r--r-- 1 cassandra cassandra 39M Mar 3 22:46 mc-116125-big-Index.db
-rw-r--r-- 1 cassandra cassandra 66M Mar 5 12:25 mc-116412-big-Data.db
-rw-r--r-- 1 cassandra cassandra 262M Mar 5 05:51 mc-116365-big-Data.db
-rw-r--r-- 1 cassandra cassandra 263M Mar 5 08:46 mc-116386-big-Data.db
-rw-r--r-- 1 cassandra cassandra 263M Mar 5 11:42 mc-116407-big-Data.db
-rw-r--r-- 1 cassandra cassandra 7.2G Mar 5 03:18 mc-116345-big-Data.db
-rw-r--r-- 1 cassandra cassandra 43G Mar 3 22:46 mc-116125-big-Data.db
-rw-r--r-- 1 cassandra cassandra 48G Mar 5 01:21 mc-116320-big-Data.db```
I suppose that one of this files contains duplicated data. How can I compact files back to a single file?
解决方法
也许我没看清楚,但我在您发布的文件列表中没有看到任何重复的 SSTable 文件。
如果您指的是这两个:
-rw-r--r-- 1 cassandra cassandra 43G Mar 3 22:46 mc-116125-big-Data.db
-rw-r--r-- 1 cassandra cassandra 48G Mar 5 01:21 mc-116320-big-Data.db
它们不是重复的,因为它们有 2 个不同的代 ID - 116125
和 116320
。这意味着他们也有不同的祖先。
如果您指的是这些:
-rw-r--r-- 1 cassandra cassandra 39M Mar 3 22:46 mc-116125-big-Index.db
-rw-r--r-- 1 cassandra cassandra 43G Mar 3 22:46 mc-116125-big-Data.db
-rw-r--r-- 1 cassandra cassandra 34M Mar 5 01:21 mc-116320-big-Index.db
-rw-r--r-- 1 cassandra cassandra 48G Mar 5 01:21 mc-116320-big-Data.db
同样,它们不是彼此重复的。 *-Data.db
文件包含实际数据。 *-Index.db
文件是包含分区索引的组件文件,即用于快速检索的数据文件中的分区索引。
如果您有兴趣,我在这篇博文中对其进行了更详细的解释 -- https://community.datastax.com/questions/5219/。干杯!
[更新]要回答这个后续问题:
你能想象为什么这两个文件没有被压缩成一个文件吗, 像往常一样吗?
假设该表配置了 SizeTieredCompactionStrategy
,那么在将它们压缩在一起之前,它将需要类似大小的 sstables 作为候选对象。
default minimum sstable candidates 是 min_threshold: 4
,因此您需要 4 个类似大小的 sstable 才能触发压缩。