cassandra 删除最佳实践
cassandra deletes best practices
希望在大型 table 上收回 space。 table 有不再需要的旧数据,可以将其删除。删除是基于分区键的,大约有500k个分区键要删除。
批量删除运行 一次性删除50k 还是100k 比较好?什么可能是更好的批处理大小(这里的批处理意味着一次可以 运行 删除多少次)?
如果从 cqlsh 中删除 运行,cqlsh 将充当客户端并连接到 diff 节点作为每次删除的协调器节点,或者将启动 cqlsh 的节点充当协调节点和从那里触发的所有删除?
运行 大规模 deletes/cleanups 的最佳实践是什么?有什么具体的注意事项吗?
在 Cassandra 中你需要记住的第一件事是删除确实会增加磁盘消耗,而不是减少它,直到压缩发生并且旧数据被删除。 The Last Pickle 在该主题上有 great blog post。
关于您的问题:
- 不同分区键上的批处理会严重增加协调器节点的压力,因此不推荐使用它们,尤其是这么大。更喜欢一个一个删除
cqlsh
始终将命令发送到同一主机(这是 enforced by WhiteListPolicy),该主机充当协调器,然后将流量转发到拥有该数据的节点。
- 我建议使用外部工具,Spark + Spark Cassandra Connector,或者您也可以使用 DSBulk 执行删除,通过使用自定义查询,类似这样(假设您有 CSV包含要删除的分区列的所有值的文件 -
:pk
CSV 文件 header 中的列名称,以及 pk
- 您的分区列的名称模式):
dsbulk load -query "DELETE FROM ks.table WHERE pk = :pk"
在这种情况下,DSBulk 会正确地将数据直接发送到拥有数据的节点,避免对协调器节点造成压力。
希望在大型 table 上收回 space。 table 有不再需要的旧数据,可以将其删除。删除是基于分区键的,大约有500k个分区键要删除。
批量删除运行 一次性删除50k 还是100k 比较好?什么可能是更好的批处理大小(这里的批处理意味着一次可以 运行 删除多少次)?
如果从 cqlsh 中删除 运行,cqlsh 将充当客户端并连接到 diff 节点作为每次删除的协调器节点,或者将启动 cqlsh 的节点充当协调节点和从那里触发的所有删除?
运行 大规模 deletes/cleanups 的最佳实践是什么?有什么具体的注意事项吗?
在 Cassandra 中你需要记住的第一件事是删除确实会增加磁盘消耗,而不是减少它,直到压缩发生并且旧数据被删除。 The Last Pickle 在该主题上有 great blog post。
关于您的问题:
- 不同分区键上的批处理会严重增加协调器节点的压力,因此不推荐使用它们,尤其是这么大。更喜欢一个一个删除
cqlsh
始终将命令发送到同一主机(这是 enforced by WhiteListPolicy),该主机充当协调器,然后将流量转发到拥有该数据的节点。- 我建议使用外部工具,Spark + Spark Cassandra Connector,或者您也可以使用 DSBulk 执行删除,通过使用自定义查询,类似这样(假设您有 CSV包含要删除的分区列的所有值的文件 -
:pk
CSV 文件 header 中的列名称,以及pk
- 您的分区列的名称模式):
dsbulk load -query "DELETE FROM ks.table WHERE pk = :pk"
在这种情况下,DSBulk 会正确地将数据直接发送到拥有数据的节点,避免对协调器节点造成压力。