作者简介
DAVID STEELE 工程师
译者简介
王志斌,从事数据库产品相关工作,主要致力于postgresql数据库产品化工作。
校对者简介
崔鹏 海能达高级PostgreSQL DBA,PG爱好者。
pgBackRest团队很高兴地宣布在v2.33中引入了多存储库支持。通过创建可用于灾难恢复的PostgreSQL集簇的离线副本来提供冗余备份。多个存储库允许在不同的位置拥有备份和WAL存档的副本,以增加冗余备份并为您的数据提供更多的保护。此功能是几个月辛勤工作的结晶,因此让我们深入探讨为什么多个存储库如此重要以及它们如何帮助保护您的数据。
配置
最多可以配置四个存储库,每个存储库可以是任何存储库类型,例如S3或Posix。下面的配置定义了两个存储库。repo1是Posix并存储在本地安装的NFS卷上;以防发生灾难repo2存储库应始终位于PostgreSQL服务器之外。repo2存储在Azure上。
$ cat /etc/pgbackrest/pgbackrest.conf
[demo]
pg1-path=/var/lib/postgresql/13/demo
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo2-type=azure
repo2-azure-account=pgbackrest
repo2-azure-container=demo-container
repo2-azure-key=YXpLZXk=
repo2-path=/demo-repo
repo2-retention-full=8
请注意每个存储库上的保留配置都不同。repo1具有较短的保留时间以节省空间,但仍然在本地存储上提供多个备份和大量 WAL,访问既快速又便宜(就带宽成本而言)。具有更长的保留时间并存储在Azure 中,虽然存储便宜但检索数据比repo1又慢又贵,所以repo2既是出现问题时的故障保护,也是从远程站点恢复备份的资源。
pgBackRest对于执行某些命令(如 restore 和 archive-get),认为repo1比repo2具有更高的优先级。通常编号较低的存储库应该比编号较高的存储库更快和/或更便宜。
使用
现在运行stanza-create来配置仓库,将在每个仓库上初始化demo段。
$ pgbackrest --stanza=demo stanza-create
<...>
INFO: stanza-create for stanza 'demo' on repo1
INFO: stanza-create for stanza 'demo' on repo2
<...>
每个仓库都被初始化,并运行check命令来确保每个仓库可以正常工作,注意wal段文件被推送到了每个仓库中。
$ pgbackrest --stanza=demo check
<...>
INFO: check repo1 configuration (primary)
INFO: check repo2 configuration (primary)
INFO: check repo1 archive for WAL (primary)
INFO: WAL segment 000000010000000000000003 successfully archived to '/var/lib/pgbackrest/archive/demo/13-1/0000000100000000/000000010000000000000003-c981b4ddc8c1437c539eda05427a6aa454a0923e.gz' on repo1
INFO: check repo2 archive for WAL (primary)
INFO: WAL segment 000000010000000000000003 successfully archived to '/demo-repo/archive/demo/13-1/0000000100000000/00000001000000000000000
现在应该为每个存储库运行备份。大多数命令在所有存储库上自动运行,但是备份需要指定存储库。每个repo可能有不同的保留和备份计划,因此备份应该独立运行。
$ pgbackrest --stanza=demo --repo=1 backup
$ pgbackrest --stanza=demo --repo=2 backup
存储库的信息以统一的方式显示,组织单位是段。这样一个段的所有备份可以一起看到,并且最近的备份很容易识别,因为列表是从最旧到最新排序的。
$ pgbackrest info
stanza: demo
status: ok
cipher: none
db (current)
wal archive min/max (13): 000000010000000000000003/000000010000000000000006
full backup: 20210331-155726F
timestamp start/stop: 2021-03-31 15:57:26 / 2021-03-31 15:57:30
wal start/stop: 000000010000000000000005 / 000000010000000000000005
database size: 23.1MB, database backup size: 23.1MB
repo1: backup set size: 2.8MB, backup size: 2.8MB
full backup: 20210331-155736F
timestamp start/stop: 2021-03-31 15:57:36 / 2021-03-31 15:57:41
wal start/stop: 000000010000000000000006 / 000000010000000000000006
database size: 23.1MB, database backup size: 23.1MB
repo2: backup set size: 2.8MB, backup size: 2.8MB
如果只想获得某个仓库信息,需要指定--repo选项。
$ pgbackrest --repo=2 info
stanza: demo
status: ok
cipher: none
db (current)
wal archive min/max (13): 000000010000000000000003/000000010000000000000006
full backup: 20210331-155736F
timestamp start/stop: 2021-03-31 15:57:36 / 2021-03-31 15:57:41
wal start/stop: 000000010000000000000006 / 000000010000000000000006
database size: 23.1MB, database backup size: 23.1MB
repo2: backup set size: 2.8MB, backup size: 2.8MB
当进行还原的时候,pgBackRest 将根据您的条件自动从存储库中选择最佳备份。示例是基于时间点还原的:
pgbackrest --stanza=demo --delta --type=time --target="2021-03-31 15:57:31-04" restore
<...>
INFO: repo1: restore backup set 20210331-155726F
<...>
在这种情况下,由于时间限制,只有来自repo1的备份是有效的。即使指定了更晚的时间,这似乎有利于repo2中的更晚备份,也会选择repo1中的相同备份。这是因为pgBackRest 倾向于选择优先级较高的备份,即repo1优于repo2,前提是它比优先级较低的存储库更快和/或更便宜。
如果要从特定存储库进行恢复,只需使用--repo指定首选存储库即可。为恢复生成的archive-get 命令将始终按优先级顺序搜索所有存储库中的WAL段。
结论
为了实现更多冗余、成本节约和性能改进的要求,允许多个存储库。其中允许一个仓库在PostgreSQL集簇附近,同时还允许其他存储库安全地位于云中或其他数据中心。
有关多存储库支持的更多信息,请参阅《用户指南》。
PostgreSQL中文社区欢迎广大技术人员投稿
投稿邮箱:press@postgres.cn