Backups incrementais do Postgresql com pgbackrest - um curso de lutador jovem do desenvolvedor

Isenção de responsabilidade

Eu sou desenvolvedor. Escrevo código, interajo com o banco de dados apenas como usuário. Em nenhum caso pretendo ser um administrador de sistemas e, principalmente, dba. Mas ...

Aconteceu que eu precisava organizar um backup do banco de dados postgresql. Sem nuvens - mantenha o SSH, faça-o funcionar e não peça dinheiro. O que fazemos nesses casos? É isso mesmo, colocamos o pgdump no cron, todos os dias fazemos backup de tudo no arquivo e, se estivermos completamente dispersos, enviamos esse arquivo para o inferno.

Desta vez, a dificuldade era que, de acordo com os planos, a base deveria crescer cerca de + - 100 MB por dia. Obviamente, em algumas semanas, o desejo de fazer backup de tudo com o pgdump desaparecerá. Aqui os backups incrementais vêm em socorro.

Interessante? Bem-vindo ao gato.

O backup incremental é um tipo de backup quando nem todos os arquivos de origem são copiados, mas apenas novos e alterados desde que o backup anterior foi criado.
Como qualquer desenvolvedor, TOTALMENTE não querendo (naquela época) entender os meandros do postgres, eu queria encontrar um botão verde. Bem, como na AWS, o DigitalOcean: clicou em um botão - obteve replicação, clicou no segundo - configure backups, no terceiro - ele retrocedeu algumas horas atrás. Botões e uma bela ferramenta GUI que não encontrei. Se você sabe disso (grátis ou barato) - escreva sobre isso nos comentários.

Pesquisando, encontrei duas ferramentas pgbarman e pgbackrest . Só não tive problemas com o primeiro (documentação muito ruim, tentei elevar tudo de acordo com os manuais antigos), mas o segundo acabou por estar no nível, mas não sem falhas. Para simplificar o trabalho para aqueles que se deparam com uma tarefa semelhante e este artigo foi escrito.
Depois de ler este artigo, você aprenderá como fazer backups incrementais, salvá-los em um servidor remoto (um repositório com backups) e restaurá-los em caso de perda de dados ou outros problemas no servidor principal.

Preparação


Para reproduzir o manual, você precisará de dois VPS. O primeiro será o repositório (o repositório no qual os backups estarão) e o segundo, de fato, o próprio servidor com o postgres (no meu caso, a versão 11 do postgres).

Supõe-se que no servidor com postgres você tenha root, usuário sudo, usuário postgres e o próprio postgres esteja instalado (o usuário postgres é criado automaticamente quando o postgresql é instalado) e no servidor de repositório há usuário root e sudo (o nome de usuário pgbackrest será usado no manual) .

Para que você tenha menos problemas ao reproduzir as instruções - em itálico, anote onde, por qual usuário e com quais direitos eu executei o comando enquanto escrevia e verificava o artigo.

Instalar pgbackrest


Repositório (usuário pgbackrest):

1. Faça o download do arquivo morto com pgbackrest e transfira seu conteúdo para a pasta / 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. Instale as dependências necessárias para a montagem:

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

3. Coletamos pgbackrest:

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

4. Copie o arquivo executável para o diretório / usr / bin:

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

5. Pgbackrest requer perl. Instalar:

 sudo apt-get install perl 

6. Crie diretórios para logs, dê a eles direitos específicos:

 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. Verifique:

 pgbackrest version 

Servidor Postgres (usuário sudo ou root):

O processo de instalação do pgbackrest em um servidor com postgres é semelhante ao processo de instalação em um repositório (sim, o pgbackrest deve estar nos dois servidores), mas no sexto parágrafo, o segundo e o último comando:

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

substitua por:

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

Configurando a comunicação entre servidores via SSH sem senha


Para que o pgbackrest funcione corretamente, você precisa configurar a interação entre o servidor postgres e o repositório usando o arquivo-chave.

Repositório (usuário pgbackrest):

Crie um par de chaves:

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

Atenção! Nós executamos os comandos acima sem sudo.

Servidor Postgres (usuário sudo ou root):

Crie um par de chaves:

 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 "" 

Repositório (usuário sudo):

Copie a chave pública do servidor postgres para o servidor do repositório:

 (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 

Nesta etapa, solicitará a senha do usuário root. Você precisa digitar a senha root do usuário do servidor postgres!

Servidor Postgres (usuário sudo):

Copie a chave pública do repositório para o servidor com o 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 

Nesta etapa, solicitará a senha do usuário root. Você precisa digitar a senha root do usuário do repositório!

Verificamos:

Repositório (usuário root, para a pureza do experimento):

 sudo -u pgbackrest ssh postgres@<postgres_server_ip> 

Servidor Postgres (usuário root, para a pureza do experimento):

 sudo -u postgres ssh pgbackrest@<repository_server_ip> 

Garantimos o acesso sem problemas.

Configurando o servidor postgres



Servidor Postgres (usuário sudo ou root):

1. Vamos "bater" no servidor postgres a partir do ip externo. Para fazer isso, edite o arquivo postgresql.conf (localizado na pasta / etc / postgresql / 11 / main), adicionando a linha a ele:

 listen_addresses = '*' 

Se essa linha já existir, remova o comentário ou defina o valor do parâmetro como '*'.

No arquivo pg_hba.conf (também localizado na pasta / etc / postgresql / 11 / main ), adicione as seguintes linhas:

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

onde:

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

2. Faça as configurações necessárias no postgresql.conf (ele está localizado na pasta / etc / postgresql / 11 / main ) para que o pgbackrest funcione:

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

3. Faça as configurações necessárias no arquivo de configuração pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

4. Reinicie o postgresql:

 sudo service postgresql restart 

Configurando um Servidor de Repositório


Repositório (usuário pgbackrest):

Faça as configurações necessárias no arquivo de configuração 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 

Criação de armazenamento


Repositório (usuário pgbackrest):

Crie um novo armazenamento para o cluster principal :

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

Verifique


Servidor Postgres (usuário sudo ou root):

Verifique no servidor postgres:

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

Repositório (usuário pgbackrest):

Verifique no servidor do repositório:

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

Garantimos que, na saída, vejamos a linha "check command end: complete successful".

Esta cansado Passamos para o mais interessante.

Faça backup


Repositório (usuário pgbackrest):


1. Realizamos backup:

 sudo -u pgbackrest pgbackrest --stanza=main backup 

2. Garantimos que o backup foi criado:

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

O Pgbackrest criará o primeiro backup completo. Se desejar, você pode executar o comando backup novamente e verifique se o sistema cria um backup incremental.

Se você deseja fazer um backup completo novamente, especifique um sinalizador adicional:

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

Se você deseja uma saída detalhada para o console, especifique também:

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

Restaurar backup


Servidor Postgres (usuário sudo ou root):

1. Pare o cluster de trabalho:

 sudo pg_ctlcluster 11 main stop 

2. Nós recuperamos do backup:

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

3. Execute o cluster:

 sudo pg_ctlcluster 11 main start 

Após restaurar o backup, precisamos executar um segundo backup:

Repositório (usuário pgbackrest):

 sudo pgbackrest --stanza=main backup 

Só isso. Concluindo, quero lembrá-lo de que em nenhum caso estou tentando construir um dba sênior e, na menor oportunidade, usarei nuvens. Atualmente, eu mesmo estou começando a estudar vários tópicos, como backup, replicação, monitoramento etc. e escrevo pequenos relatórios sobre os resultados, a fim de dar uma pequena contribuição à comunidade e deixar pequenos berços para mim.

Nos artigos a seguir, tentarei falar sobre recursos adicionais - recuperação de dados em um cluster limpo, criptografia de backups e publicação no S3, backups via rsync.

Source: https://habr.com/ru/post/pt476206/


All Articles