【发布时间】:2022-06-15 17:24:27
【问题描述】:
在Master-Standby复制中会产生大量的WAL文件。
walfiles 在备用节点之一存档,每 2 小时,我们使用tar 压缩备用节点中的存档 WAL。尽管如此,它仍然是一个巨大的存储空间。
当涉及到 30、90 天的备份时,它会成为一个巨大的存储问题。此外,在恢复期间最终需要更多时间来下载和重播 WAL。
我使用了以下选项。
wal_level=replica
wal_compression=on
archive_mode = always
以下参数已注释/未使用。
archive_timeout
checkpoint_timeout
有没有其他方法,我们可以减少生成的 WAL 的数量或更简单的方法来管理它们? pg_waldump 显示大约 70-90% 的数据是整页图片。
另外,我可以通过更改备用节点使上述参数生效吗? 备用存档是否与主服务器发送的相同 WAL?还是根据备用配置重新生成?
-- 更新:修改为以下值
name | setting | unit
--------------------+---------+------
archive_timeout | 0 | s
checkpoint_timeout | 3600 | s
checkpoint_warning | 3600 | s
max_wal_size | 4000 | MB
min_wal_size | 2000 | MB
shared_buffers | 458752 | 8kB
wal_buffers | 4096 | 8kB
wal_compression | on |
wal_level | replica |
仍然看到每分钟生成 3-4 个 WAL 文件。 我正在热备用节点上进行这些更改(从那里进行备份)。我应该在Master中改变这个吗? master 设置对 Standby 的 WAL 生成有影响吗?
显示 FPI 大小=87% 的示例 pg_waldump
pg_waldump --stats 0000000100000498000000B2
Type N (%) Record size (%) FPI size (%) Combined size (%)
---- - --- ----------- --- -------- --- ------------- ---
XLOG 1 ( 0.00) 114 ( 0.01) 0 ( 0.00) 114 ( 0.00)
Transaction 3070 ( 10.35) 104380 ( 4.86) 0 ( 0.00) 104380 ( 0.63)
Storage 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
CLOG 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Database 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Tablespace 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
MultiXact 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
RelMap 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Standby 2 ( 0.01) 100 ( 0.00) 0 ( 0.00) 100 ( 0.00)
Heap2 590 ( 1.99) 33863 ( 1.58) 46192 ( 0.32) 80055 ( 0.48)
Heap 6679 ( 22.51) 578232 ( 26.92) 4482508 ( 30.92) 5060740 ( 30.41)
Btree 19330 ( 65.14) 1430918 ( 66.62) 9967524 ( 68.76) 11398442 ( 68.48)
Hash 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Gin 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Gist 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Sequence 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
SPGist 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
BRIN 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
CommitTs 4 ( 0.01) 120 ( 0.01) 0 ( 0.00) 120 ( 0.00)
ReplicationOrigin 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Generic 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
LogicalMessage 0 ( 0.00) 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
-------- -------- -------- --------
Total 29676 2147727 [12.90%] 14496224 [87.10%] 16643951 [100%]
使用log_checkpoints=on后
2022-06-15 07:08:57 UTC [11] LOG: checkpoint starting: time
2022-06-15 07:29:57 UTC [11] LOG: checkpoint complete: wrote 67010 buffers (14.6%); 0 WAL file(s) added, 12 removed, 56 recycled; write=1259.767 s, sync=0.010 s, total=1259.961 s; sync files=253, longest=0.003 s, average=0.001 s; distance=1125728 kB, estimate=2176006 kB
2022-06-15 07:38:57 UTC [11] LOG: checkpoint starting: time
2022-06-15 07:59:57 UTC [11] LOG: checkpoint complete: wrote 61886 buffers (13.5%); 0 WAL file(s) added, 20 removed, 10 recycled; write=1259.740 s, sync=0.005 s, total=1259.878 s; sync files=185, longest=0.002 s, average=0.001 s; distance=491822 kB, estimate=2007588 kB
【问题讨论】:
-
许多数据更改导致许多 WAL,这就是生命。您可以增加
max_wal_size和checkpoint_timeout以减少WAL 中的检查点和整页图像的数量,这将在一定程度上减少WAL 的数量,但代价是更长的崩溃恢复。 -
@LaurenzAlbe
checkpoint_timeout未设置。根据 WAL 的数量,我认为没有一个 WAL 是空的。因为到达了检查点,所以它们都没有生成。顺便说一句,我到达这里 cybertec-postgresql.com/en/… 并启用了 wal_compression=on。我已经在使用 tar 来压缩它们。需要看到区别。谢谢! -
检查点不会导致 WAL 切换。我建议的目的是在 WAL 中获得更少的完整 8kB 页面图像。页面在检查点后第一次被弄脏时,将整个页面写入 WAL。
-
@LaurenzAlbe 知道了。是否有任何经验法则或任何规则来为 checkpoint_timeout 设置一个合适的值?
pg_waldump显示在70-90周围的数据百分比是 FPI。
标签: postgresql replication database-replication database-backups wal