在 PostgreSQL 中,在管理预写式日志(WAL)的机制方面,pg_wal 目录起着至关重要的作用,该机制可确保事务的持久性和崩溃恢复。WAL 文件还可服务于复制的目的(如果有)。
最终,管理员可能会遇到 pg_wal 目录积压文件的情况,逐渐消耗磁盘空间,并可能引发文件系统问题和数据库崩溃。
本文将介绍 pg_wal 目录空间增长的一些常见原因、如何进行故障处理以及缓解该问题的策略。
事务量高峰期
问题:事务速率高,或事务量高峰期。WAL 段是 PostgreSQL 在处理事务时,在写入数据文件之前而生成的。如果事务速率超过系统归档或删除这些段的速率,它们会积压在 pg_wal 目录中,从而导致磁盘空间耗尽。
尽管归档速度通常不重要,但它与 pg_wal 目录中的平均 WAL 生成速率至少应该保持同步。如果归档速度明显落后于 WAL 段创建速率太长时间,pg_wal 将开始积压文件,直到归档完为止。如果 pg_wal 没有足够的空间,以容纳一些不常见/计划外的负载,则它可能会耗尽空间。
故障排除:确定 pg_wal 的 WAL 段创建速率,并将其与归档速度进行比较。
解决方案:如果归档速度不够快,我们应该改进归档的 IO 子系统(或使用 S3 云服务时的网络延迟)。否则,需要评估业务负载峰值的持续时间,并为 pg_wal 增加额外的空间。
低效的检查点
问题:PostgreSQL 中的检查点,对于将修改后的数据从内存刷新到磁盘,和回收过时的 WAL 段,都有重要作用。但是,效率低下的检查点策略,例如太不频繁或过于激进的检查点,可能会引起 WAL 文件的积压。不频繁的检查点会导致 WAL 段的保留时间延长,而过于激进的检查点可能会导致过多的磁盘 I/O 和 WAL 生成。
故障排除:评估有关数据库业务负载的检查点和 WAL 参数(min_wal_size、max_wal_size、wal_keep_size / wal_keep_segments、bgwriter_lru_maxpages、bgwriter_delay 等)。
解决方案:为检查点频率和后台写进程的效率找到适当的权衡。
复制延迟
范围:只有在设置了流复制时,才可能由复制延迟引发 WAL 积压。
问题:在备用服务器上应用更改的延迟,可能会加剧主服务器上 WAL 文件的积压。由于网络问题/速度缓慢、高负载或硬件资源限制,备用服务器可能会落后于其主服务器,因此主服务器会保留 WAL 段,直到它们在备用服务器上成功完成重放。此延迟可能会使主服务器上的磁盘空间的可用量变得紧张。
上述原因以及 wal_keep_size/wal_keep_segments 参数的配置错误,可能会导致空间耗尽。
废弃的复制槽会无限期地保留 WAL 段。
故障排除:验证主数据库和备用数据库之间的复制延迟。验证 wal_keep_segments / wal_keep_size(取决于您的数据库版本)参数的配置。在主服务器中查找已废弃的复制槽。
解决方案:提升备用服务器上的网络性能或 IO 性能(或任何硬件瓶颈)。删除任何已废弃的复制槽。根据复制性能和主服务器 pg_wal 目录容量,调整 wal_keep_segments/wal_keep_size 参数的配置。
WAL 归档异常
范围:只有在数据库启用了连续归档时(archive_mode 设置为 on,并且也设置了 archive_command),才可能由归档异常引发 WAL 积压。
问题:如果归档进程无法执行在 archive_command 中设置的命令,则 WAL 段将保留在 pg_wal 目录中,直到归档成功。
最常见的原因可能有:磁盘/文件系统(archive_command 指向的地方)已满、归档路径不存在、归档路径访问权限不足、归档超时、归档目标无法访问,archive_command 配置错误。
故障排除:每当 archive_command 执行失败时,都会在 PostgreSQL 日志中记录一条错误消息。
解决方案:这取决于确定WAL 归档异常的原因,再修复它。
WAL 保留策略
问题:WAL 归档的保留策略配置错误或不合理,也会导致 pg_wal 目录中文件的积压。如果归档进程未能及时删除过时的 WAL 段,则目录可能会因不必要的文件而变得膨胀,从而占用可用于其他目的的磁盘空间。
故障排除:查看上述 min_wal_size、max_wal_size、wal_keep_size / wal_keep_segments 参数。查看 PostgreSQL 日志中是否有失败的归档事件。
解决方案:改进相关参数,并修复归档失败的原因。
结论
PostgreSQL 中的 pg_wal 目录,对于确保数据持久性和恢复至关重要,但其不受限制的增长可能会导致磁盘空间限制和操作上的挑战。通过了解 pg_wal 目录中文件积压的常见原因,并实施适当的策略(例如调整检查点设置、监控复制延迟和实施有效的 WAL 保留策略),管理员可以有效地管理磁盘空间的使用量,并维护其 PostgreSQL 数据库的稳定性和性能。
由于 WAL 段在 PostgreSQL 数据库中起着关键作用,因此您永远不应该从 pg_wal 中手动删除 WAL 段。它可能会导致数据库崩溃、崩溃恢复失败、WAL 归档失败以及备份数据不完整。