Redshift 真空不回收空间

问题描述

我有一个 Redshift 集群,它由 2 个具有 160 Gb 磁盘的节点组成。 运行真空或任何其他查询时,我随机收到“磁盘已满”错误。我的磁盘使用率为 92%。我确实删除了大小为 10515 Mb 的表中超过一半的旧行,但即使在重新启动集群后也没有任何影响并且表的大小仍然相同,尽管计数显示了新的行数。我应该看到磁盘使用量至少有小幅下降,但什么也没有。

有人知道它可能是什么吗?在这种情况下删除表格是唯一的选择吗?

解决方法

这里有几种可能性,但首先让我检查一下事实。您有一个 2 节点 dc2.large 集群,它的磁盘已满 92%。这太满了,需要降低以提供用于查询执行的临时空间。您有一个大小为 10515 个块的表。为了解决磁盘空间问题,您删除了相关表中 1/2 的行,然后清空了该表。完成后,您没有看到集群空间和表大小的任何变化,也没有看到表大小的一个块差异。我有这个正确吗?

第一种可能是真空没有正确完成。您提到即使在清理时也会收到磁盘已满消息。那么可能是您尝试的真空没有完成吗?您会看到真空需要临时空间来对表数据进行排序,如果您的集群太满,则真空可能会失败。在这种情况下,您可以运行仅删除真空,不会尝试对表进行排序,而只是回收磁盘空间。在磁盘已满的情况下,这将更有可能成功。

另一种可能是行的删除没有正确完成或在运行真空之前没有提交。这将导致真空在完整的行集上运行。

所讨论的表格也可能很宽(很多列)。这很重要,因为 Redshift 存储数据的方式 - 每个块的大小为 1MB,每列都需要一个块来存储其数据。这个集群有 4 个切片,如果这个表有 1,500 列宽(是的,这很愚蠢),该表将占用 6,000 个块来存储前 4 行。然后在这些块开始填满之前不需要额外的磁盘空间来添加行。表大小将在非常大的块中移动,当删除行时,除了大​​块外,大小可能不会改变。如果您看到的区块数量完全相同,则不太可能发生这种情况,但如果您只是看到区块中的变化比您预期的要少,则可能会发生这种情况。

可能发生了其他一些误解。仅排序的真空不会释放空间。节点类型不是我认为的那样。该表可以位于 S3 中并可以通过频谱访问。但根据描述,这些似乎不太可能。

未经请求的建议:您通过释放磁盘空间走在了正确的轨道上,但您需要采取的行动不仅仅是减少这一表。 (我希望您意识到这一点,这只是一个开始。)在大多数情况下,您应该在 70% 的磁盘空间以下运行 - 这因工作负载和表大小而异,但这是一个很好的一般规则。这意味着减少磁盘上的大量数据或增加节点数量(和成本)。将一些数据迁移到 S3 并使用 Spectrum 进行访问可能是一种选择。如果您需要更多存储而无需更多计算,您可以查看存储优化节点,但由于您处于 Redshift 的最小端,这些可能对您来说不是一个胜利。您需要 1) 删除不需要的数据,2) 将一些数据移动到 S3 并使用 Spectrum,或者 3) 在您的集群中添加一个节点。