PostgreSQL 出现严重的 WAL 积压,怎么办?

数据库 PostgreSQL
由于 WAL 段在 PostgreSQL 数据库中起着关键作用,因此您永远不应该从 pg_wal 中手动删除 WAL 段。它可能会导致数据库崩溃、崩溃恢复失败、WAL 归档失败以及备份数据不完整。

在 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 归档失败以及备份数据不完整。

责任编辑:武晓燕 来源: 红石PG
相关推荐

2022-05-19 08:01:49

PostgreSQL数据库

2018-01-28 20:39:39

戴尔

2011-10-17 12:30:43

2010-08-26 14:23:28

路由器故障

2017-06-12 10:16:57

2017-02-21 13:11:43

SDN网络体系SDN架构

2022-12-19 11:31:57

缓存失效数据库

2024-04-22 08:17:23

MySQL误删数据

2009-11-03 08:56:02

linux死机操作系统

2015-10-22 09:09:59

BAT投资VC

2019-10-12 09:50:46

Redis内存数据库

2022-07-05 11:48:47

MySQL死锁表锁

2013-11-12 11:30:11

腾讯

2021-11-28 21:19:25

电脑程序Windows 10

2020-03-18 19:00:29

电脑内存不足系统

2024-10-09 17:06:52

RedisHash哈希表

2017-12-21 20:01:38

润乾报表

2019-08-29 07:35:29

网站404空白nginx

2011-07-28 13:45:06

2021-02-22 17:13:47

HTTP1.1协议
点赞
收藏

51CTO技术栈公众号