暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pgBackRest和PostgreSQL 12入门

原创 TOM SWARTZ 2019-11-28
3869

pgBackRest是一种可靠且易于配置的PostgreSQL备份和还原解决方案,它为所有PostgreSQL数据库提供了强大的解决方案;无论是小型项目,还是扩大到企业级用的项目。

pgBackRest包含许多强大的功能,包括并行备份和还原,本地或远程操作,完整增量和差异备份类型,备份轮换,存档到期,备份完整性,页面校验和备份恢复,流压缩和校验,增量还原, 以及更多功能。

随着PostgreSQL 12的最新发行版(以及更新的12.1),pgBackRest还获得了许多更新和更改,以利用Postgres的最新功能。

在下文中,我们将探讨在PostgreSQL 12数据库上配置pgBackRest所涉及的步骤,然后模拟在数据库文件已被破坏的灾难中,并还原备份以重新获得数据库。

设置演示
如果出于指导目的而遵循本指南,则具有相似的工作环境以确保在执行练习时使用相同的设置,命令和过程将非常有用。

对于此示例,我们将在CentOS 7上执行PostgreSQL 12.1和pgBackRest 2.19的安装和配置。

为简单起见,建议使用Hashicorp的Vagrant来启动和管理CentOS 7官方Vagrant Box。

如果使用Vagrant,只需运行:

cd temp_work_dir 
vagrant init centos/7 
vagrant up 
vagrant ssh
复制

另外,您可以使用以下
设置来手动设置和配置虚拟机:

  • 12 GB单分区ext4磁盘
  • 2 GB内存
  • 2个CPU

安装PostgreSQL和pgBackRest
有几种在CentOS 7服务器上安装PostgreSQL的方法,在PostgreSQL Wiki上有详细介绍。就本指南而言,我们将使用PGDG Yum存储库安装PostgreSQL 12和最新版本的pgBackRest。在撰写本文时,PostgreSQL的最新版本是12.1,而pgBackRest是2.19。

sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 
sudo yum -y install postgresql12-server postgresql12-contrib pgbackrest
复制

接下来,使用以下命令初始化PostgreSQL实例:

sudo /usr/pgsql-12/bin/postgresql-12-setup initdb 
sudo systemctl enable postgresql-12.service 
sudo systemctl start postgresql-12.service
复制

第一条命令仅需运行一次,即可负责初始化$PGDATA目录中的数据库。
第二条命令确保PostgreSQL在操作系统启动时将自动启动,而第三条命令将在当前时间启动数据库。

要验证PostgreSQL是否已正确启动,以下命令将确认:

sudo -iu postgres 
psql --version psql (PostgreSQL) 12.1
复制

接下来,以默认用户或用户身份运行以下命令,以验证pgBackRest是否已正确安装postgres:

$ pgbackrest 
pgBackRest 2.19 - General help 
Usage: 
    pgbackrest [options] [command] 
    
Commands: 
     archive-get     Get a WAL segment from the archive. 
     archive-push    Push a WAL segment to the archive. 
     backup          Backup a database cluster. 
     check           Check the configuration. 
     expire          Expire backups that exceed retention. 
     help            Get help. 
     info            Retrieve information about backups. 
     restore         Restore a database cluster. 
     stanza-create   Create the required stanza data. 
     stanza-delete   Delete a stanza. 
     stanza-upgrade  Upgrade a stanza. 
     start           Allow pgBackRest processes to run. 
     stop            Stop pgBackRest processes from running. 
     version         Get version. 
     
 Use 'pgbackrest help [command]' for more information.
复制

确保基本命令返回有效的响应和期望的版本通常是一个好的做法,因为它可以确保软件正常运行并且版本彼此兼容。

配置PostgreSQL
根据您的特定用例,您可能需要配置PostgreSQL的选项来满足您特定的环境需求。

可能的考虑因素是:

  • 使用复制或配置集群
  • 备份的存储方式(使用3-2-1方法?)
  • 数据库的安全问题
    出于此练习的目的,我们将遵循一个非常简单的模型,该模型将在演示过程中发挥最佳作用,但不适用于生产环境。
    例如,如果您希望将环境配置为具有副本PostgreSQL实例,则可以在这些Crunchy Blog Post中找到更多信息。

为了简单起见,我们将以最少的更改数量配置PostgreSQL ,以使工作模型最小。
如果您不知道配置文件在PostgreSQL主机上的位置,则可以运行以下命令:

sudo -iu postgres psql -U postgres -c 'SHOW config_file' 
config_file 
---------------------------------------- 
/var/lib/pgsql/12/data/postgresql.conf 
(1 row)
复制

在您首选的文本编辑器中以root权限编辑postgresql.conf文件。需要定义以下参数:

listen_addresses = '*' 
# Optionally, define the address as the host IP: 
listen_addresses = '10.0.1.1' 
password_encryption=’scram-sha-256’ 
archive_mode = on
复制

关于配置的PostgreSQL设置的简要介绍最好的做法是了解对数据库进行的配置更改。为了演示的目的,将三个选项从其默认值更改了,并且知道为什么会发生这一点很重要。

listen_addresses:
虽然PostgreSQL的pg_hba.conf负责限制文件的连接,当listen_addresses设置为*(通配符),可以发现在打开的端口5432使用nmap和学习的数据库存在,从而可能打开服务器注册一个漏洞。将其设置为IP地址可防止PostgreSQL监听意外的接口,从而防止这种潜在的利用。有关此特定攻击媒介以及如何避免它的更多信息,请参见此博客文章。

password_encryption注意:
从PostgreSQL 10发行版开始SCRAM-SHA-256 authentication就可以使用,并且在本示例中用于鼓励数据库安全连接的显式目的。具体来说,这种身份验证方法可防止对不可信连接进行密码嗅探,并以安全方式为服务器上的密码哈希密码提供支持。

archive_mode:
另外除了最新版本的PostgreSQL,开始与PostgreSQL的10个主要版本中,进行了更改,以减少这是必要的配置编辑的数量来进行流式备份和复制(特别是影响参数wal_level,max_wal_senders,max_replication_slots,和hot_standby-这些都是现在都默认置)。有关此更改的发行说明可以在此处找到。

对PostgreSQL配置文件进行更改后,请重新启动服务以使更改生效。在这种特定情况下,必须重新启动,因为所有更改的值都特别需要PostgreSQL服务停止并重新启动。

sudo systemctl restart postgresql-12.service
复制

通过运行以下命令,可以检查配置值是否已正确应用于数据库:

sudo -iu postgres psql
SELECT name,setting,context,source FROM pg_settings WHERE NAME IN ('listen_addresses','archive_mode','password_encryption'); 
      name           |  setting          |    context   |    source 
---------------------+---------------+------------+-------------------- 
archive_mode         |   on              |   postmaster | configuration file 
listen_addresses     |   *               | postmaster   | configuration file 
password_encryption  | scram-sha-256     | user         | configuration file 
(3 rows)
复制

使用\q到退出psql的提示。

配置pgBackRest
为pgBackRest备份存储库配置一个位置:

sudo mkdir -p /var/lib/pgbackrest 
sudo chmod 0750 /var/lib/pgbackrest 
sudo chown -R postgres:postgres /var/lib/pgbackrest

复制

在pgbackrest日志位置上配置位置和权限:

sudo chown -R postgres:postgres /var/log/pgbackrest
复制

接下来,修改pgBackRest的配置文件以满足环境的需求。

最佳做法是,首先创建任何现有pgbackrest.conf文件的备份:

sudo cp /etc/pgbackrest.conf /etc/pgbackrest.conf.backup
复制

生成一个安全,长而随机的密码来加密存储库:

openssl rand -base64 48
复制

此生成的值将用作repo1-cipher-pass选项。注:一旦配置了存储库并创建并检查了节,就无法更改存储库加密设置。接下来,pgbackrest.conf以根用户身份编辑文件,输入以下参数:

[global]
repo1-cipher-pass=uUQsaa7+CCFaqXVagFzNUix3XuLe9e2uqVskqfI6wcKf8BX8y5b+8bL3oimRpV1N
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
log-level-console=info
log-level-file=debug

[demo]
pg1-path=/var/lib/pgsql/12/data
复制

本[global]部分定义了备份的位置,日志记录设置和加密设置。该[demo]部分定义了一节demo备份库中,我们将配置。与PostgreSQL设置一样,最佳实践鼓励理解配置选项。在pgBackRest配置指南中可以找到关于这些配置选项的更多信息。
最后,初始化pgBackRest节,其中包含位置的定义,归档选项,备份设置以及PostgreSQL数据库集群的其他类似配置。通常,为每个需要备份的数据库集群定义一个节。配置该stanza-create命令后,必须在主要主机上运行该命令pgbackrest.conf。

sudo -u postgres pgbackrest --stanza=demo stanza-create 

2019-11-15 18:08:57.158 P00      INFO: stanza-create command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=demo 
2019-11-15 18:08:57.609 P00      INFO: stanza-create command end: completed successfully (455ms)
复制

整合在一起,执行首次备份

现在已经分别配置了PostgreSQL和pgBackRest,必须执行一些最后的步骤将它们绑在一起并执行备份过程。
首先,postgresql.conf再次编辑文件,然后配置archive_command:

archive_command = 'pgbackrest --stanza=demo archive-push %p'

复制

该配置选项通知PostgreSQL使用pgBackRest处理WAL段,将它们立即推送到归档文件中。在对配置文件进行此更改之后,重新加载PostgreSQL服务:

sudo systemctl reload postgresql-12.service
复制

接下来,我们将使用pgBackRest检查集群。这验证了pgBackRest和archive_command设置均已正确配置并按预期执行。

sudo -iu postgres pgbackrest --stanza=demo check 
2019-11-15 18:10:03.637 P00      INFO: check command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=demo 
2019-11-15 18:10:04.757 P00      INFO: WAL segment 000000010000000000000001 successfully archived to '/var/lib/pgbackrest/archive/demo/12-1/0000000100000000/000000010000000000000001-bddaecf52ba8c3dd83e6157fea6a4dbeb6476010.gz' 
2019-11-15 18:10:04.757 P00      INFO: check command end: completed successfully (1120ms)
复制

如果此命令产生任何错误,请阅读并检查输出,以获取有关如何解决特定问题的建议。
现在,经过多番努力;执行完整备份:

sudo -u postgres pgbackrest --stanza=demo --type=full backup 

2019-11-15 18:10:32.421 P00      INFO: backup command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanz a=demo --type=full 
2019-11-15 18:10:33.555 P00      INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-11-15 18:10:32": backup begins after the next regular checkpoint completes 2019-11-15 18:10:33.758 P00 INFO: backup start archive = 000000010000000000000003, lsn = 0/3000028 
2019-11-15 18:10:35.930 P01      INFO: backup file /var/lib/pgsql/12/data/base/14187/1255 (632KB, 2%) checksum 60325e5cd07379af0ffe91eea27cfd4f2f07af69 [...] 2019-11-15 18:10:38.818 P00 INFO: full backup size = 24.2MB 2019-11-15 18:10:38.818 P00           INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive 
2019-11-15 18:10:38.920 P00      INFO: backup stop archive = 000000010000000000000003, lsn = 0/3000138 
2019-11-15 18:10:39.235 P00      INFO: new backup label = 20191115-181032F 
2019-11-15 18:10:39.286 P00      INFO: backup command end: completed successfully (6866ms)

复制

最后,确认备份正常工作:

sudo -u postgres pgbackrest info 

stanza: demo 
    status: ok 
    cipher: aes-256-cbc 

    db (current) 
        wal archive min/max (12-1): 000000010000000000000003/000000010000000000000003 

        full backup: 20191115-181032F 
            timestamp start/stop: 2019-11-15 18:10:32 / 2019-11-15 18:10:39 
            wal start/stop: 000000010000000000000003 / 000000010000000000000003 
            database size: 24.2MB, backup size: 24.2MB 
            repository size: 2.9MB, repository backup size: 2.9MB

复制

还原备份

现在,已在全新数据库上执行了完整备份,测试从完整备份中还原是否有用。

为此,请停止PostgreSQL实例,并删除其数据文件,以模拟系统管理灾难。

sudo systemctl stop postgresql-12.service 
sudo find /var/lib/pgsql/12/data -mindepth 1 -delete
复制

此时,尝试启动数据库将导致失败:

sudo systemctl start postgresql-12.service 
## THIS WILL FAIL 

Job for postgresql-12.service failed because the control process exited with error code. See "systemctl status postgresql-12.service" and "journalctl -xe" for details.
复制

在数据库上执行还原:

sudo -iu postgres pgbackrest --stanza=demo --delta restore
复制

还原完成后,数据库将按预期启动:

sudo systemctl start postgresql-12.service
复制

您可以验证pgBackRest是否仍在工作:

sudo -u postgres pgbackrest --stanza=demo check 

2019-11-15 18:13:56.707 P00      INFO: check command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=demo 
2019-11-15 18:13:57.594 P00      INFO: WAL segment 000000020000000000000005 successfully archived to '/var/lib/pgbackrest/archive/demo/12-1/0000000200000000/000000020000000000000005-bd01dc079338748cd9772a7c324eed0d68d45a9c.gz' 
2019-11-15 18:13:57.594 P00      INFO: check command end: completed successfully (887ms)
复制

在发生任何灾难实例之后,始终最好的做法是使用新的备份来跟踪所有还原:

sudo -u postgres pgbackrest --stanza=demo --type=full backup
复制

结论
总之,pgBackRest提供了大量的可能性和用例。安装,配置和使用非常简单,可通过WAL归档简化时间点恢复。如果发生任何灾难,确保备份有效就可以放心。

最后修改时间:2019-11-28 11:37:21
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论