SSTables 行时间戳分布与 TWCS 混淆
SSTables row timestamps distribution messed up with TWCS
我们正在 运行ning Cassandra 2.1.14 并在几个月前迁移到我们的一个 CF 上的 TWCS,从那时起,在获得更好的性能和每个查询的平均 SSTables 读取大幅减少的同时,我们注意到旧的 SSTables 永远不会被驱逐。
运行 Cassandra 的 sstableexpiredblockers 实用程序我们看到原因是旧的 SSTabes 的最大时间戳甚至高于新的 SSTable 的最小时间戳,这意味着 Cassandra 不会尝试驱逐即使实际的 SSTables 已完全删除(我们编写了一个微型 java 应用程序,它直接通过 SSTable 来确保)。
所以问题是 - 为什么即使是非常新的 SSTables 也有旧行?
澄清一下:我们的代码库从不更新行,所有行都有 TTL。
另一个问题,鉴于这是我们目前的情况,是否有一种简单的方法可以强制 Cassandra 运行 驱逐旧的 SSTables?
附件是 SSTables 及其最小\最大时间戳:
所以我们发现问题的根本原因是读取修复和推测重试已启用。禁用它们并 运行 主要压缩一次以删除陈旧的 SSTables 并且一切都按预期工作。
我们正在 运行ning Cassandra 2.1.14 并在几个月前迁移到我们的一个 CF 上的 TWCS,从那时起,在获得更好的性能和每个查询的平均 SSTables 读取大幅减少的同时,我们注意到旧的 SSTables 永远不会被驱逐。
运行 Cassandra 的 sstableexpiredblockers 实用程序我们看到原因是旧的 SSTabes 的最大时间戳甚至高于新的 SSTable 的最小时间戳,这意味着 Cassandra 不会尝试驱逐即使实际的 SSTables 已完全删除(我们编写了一个微型 java 应用程序,它直接通过 SSTable 来确保)。
所以问题是 - 为什么即使是非常新的 SSTables 也有旧行? 澄清一下:我们的代码库从不更新行,所有行都有 TTL。
另一个问题,鉴于这是我们目前的情况,是否有一种简单的方法可以强制 Cassandra 运行 驱逐旧的 SSTables?
附件是 SSTables 及其最小\最大时间戳:
所以我们发现问题的根本原因是读取修复和推测重试已启用。禁用它们并 运行 主要压缩一次以删除陈旧的 SSTables 并且一切都按预期工作。