cassandra 删除最佳实践

cassandra deletes best practices

希望在大型 table 上收回 space。 table 有不再需要的旧数据,可以将其删除。删除是基于分区键的,大约有500k个分区键要删除。

  1. 批量删除运行 一次性删除50k 还是100k 比较好?什么可能是更好的批处理大小(这里的批处理意味着一次可以 运行 删除多少次)?

  2. 如果从 cqlsh 中删除 运行,cqlsh 将充当客户端并连接到 diff 节点作为每次删除的协调器节点,或者将启动 cqlsh 的节点充当协调节点和从那里触发的所有删除?

  3. 运行 大规模 deletes/cleanups 的最佳实践是什么?有什么具体的注意事项吗?

在 Cassandra 中你需要记住的第一件事是删除确实会增加磁盘消耗,而不是减少它,直到压缩发生并且旧数据被删除。 The Last Pickle 在该主题上有 great blog post

关于您的问题:

  1. 不同分区键上的批处理会严重增加协调器节点的压力,因此不推荐使用它们,尤其是这么大。更喜欢一个一个删除
  2. cqlsh 始终将命令发送到同一主机(这是 enforced by WhiteListPolicy),该主机充当协调器,然后将流量转发到拥有该数据的节点。
  3. 我建议使用外部工具,Spark + Spark Cassandra Connector,或者您也可以使用 DSBulk 执行删除,通过使用自定义查询,类似这样(假设您有 CSV包含要删除的分区列的所有值的文件 - :pk CSV 文件 header 中的列名称,以及 pk - 您的分区列的名称模式):
dsbulk load -query "DELETE FROM ks.table WHERE pk = :pk" 

在这种情况下,DSBulk 会正确地将数据直接发送到拥有数据的节点,避免对协调器节点造成压力。