Redshift集群Leader节点磁盘使用率达100%问题求助
看起来你遇到的问题很典型——Redshift计算节点的磁盘空间随着数据删除降下来了,但Leader节点反而爆了。Leader节点主要负责元数据管理、查询调度和日志存储,和存储用户数据的计算节点逻辑不一样,所以得从它的核心职责入手排查,给你几个具体的步骤:
先查日志文件的锅
Leader节点会攒下系统日志、审计日志还有查询日志,要是没配置自动清理,两周下来很容易占满磁盘。你可以用SQL先看看系统表和日志相关的空间占用:-- 查看核心系统表的磁盘占用 SELECT schemaname, tablename, size FROM svv_table_info WHERE schemaname IN ('pg_catalog', 'stl', 'svv'); -- 看看审计日志的配置 SELECT * FROM pg_logging_settings WHERE setting LIKE '%audit%';如果是日志占了大头,你可以在Redshift控制台调整日志保留周期,比如把审计日志的保留天数改短,或者用
ALTER SYSTEM修改对应的参数(记得改完要重启生效)。要是急着腾空间,也可以手动清理旧的日志文件,但别直接删系统表,按官方的日志管理流程来。排查残留的临时文件
你已经重启过集群了,但有些Leader节点上的临时文件可能没清干净——比如未完成的查询留下的临时数据,或者Vacuum操作产生的元数据临时文件。要是你开了集群的SSH访问,可以连到Leader节点跑几个命令看看:# 先看整体磁盘使用情况 df -h # 找大于1G的大文件 find / -type f -size +1G | sort -n -r找到大文件后,确认是没用的临时文件再删。另外,也可以查下有没有挂着的长事务,这些事务可能会锁住临时文件不让清理:
SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction';把这些长事务结束掉,说不定空间就释放了。
检查元数据膨胀
频繁删表、改表结构或者跑DDL,会让Leader节点的系统元数据表(比如pg_class、pg_attribute)膨胀,而且普通的Vacuum不会处理这些系统表。你可以查下这些表的大小:SELECT relname, (relpages * 8192)/1024/1024 AS size_mb FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog') ORDER BY size_mb DESC;要是发现某个系统表特别大,可以在低峰期跑
VACUUM FULL来收缩它:VACUUM FULL pg_catalog.pg_class; VACUUM FULL pg_catalog.pg_attribute;注意这个操作会锁表,一定要选业务空闲的时候做。
看看备份和快照的元数据
自动快照或者手动备份的元数据也可能存在Leader节点上,要是快照保留太多、太旧,元数据堆起来也会占空间。你去Redshift控制台看看快照列表,清理掉过期的、没用的快照,同时检查自动快照的保留周期是不是设得太长了。外部表的元数据也别放过
如果你建了一大堆指向S3的外部表,Leader节点要存这些外部表的元数据,数量多了也会占空间。可以查下外部表的占用:SELECT schemaname, tablename, size FROM svv_table_info WHERE schemaname = '你的外部表 schema 名';把那些不用的外部表删掉,就能释放对应的元数据空间了。
按这个顺序排查下来,应该能找到Leader节点磁盘满的原因,一步步处理就行。
内容的提问来源于stack exchange,提问作者bhavin

