使用pgbackrest进行Postgresql增量式备份-开发人员提供的年轻战斗机课程

免责声明

我是开发人员。 我编写代码,仅以用户身份与数据库进行交互。 我决不假装自己是系统管理员,尤其是dba。 但是...

碰巧我需要组织一个postgresql数据库的备份。 没有云-保持SSH并使一切正常运行,而不是要钱。 在这种情况下我们该怎么办? 没错,我们将pgdump推送到cron中,每天将所有内容备份到存档中,如果我们已经完全分散了,我们会将存档发送到某个地狱。

这次,困难在于根据计划,该基础应该以每天约+-100 MB的速度增长。 当然,在几周内,使用pgdump备份所有内容的愿望将消失。 在这里,增量备份可以解决。

有意思吗 欢迎来到猫。

增量备份是一种备份类型,当并非所有源文件都被备份时,而是自创建上一个备份以来仅进行新的和更改的备份。
像任何开发人员一样,当时完全不希望(当时)了解postgres的复杂性,我想找到一个绿色按钮。 好吧,您知道,就像在AWS中一样,DigitalOcean:单击一个按钮-获得复制,单击第二个按钮-设置备份,第三个按钮-几个小时前回滚。 我还没有找到按钮和漂亮的GUI工具。 如果您知道(免费或廉价),请在评论中写下。

谷歌搜索,我发现了两个工具pgbarmanpgbackrest 。 我只是对第一个没有问题(非常贫乏的文档,我试图根据旧手册来完善所有内容),但是第二个却在水平上,但并非没有缺陷。 为了简化那些面临类似任务的人员的工作,本文已写成。
阅读本文之后,您将学习如何进行增量备份,将其保存到远程服务器(带有备份的存储库)中,并在数据丢失或主服务器上出现其他问题时还原它们。

准备工作


要播放该手册,您将需要两个VPS。 第一个是存储库(将在其中放置备份的存储库),第二个实际上是具有postgres的服务器本身(在我的情况下,是postgres的版本11)。

假定在具有postgres的服务器上您具有root,sudo用户,postgres用户和postgres本身(安装了postgresql时将自动创建postgres用户),并且在存储库服务器上有root和sudo用户(用户名pgbackrest将在手册中使用) 。

这样,您在重现指令时就不会遇到太多问题-用斜体字写下在编写和检查文章时执行命令的位置,对象,对象和权限

安装pgbackrest


存储库(用户pgbackrest):

1.使用pgbackrest下载档案,并将其内容传输到/ build文件夹:

sudo mkdir /build sudo wget -q -O - \ https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | \ sudo tar zx -C /build 

2.安装程序集所需的依赖项:

 sudo apt-get update sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \ libpq-dev 

3.我们收集pgbackrest:

 cd /build/pgbackrest-release-2.18/src && sudo ./configure sudo make -s -C /build/pgbackrest-release-2.18/src 

4.将可执行文件复制到/ usr / bin目录:

 sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin sudo chmod 755 /usr/bin/pgbackrest 

5. Pgbackrest需要perl。 安装:

 sudo apt-get install perl 

6.为日志创建目录,并赋予它们特定的权限:

 sudo mkdir -p -m 770 /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo mkdir -p /etc/pgbackrest sudo mkdir -p /etc/pgbackrest/conf.d sudo touch /etc/pgbackrest/pgbackrest.conf sudo chmod 640 /etc/pgbackrest/pgbackrest.conf sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

7.检查:

 pgbackrest version 

Postgres服务器(sudo用户或root):

在使用postgres的服务器上安装pgbackrest的过程与在存储库上安装的过程类似(是的,pgbackrest应该在两个服务器上都可以), 但是在第6段中,第二个也是最后一个命令:

 sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

替换为:

 sudo chown postgres:postgres /var/log/pgbackrest sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf 

通过无密码SSH配置服务器之间的通信


为了使pgbackrest正常工作,您需要使用密钥文件配置postgres服务器和存储库之间的交互。

存储库(用户pgbackrest):

创建一个密钥对:

 mkdir -m 750 /home/pgbackrest/.ssh ssh-keygen -f /home/pgbackrest/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

注意! 我们在没有sudo的情况下执行上述命令。

Postgres服务器(sudo用户或root):

创建一个密钥对:

 sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

存储库(sudo用户):

将postgres服务器的公钥复制到存储库服务器:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | \ sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys 

在这一步,将要求root用户输入密码。 您需要输入postgres服务器用户的root密码!

Postgres服务器(sudo用户):

使用postgres将存储库的公钥复制到服务器:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | \ sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys 

在这一步,将要求root用户输入密码。 您需要输入存储库用户的根密码!

我们检查:

存储库(root用户,出于实验的纯正性):

 sudo -u pgbackrest ssh postgres@<postgres_server_ip> 

Postgres服务器(root用户,出于纯粹的实验目的):

 sudo -u postgres ssh pgbackrest@<repository_server_ip> 

我们确保获得访问权限没有问题。

设置postgres服务器



Postgres服务器(sudo用户或root):

1.让我们从外部IP“敲响” postgres服务器。 为此,请编辑postgresql.conf文件(位于/ etc / postgresql / 11 / main文件夹中),并在其中添加以下行:

 listen_addresses = '*' 

如果已经存在这样的行,请取消注释它或将参数值设置为“ *”。

pg_hba.conf文件 (也位于/ etc / postgresql / 11 / main文件夹中)中,添加以下行:

 hostssl all all 0.0.0.0/0 md5 host all all 0.0.0.0/0 md5 

其中:

 hostssl/host -   SSL ( ) all -      all -  ,    () 0.0.0.0/0 -       md5 -    

2.在postgresql.conf (位于文件夹/ etc / postgresql / 11 / main中 )中进行必要的设置,以使pgbackrest能够正常工作:

 archive_command = 'pgbackrest --stanza=main archive-push %p' #  main -  .   postgres    main. archive_mode = on max_wal_senders = 3 wal_level = replica 

3.在pgbackrest配置文件(/etc/pgbackrest/pgbackrest.conf)中进行必要的设置:

 [main] pg1-path=/var/lib/postgresql/11/main [global] log-level-file=detail repo1-host=<repository_server_ip> 

4.重新启动PostgreSQL:

 sudo service postgresql restart 

配置存储库服务器


仓库(pgbackrest用户):

pgbackrest配置文件中进行必要的设置
/etc/pgbackrest/pgbackrest.conf ):

 [main] pg1-host=<postgres_server_ip> pg1-path=/var/lib/postgresql/11/main [global] repo1-path=/var/lib/pgbackrest repo1-retention-full=2 # ,     . ..            -       . start-fast=y #    ,       https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving 

创建存储


仓库(pgbackrest用户):

为主集群创建一个新的存储:

 sudo mkdir -m 770 /var/lib/pgbackrest sudo chown -R pgbackrest /var/lib/pgbackrest/ sudo -u pgbackrest pgbackrest --stanza=main stanza-create 

检查一下


Postgres服务器(sudo用户或root):

检查postgres服务器:

 sudo -u postgres pgbackrest --stanza=main --log-level-console=info check 

仓库(pgbackrest用户):

检查存储库服务器:

 sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check 

我们确保在输出中看到“检查命令结束:成功完成”行。

你累吗 我们传递给最有趣的。

进行备份


仓库(pgbackrest用户):


1.我们进行备份:

 sudo -u pgbackrest pgbackrest --stanza=main backup 

2.我们确保已创建备份:

 ls /var/lib/pgbackrest/backup/main/ 

Pgbackrest将创建第一个完整备份。 如果愿意,可以再次运行backup命令,并确保系统创建了增量备份。

如果要再次进行完整备份,请指定其他标志:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full backup 

如果要向控制台输出详细信息,请指定:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup 

恢复备份


Postgres服务器(sudo用户或root):

1.停止工作集群:

 sudo pg_ctlcluster 11 main stop 

2.我们从备份中恢复:

 sudo -u postgres pgbackrest --stanza=main --delta restore 

3.运行集群:

 sudo pg_ctlcluster 11 main start 

还原备份后,我们需要执行第二次备份:

仓库(pgbackrest用户):

 sudo pgbackrest --stanza=main backup 

仅此而已。 最后,我想提醒您,无论如何我都不打算自己建立一个高级dba,并且在任何机会下,我都将使用云。 目前,我本人已开始研究各种主题,例如备份,复制,监视等。 我就结果编写了一些小型报告,以便为社区做出一点贡献,并为我自己留些小婴儿床。

在以下文章中,我将尝试讨论其他功能-干净群集上的数据恢复,备份加密和在S3上发布,通过rsync备份。

Source: https://habr.com/ru/post/zh-CN476206/


All Articles