我正在尝试在 Linux 上设置流复制。pg_basebackup
由于巨大的数据大小(即 7TB)而失败。它失败了,因为备份时间太长,即 20 小时。并且所需的 WAL 文件已经从 master 中消失了。那么我该如何解决这个问题以及如何加快这个pg_basebackup
过程呢?我正在使用 PostgreSQL 13。我需要更改postgres.conf
主从的哪些,以及我需要使用哪些开关来加快备份过程?我正在使用以下命令
pg_basebackup -h 192.168.100.81 -U repuser -p 5432 -D /var/lib/postgresql/13/main \
-Fp -Xs -P -R -C -S Secondary01 --checkpoint=fast --max-rate=1024M
正如 Melkij 所建议的那样,使用插槽应该可以防止所需的 WAL 被删除。但是,我怀疑 pg_basebackup 中存在一些计时错误,它无论如何都会发生。我已经在“野外”看到过几次,但在我尝试的时候却从来没有得到它,这使得调查和解决变得困难。
如果您像 Melkij 认为的那样与 max_slot_wal_keep_size 发生冲突,我认为它会失败并显示不同的错误消息
pg_basebackup: error: unexpected termination of replication stream: FATAL: terminating connection due to administrator command
,这就是为什么我认为您更有可能遇到计时错误。当我遇到这个错误时,我在备份开始后很快就收到了错误消息。但是很容易错过这条消息,然后它继续复制整个数据目录,最终最终失败。因此,一种选择是再试一次,在开始时留意错误消息,以便您可以手动中止该过程,而不是让它运行 20 个小时无用的时间。
虽然 pg_basebackup 确实很方便,但它在几个方面都不是很好。因此,您可能希望使用不同的方法进行独占备份来复制数据,例如
rsync
. pg_basebackup 的压缩选项有点用处,它以未压缩的方式通过网络传输数据,然后在客户端对其进行压缩。这与你想要建立一个副本的相反。rsync 的 -z 选项将压缩传输的数据,然后在它到达后解压缩。这将有多大的好处将取决于您的数据,但我已经看到它通过慢速网络将传输速度提高了 15 倍。独占备份的另一个优点是,如果它被网络故障或其他原因中断,您可以使用 -c 选项让 rsync 从中断的地方继续,而 pg_basebackup 不会这样做。但是,这将有多大效率将取决于您的数据在此期间有多少已上交。
当然,您必须从打开 WAL 归档开始,或者使用 pg_receivewal 或类似的东西来捕获在初始复制期间生成的 WAL,因为 rsync 不会像 pg_basebackup 尝试那样为您做这件事。