在我的上一篇博客中,我们了解了如何从 pgBackRest 引导一个完整的 Patroni 集群。但是也有可能使用 pgBackRest 只重新创建一个 Patroni 节点。在这篇博客中,我们将了解我们需要更改的所有内容,以便从备份成功地重新创建节点。
首先,假设我们有一个三节点的 Patroni 设置,使用 etcd 作为键值存储,pgBackRest 用于备份数据库。
postgres@hero2:/home/postgres/ [PG1] patronictl list
+--------+----------------+---------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+ Cluster: PG1 (7166642010148587394) ---------+----+-----------+
| hero1 | 192.168.22.251 | Leader | running | 1 | |
| hero2 | 192.168.22.252 | Replica | running | 1 | 0 |
| hero3 | 192.168.22.253 | Replica | running | 1 | 0 |
+--------+----------------+---------+---------+----+-----------+
postgres@hero2:/home/postgres/ [PG1] etcdctl member list
1c83efe87807cd7b, started, hero2, http://192.168.22.252:2380, http://192.168.22.252:2379, false
b059fedab560f470, started, hero3, http://192.168.22.253:2380, http://192.168.22.253:2379, false
ecee86d6079e2735, started, hero1, http://192.168.22.251:2380, http://192.168.22.251:2379, false
首先,我们检查我们的 pgBackRest 存储库中是否有可用的备份。
postgres@backup_hero:/home/postgres/ [pg14] pgbackrest info
stanza: hero2hero
status: ok
cipher: none
db (current)
wal archive min/max (14): 000000010000000000000001/00000001000000000000000C
full backup: 20221116-165815F
timestamp start/stop: 2022-11-16 16:58:15 / 2022-11-16 16:59:04
wal start/stop: 00000001000000000000000A / 00000001000000000000000C
database size: 105.0MB, database backup size: 105.0MB
repo1: backup set size: 30.8MB, backup size: 30.8MB
因此,当一切看起来都很健康时,我们可以开始更改 Patroni 集群的配置。我们必须分两步进行此更改。
在第一步中使用 edit-conf 编辑配置。在 use_slots 和 retry_timeout 之间添加 recovery_conf 部分。保护您的更改。
postgres@hero2:/home/postgres/ [PG1] patronictl edit-config
use_slots: true
recovery_conf:
restore_command: pgbackrest --stanza=hero2hero archive-get %f %p
restore_target_timeline: latest
retry_timeout: 10
ttl: 30下一步,更改 patroni.yml。我们将 create_replica_methods 添加到文件中。当我们定义 pgbackrest 和 basebackup 时,它将首先尝试从 pgBackRest 重新创建副本,如果这不可能,它将从 master 的 basebackup 重新创建。
此更改至少应在您要使用 pgBackRest 重新创建的节点上完成,但最好在所有三个节点上执行此更改,以确保您在任何情况下都已做好准备。请注意此更改并确保在行的开头添加足够的空格。在参数部分下方添加部分 create_replica_methods。
postgresql:
..
..
parameters:
unix_socket_directories: '/tmp'
create_replica_methods:
- pgbackrest
- basebackup
pgbackrest:
command: pgbackrest --stanza=hero2hero restore
keep_data: True
no_params: True
basebackup:
checkpoint: 'fast'完成所有更改后,您需要重新加载赞助人
sudo systemctl reload patroni现在我们可以销毁一个副本并重新创建它。
postgres@hero2:/home/postgres/ [pg14] sudo systemctl stop patroni
postgres@hero2:/home/postgres/ [pg14] rm -rf /u02/pgdata/14/PG1/*
postgres@hero2:/home/postgres/ [pg14] ls -al /u02/pgdata/14/PG1/
total 0
drwxr-x---. 2 postgres postgres 6 Nov 16 17:16 .
drwxr-x---. 3 postgres postgres 17 Sep 5 10:20 ..
postgres@hero2:/home/postgres/ [pg14] sudo systemctl start patroni
这并没有真正表明副本真的是从 pgBackRest 重新创建的,但是如果我们检查日志文件,我们会得到一条自我解释的消息,即使用了 pgBackRest(见最后一行)
postgres@hero2:/home/postgres/ [pg14] sudo journalctl -u patroni -f
-- Logs begin at Fri 2022-09-16 08:50:46 CEST. --
Nov 16 17:16:37 hero2 systemd[1]: Starting dbi services patroni service...
Nov 16 17:16:37 hero2 systemd[1]: Started dbi services patroni service.
Nov 16 17:16:38 hero2 patroni[38394]: 2022-11-16 17:16:38,085 INFO: Selected new etcd server http://192.168.22.253:2379
Nov 16 17:16:38 hero2 patroni[38394]: 2022-11-16 17:16:38,094 INFO: No PostgreSQL configuration items changed, nothing to reload.
Nov 16 17:16:38 hero2 patroni[38394]: 2022-11-16 17:16:38,116 INFO: Lock owner: hero1; I am hero2
Nov 16 17:16:38 hero2 patroni[38394]: 2022-11-16 17:16:38,120 INFO: trying to bootstrap from leader 'hero1'
Nov 16 17:16:42 hero2 patroni[38394]: 2022-11-16 17:16:42,532 INFO: replica has been created using pgbackrest
..
..
..该行为的实现非常容易且设置起来很快。如前所述,请记住在 patroni.yml 中放置足够的空间,否则不会使用 pgBackRest 创建副本。所以如果你仍然在你的日志文件中看到这个条目
INFO: replica has been created using basebackup
INFO: bootstrapped from leader 'hero1'再次查看您的 patroni.yml!
原文标题:Recreate a Patroni replica using pgBackRest
原文作者:Julia Gugel
原文链接:https://www.dbi-services.com/blog/recreate-a-patroni-replica-using-pgbackrest/




