乐趣区

关于数据库:使用pgBackRest并行归档解决wal堆积问题

作者:温智尹

问题景象:

最近生产上一台 postgresql 云主机磁盘告警,查看各文件目录大小,发现 pg_wal 目录居然占用 600G+, 数据目录 300G。

现有架构:

rds 云主机 一主一从
磁盘大小 1.2T
数据盘为 ssd 归档与备份存储在 ks3 存储文件上

解决思路:

1. 查找 wal 日志继续不开释起因

首先咱们得理解那些参数影响 wal 日志产生的量与 pg_wal 目录文件的大小:max_wal_size (integer):在主动 WAL 检查点使得 WAL 增长到最大尺寸。这是软限度;非凡状况下 WAL 大小能够超过 max_wal_size,如重负载下,谬误 archive_command,或者 较大 wal_keep_segments 的设置。缺省是 1GB。减少这个参数会缩短解体复原所须要的工夫。这个参数只能在 postgresql.conf 文件或者服务器命令行上设置。wal_keep_segments (integer):指定在后备服务器须要为流复制获取日志段文件的状况下,pg_wal 目录下所能保留的过来日志文件段的最小数目。每个段通常是 16 兆字节。如果一个连贯到发送服务器的后备服务器落后了超过 wal_keep_segments 个段,发送服务器能够移除一个后备机依然须要的 WAL 段,在这种状况下复制连贯将被中断。最终后果是上行连贯也将最终失败(不过,如果在应用 WAL 归档,后备服务器能够通过从归档获取段来复原)。只设置 pg_wal 中保留的文件段的最小数目;零碎可能须要为 WAL 归档或从一个检查点复原保留更多段。如果 wal_keep_segments 为零(默认值),更多的空间来 寄存 WAL 归档或从一个检查点复原。如果 wal_keep_segments 是零(缺省),零碎不会为后备目标保留任何多余的段,因而后备服务器可用的旧 WAL 段的数量是一个上个检查点地位和 WAL 归档状态的函数。这个参数只能在 postgresql.conf 文件中或在服务器命令行上设置

如上解释,影响 wal 日志个数的起因次要有以上两个参数,查找该实例相干参数的值

postgres=# show max_wal_size; 
max_wal_size 
-------------- 
10GB 
postgres=# show wal_keep_segments ; 
wal_keep_segments 
------------------- 
600 

综合来看,在数据库失常状况下,pg_wal 目录文件大小应该在 10G 左右,那么为什么当初会产生 600G+ 的 wal,其实上述参数曾经给了咱们答案:非凡状况下 WAL 大小能够超过 max_wal_size,如重负载下,谬误 archive_command,或者 较大 wal_keep_segments 的设置。于是查看 pg_wal/archive_status 下文件,发现有大量 xxx.ready 的文件,示意该 wal 日志还未及时归档。联合现有架构,归档过程中因为 ks3 存储文件在性能限度上归档速度远远慢于本地 ssd 上 wal 日志产生的速度,所以 wal 无奈及时归档,一直累积,最终造成磁盘告警。起因找到了,接下来就是解决办法。

2. 解决办法

放慢 wal 归档速度

查看归档命令:

archive_command = 'DIR=/ks3data/wal/v3/d5ddd1d7-f458-4c50-ae23-012abc6e0570/723f790f-b66b-4312-bf08-02f8d0f083e5/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/%f && sudo cp %p $DIR/%f

归档命令串行复制 wal 日志,因为往 s3 存储上拷贝,收到性能影响,归档速度远落后与 wal 产生的速度,于是想到能不能并行归档 wal 日志。查找相干材料,最终决定测试 pgBackRest 工具。

pgBackRest

pgBackRest 旨在成为一个牢靠,易于应用的备份和还原解决方案,通过利用针对特定数据库需要进行了优化的算法,能够无缝地扩大到最大的数据库和工作负载。

产品特点:
1. 并行备份和还原
2. 本地或近程操作
3. 残缺,增量和差别备份
4. 备份轮换和存档到期
5. 备份完整性
6. 页面校验和
7. 备份简历
8. 流压缩和校验和
9. 增量还原
10. 并行,异步 WAL Push&Get
11. 表空间和链接反对
12.S3 和 Azure 兼容对象存储反对
13. 加密
14. 与 PostgreSQL > = 8.3 的兼容性

相干连贯:
https://pgbackrest.org/
https://github.com/pgbackrest…

具体装置应用参考链接文档,这里咱们次要应用第 10 个个性:并行,异步 WAL Push&Get 配置 pgbackrest 参数文件:

[demo] 
pg1-path=/rds/postgresql/ 
pg1-port=5432 
pg1-socket-path=/tmp 
pg1-host-user=postgres 

[global] repo1-path=/ks3data/wal/v3/c2880a97-c981-4962-a25b-568ce07fbe80/7ab5da8d-ef99-4783-85ac-628730ea0124/2021-01-29 
repo1-retention-full=2 
archive-async=y 
log-level-file=detail 
spool-path=/rds/pgbackrest 

[global:archive-push] 
compress-level=3 
process-max= 3 

[global:archive-get] 
process-max=3 
compress-level=3 

其中
archive-async=y 管制异步模式关上,如果该参数敞开,process-max 有效,始终为 1 process-max=3 示意最大过程数

敞开 archive-async 成果:

root@vm10-72-87-103 archive_status]# ps -ef | grep arch 
postgres 736 729 0 Jan26 ? 00:00:00 postgres: archiver archiving 0000000100000004000000EE 
postgres 225852 736 0 21:31 ? 00:00:00 sh -c DIR=/ks3data/binlogs/v3/c2880a97-c981-4962-a25b-568ce07fbe80/7ab5da8d-ef99-4783-85ac-628730ea0124/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/0000000100000004000000EE && sudo pgbackrest --stanza=demo archive-push pg_wal/0000000100000004000000EE 
root 225867 225852 0 21:31 ? 00:00:00 sudo pgbackrest --stanza=demo archive-push pg_wal/0000000100000004000000EE 
root 225868 225867 9 21:31 ? 00:00:00 pgbackrest --stanza=demo archive-push pg_wal/0000000100000004000000EE root 225877 217995 0 21:31 pts/1 00:00:00 grep arch 

关上 archive-async:

[root@vm10-72-87-103 pgbackrest]# ps -ef | grep arch 
postgres 736 729 0 Jan26 ? 00:00:00 postgres: archiver archiving 000000010000000500000043 
root 227107 1 0 21:32 ? 00:00:00 pgbackrest --log-level-console=off --log-level-stderr=off --stanza=demo archive-push:async /rds/postgresql/pg_wal 
root 227108 227107 7 21:32 ? 00:00:07 pgbackrest --host-id=1 --log-level-console=off --log-level-file=off --log-level-stderr=error --process=1 --remote-type=repo --stanza=demo archive-push:local 
root 227109 227107 7 21:32 ? 00:00:07 pgbackrest --host-id=1 --log-level-console=off --log-level-file=off --log-level-stderr=error --process=2 --remote-type=repo --stanza=demo archive-push:local 
root 227110 227107 7 21:32 ? 00:00:07 pgbackrest --host-id=1 --log-level-console=off --log-level-file=off --log-level-stderr=error --process=3 --remote-type=repo --stanza=demo archive-push:local 
root 228624 217995 0 21:33 pts/1 00:00:00 grep arch 
postgres 228626 736 0 21:33 ? 00:00:00 sh -c DIR=/ks3data/binlogs/v3/c2880a97-c981-4962-a25b-568ce07fbe80/7ab5da8d-ef99-4783-85ac-628730ea0124/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/000000010000000500000043 && sudo pgbackrest --stanza=demo archive-push pg_wal/000000010000000500000043

比拟,一共有 pgbackrest 三个过程,查看相干日志

-------------------PROCESS START------------------- 2021-01-29 21:32:29.735 P00 INFO: archive-push:async command begin 2.30: [/rds/postgresql/pg_wal] --archive-async --compress-level=3 --log-level-console=off --log-level-file=detail --log-level-stderr=off --pg1-path=/rds/postgresql --process-max=3 --repo1-path=/ks3data/binlogs/v3/c2880a97-c981-4962-a25b-568ce07fbe80/7ab5da8d-ef99-4783-85ac-628730ea0124/2021-01-27 --spool-path=/rds/pgbackrest --stanza=demo 2021-01-29 21:32:29.736 P00 INFO: push 72 WAL file(s) to archive: 00000001000000050000000A...000000010000000500000051 
2021-01-29 21:32:32.877 P02 DETAIL: pushed WAL file '00000001000000050000000B' to the archive 
2021-01-29 21:32:33.508 P03 DETAIL: pushed WAL file '00000001000000050000000C' to the archive 
2021-01-29 21:32:34.445 P01 DETAIL: pushed WAL file '00000001000000050000000A' to the archive 
2021-01-29 21:32:36.955 P01 DETAIL: pushed WAL file '00000001000000050000000F' to the archive 
2021-01-29 21:32:37.764 P02 DETAIL: pushed WAL file '00000001000000050000000D' to the archive 
2021-01-29 21:32:39.259 P03 DETAIL: pushed WAL file '00000001000000050000000E' to the archive 
2021-01-29 21:32:41.799 P01 DETAIL: pushed WAL file '000000010000000500000010' to the archive 
2021-01-29 21:32:42.598 P02 DETAIL: pushed WAL file '000000010000000500000011' to the archive 
2021-01-29 21:32:43.564 P03 DETAIL: pushed WAL file '000000010000000500000012' to the archive 
2021-01-29 21:32:45.864 P01 DETAIL: pushed WAL file '000000010000000500000013' to the archive 
2021-01-29 21:32:46.533 P02 DETAIL: pushed WAL file '000000010000000500000014' to the archive 
2021-01-29 21:32:47.608 P03 DETAIL: pushed WAL file '000000010000000500000015' to the archive 
2021-01-29 21:32:50.496 P01 DETAIL: pushed WAL file '000000010000000500000016' to the archive
............ 
2021-01-29 21:34:22.864 P00 INFO: archive-push:async command end: completed successfully (113129ms) 

由日志可见:p00 负责统计须要归档的 wal 文件格式和查看 p01,p02,p03 过程归档状态,p01,p02,p03 异步并行负责日志归档。

后果 & 论断:
应用 pgBackRest 并行归档,问题解决。

退出移动版