在几乎完整的 Cassandra 节点中清理 space
Cleanup space in almost full Cassandra Node
我有一个 Cassandra 集群 (2 DC),每个节点有 6 个节点,RF 2. 4 个节点(在每个 DC 中)已满,所以我需要尽快清理 space。
我尝试 运行 进行全面修复,但结果是个坏主意,因为 space 开始增加得更多,修复最终挂起。作为最后的解决方案,我正在考虑开始修复,然后从最小到最大开始清理特定的列。
即
nodetool repair -full foo_keyspace bar_columnfamily
nodetool cleanup foo_keyspace bar_columnfamily
您认为此过程对数据安全吗?
谢谢
您不应填充超过 50-60% 的磁盘以为压缩腾出空间。如果您超过该磁盘使用量,您需要考虑获得更大的磁盘或添加更多节点。
通常可以遵循 Datastax 建议:https://docs.datastax.com/en/dse-planning/doc/planning/planPlanningDiskCapacity.html
您在问题中提出的命令做出了一些不正确的假设。首先,"repair" 不应该也不会保存任何 space。所有修复所做的就是找到不同副本之间的不一致并修复它们。它要么什么都不做(如果没有不一致),要么 添加 数据,而不是删除数据。
其次,"cleanup" 是您在向集群添加新节点后需要做的事情——在每个节点将其部分数据发送到新节点后,"cleanup" 会从旧节点中删除数据。但是在不添加节点时清理是不相关的。
您可能正在寻找的命令是 "compact"。这可以节省 space,但前提是您知道有大量覆盖(重写现有行)、删除或数据过期 (TTL)。你使用什么压缩策略?如果是默认的,size-tiered compaction strategy (STCS) 你可以开始 major compaction (nodetool compact) 但应该意识到其中的一个大风险:
主要压缩将所有数据合并为一个 sstable(Cassandra 的磁盘文件格式),删除已删除、过期或覆盖的数据。但是,在此压缩过程中,您有 个输入和输出文件,在最坏的情况下,这可能会使您的磁盘使用量增加一倍,并且如果磁盘已满 50% 以上,则可能会失败。这就是为什么许多 Cassandra 最佳实践指南建议不要填充超过 50% 的磁盘空间。但这只是最坏的情况。如果您知道输出文件将比输入文件小得多(因为大部分数据已被删除),您可以使用 less free space。也许更有用的是,如果您有许多单独的表(列族),您可以分别压缩每个表(如您所建议的,从最小到最大)并且在压缩期间临时需要的最大磁盘量 space 可以是很多不到 50% 的磁盘空间。
Scylla 是 Cassandra 的 C++ 重新实现,正在开发一种称为 "hybrid compaction"(参见 https://www.slideshare.net/ScyllaDB/scylla-summit-2017-how-to-ruin-your-performance-by-choosing-the-wrong-compaction-strategy)的东西,它类似于 Cassandra 的大小分层压缩,但以小块进行压缩,而不是生成一个大块文件,以避免在压缩过程中使用大量的临时磁盘。很遗憾,Cassandra 还没有这个功能。
好主意是先开始对最小 table 上的最小键空间进行逐个修复,然后完成修复。这将需要时间但更安全的方式,并且没有机会挂起和流量损失。
修复完成后,以与修复相同的方式开始清理。这样对节点和集群也没有影响。
我有一个 Cassandra 集群 (2 DC),每个节点有 6 个节点,RF 2. 4 个节点(在每个 DC 中)已满,所以我需要尽快清理 space。
我尝试 运行 进行全面修复,但结果是个坏主意,因为 space 开始增加得更多,修复最终挂起。作为最后的解决方案,我正在考虑开始修复,然后从最小到最大开始清理特定的列。
即
nodetool repair -full foo_keyspace bar_columnfamily
nodetool cleanup foo_keyspace bar_columnfamily
您认为此过程对数据安全吗?
谢谢
您不应填充超过 50-60% 的磁盘以为压缩腾出空间。如果您超过该磁盘使用量,您需要考虑获得更大的磁盘或添加更多节点。
通常可以遵循 Datastax 建议:https://docs.datastax.com/en/dse-planning/doc/planning/planPlanningDiskCapacity.html
您在问题中提出的命令做出了一些不正确的假设。首先,"repair" 不应该也不会保存任何 space。所有修复所做的就是找到不同副本之间的不一致并修复它们。它要么什么都不做(如果没有不一致),要么 添加 数据,而不是删除数据。 其次,"cleanup" 是您在向集群添加新节点后需要做的事情——在每个节点将其部分数据发送到新节点后,"cleanup" 会从旧节点中删除数据。但是在不添加节点时清理是不相关的。
您可能正在寻找的命令是 "compact"。这可以节省 space,但前提是您知道有大量覆盖(重写现有行)、删除或数据过期 (TTL)。你使用什么压缩策略?如果是默认的,size-tiered compaction strategy (STCS) 你可以开始 major compaction (nodetool compact) 但应该意识到其中的一个大风险:
主要压缩将所有数据合并为一个 sstable(Cassandra 的磁盘文件格式),删除已删除、过期或覆盖的数据。但是,在此压缩过程中,您有 个输入和输出文件,在最坏的情况下,这可能会使您的磁盘使用量增加一倍,并且如果磁盘已满 50% 以上,则可能会失败。这就是为什么许多 Cassandra 最佳实践指南建议不要填充超过 50% 的磁盘空间。但这只是最坏的情况。如果您知道输出文件将比输入文件小得多(因为大部分数据已被删除),您可以使用 less free space。也许更有用的是,如果您有许多单独的表(列族),您可以分别压缩每个表(如您所建议的,从最小到最大)并且在压缩期间临时需要的最大磁盘量 space 可以是很多不到 50% 的磁盘空间。
Scylla 是 Cassandra 的 C++ 重新实现,正在开发一种称为 "hybrid compaction"(参见 https://www.slideshare.net/ScyllaDB/scylla-summit-2017-how-to-ruin-your-performance-by-choosing-the-wrong-compaction-strategy)的东西,它类似于 Cassandra 的大小分层压缩,但以小块进行压缩,而不是生成一个大块文件,以避免在压缩过程中使用大量的临时磁盘。很遗憾,Cassandra 还没有这个功能。
好主意是先开始对最小 table 上的最小键空间进行逐个修复,然后完成修复。这将需要时间但更安全的方式,并且没有机会挂起和流量损失。 修复完成后,以与修复相同的方式开始清理。这样对节点和集群也没有影响。