PostgreSQL 教程: 监控 WAL 文件

一月 26, 2024

摘要:在本教程中,您将学习如何在 PostgreSQL 中监控 WAL 文件。

什么是 WAL 文件?

对 PostgreSQL 服务器管理的数据所做的更改,会被序列化为可重放的差异增量,并作为有序序列写出到文件,这些文件称为“预写式日志”或 WAL。该机制确立了实现 PostgreSQL 很多流行功能的基础,例如时间点恢复(PITR)和流复制(因此还有只读副本、热备、故障转移和高可用性)。

PostgreSQL 安装中会附带一个 pg_basebackup 工具,可帮助您创建 PostgreSQL 实例完整的一致性备份。如果希望能够执行时间点恢复(PITR),则需要归档 WAL 文件,以便以后使用这些文件从基础备份向前还原。

WAL 文件存储在pg_wal目录中。通常,这些文件是 16 MB 的大小,文件名为 24 个字符,由十六进制数字(0-9、A-F)组成。

在服务器的运行过程中,新的 WAL 文件不断被创建,旧的 WAL 文件被有效地删除(它们实际上会被重命名和重用,因为这比删除和创建产生的磁盘 I/O 略少)。

为什么要监控它们?

不幸的是,很难预测服务器正常运行所需的 WAL 文件数量(以及它们所需的磁盘空间)。检查点配置(checkpoint_timeout、checkpoint_completion_target)、WAL 文件配置(min_wal_size、max_wal_size、wal_compression)和归档配置(archive_timeout)相关的设置,都会影响pg_wal目录中的 WAL 文件数。最重要的是,WAL 归档和复制槽等功能可能会导致 WAL 文件被保留。

不监控 WAL 文件的最大风险是,如果需要,PostgreSQL 可以并且很乐意无限期地保留它们。它们会不受控制地增长,最终可能会消耗所有可用的磁盘空间。如果 PostgreSQL 服务器由于磁盘空间不足而停机,请记住,它需要在重新启动时执行检查点,这可能会需要更多的磁盘空间。

在任何情况下都无法阻止 WAL 文件的创建,因为 PostgreSQL 事务提供的 ACID 机制需要它。

简而言之,非常值得您花时间设置一些东西,来监控每个 PostgreSQL 服务器的 WAL 文件数量。理想情况下,任何给定时间的文件数应介于上限和下限之间,维护任务和批处理工作负载会出现一些可预期的变化。

我应该注意什么?

WAL 文件数量激增通常是由类似 VACUUM 的维护任务引起的,这些任务会在短时间内创建大量更改或者临时的表和对象。这些应该会慢慢回落到正常水平。这通常会导致大量的磁盘 I/O 和 CPU 活动,导致应用程序查询运行速度变慢,直到一切恢复正常。

如果数量持续增加,没有出现回落的迹象,必须迅速处理。这些可能是因为:

  • 归档失败:如果某个 WAL 文件的归档操作失败,PostgreSQL 会保留该文件并继续重试,直到成功为止。同时,新的 WAL 文件也会继续创建。请确保您的 WAL 归档过程不会中断,并且能够跟上 WAL 创建速率。
  • 复制失败:当使用具有复制槽的流复制时,如果备用数据库关闭,PostgreSQL 将保留备用数据库所需的 WAL 文件,以便备用数据库可以从中断的位置恢复。如果备用数据库长时间停机,或者有人忘了删除主数据库上的复制槽,则会无限期地保留 WAL 文件。请确保所有备节点和复制槽都处于活动状态,并且备节点可以跟上主节点上发生的更改。

检查 WAL 文件的数量

简单监控pg_wal目录中的文件数量,并将数值发送到现有的监控系统,即可帮助您跟踪 WAL 文件数量。您可以执行以下查询,以获取 WAL 文件的数量:

SELECT COUNT(*) FROM pg_ls_waldir();

这可以完成获取 WAL 文件数量的工作。pg_ls_waldir返回预写式日志(WAL)目录中每个文件的名称、大小和最后修改时间(mtime)。默认情况下,只有超级用户和pg_monitor角色的成员才能使用此函数。可以使用GRANT授予其他用户访问权限。

如果您有一个可以监控 SQL 查询返回的值的系统,那么这很适合它。

检查未归档文件的数量

每当 WAL 文件准备好归档时,您都会看到相应的 “.ready” 文件。在 WAL 文件成功归档后,你会得到相应的 “.done” 文件。您可以执行以下查询,以获取未归档文件的数量:

SELECT count(*) AS count FROM pg_ls_dir('pg_wal/archive_status')
  WHERE pg_ls_dir ~ E'^[0-9A-F]{24}\.ready$';

它可以获取未归档的 WAL 文件的数量。请注意,您需要超级用户权限,或者显式 GRANT 授权,才能执行pg_ls_dir函数。

当您看到许多的 “.ready” 文件时,这可能意味着您当前的归档操作失败了,或者系统上负载过高,以至于归档无法跟上。