首页 > 解决方案 > 红移真空没有回收空间

问题描述

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

有没有人有任何线索可能是什么?在这种情况下删除表是唯一的选择吗?

标签: amazon-redshiftvacuum

解决方案


这里有几种可能性,但首先让我检查一下事实。您有一个 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) 在集群中添加一个节点。


推荐阅读