Backups incrementais do postgresql com pgbackrest — o curso do novato desenvolvido pelo programador

Isenção de responsabilidade

Sou programador. Escrevo código e interajo com o banco de dados apenas como usuário. De jeito nenhum eu pretendo ser um administrador de sistemas e muito menos um DBA. Mas...

Acontece que eu precisava organizar o backup de um banco de dados postgresql. Nada de nuvens — só SSH e fazer tudo funcionar sem pedir dinheiro. O que fazemos nesses casos? Certo, colocamos o pgdump no cron, fazemos o backup diário para um arquivo e, se tudo correr mal — enviamos esse arquivo para bem longe.

Desta vez, a dificuldade residia no fato de que, de acordo com os planos, o banco deveria crescer aproximadamente 100 MB por dia. Obviamente, em algumas semanas o desejo de fazer backup com pgdump iria desaparecer. Aqui, os backups incrementais entram em cena.

Interessado? Bem-vindo ao conteúdo detalhado.

Backup incremental — um tipo de cópia de segurança em que não todos os arquivos de origem são copiados, mas apenas os novos e alterados desde a criação da cópia anterior.

Como qualquer desenvolvedor, TOTALMENTE relutante (naquele momento) em entender as complexidades do postgres, eu queria encontrar um botão verde. Você sabe, como na AWS, DigitalOcean: pressionou um botão — obteve replicação, pressionou o segundo — configurou backups, e o terceiro — reverteu tudo para algumas horas atrás. Não consegui encontrar nem botoes nem uma ferramenta bonita com GUI. Se você souber de uma (gratuita ou barata) — deixe um comentário.

Depois de pesquisar, encontrei duas ferramentas pgbarman e pgbackrest. Com a primeira eu simplesmente não consegui (documentação muito escassa, tentei subir tudo com manuais antigos), mas a segunda tinha uma documentação razoável, embora com falhas. Para facilitar o trabalho de quem enfrentar uma tarefa semelhante, escrevi este artigo.

Ao ler este artigo, você aprenderá a fazer backups incrementais, armazená-los em um servidor remoto (repositório de backups) e restaurá-los em caso de perda de dados ou outros problemas no servidor principal.

Preparação

Para seguir o manual, você precisará de dois VPS. O primeiro será o armazenamento (repositório onde os backups estarão), e o segundo, o servidor com postgres (no meu caso, versão 11 do postgres).

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

Para que você tenha menos problemas ao reproduzir a instrução — em itálico eu indico onde, com qual usuário e com quais permissões eu executei o comando durante a redação e verificação do artigo.

Instalação do pgbackrest

Repositório (usuário pgbackrest):

1. Baixe o arquivo compactado com pgbackrest e mova 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 construção:

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

3. Construa o 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. O pgbackrest requer a presença do perl. Instale:

sudo apt-get install perl

6. Crie diretórios para logs, atribua permissões específicas a eles:

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 no servidor com postgres é semelhante ao processo de instalação no repositório (sim, o pgbackrest deve estar em ambos os servidores), mas no 6º ponto, os dois últimos comandos:

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

substituímos por:

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

Configuração da interação entre os servidores via SSH sem senha

Para que o pgbackrest funcione corretamente, é necessário configurar a interação entre o servidor postgres e o repositório usando um 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! Os comandos acima devem ser executados 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-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@ cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Nesta etapa, você será solicitado a fornecer a senha do usuário root. Você deve inserir exatamente a senha do usuário root do servidor PostgreSQL!

Servidor Postgres (usuário sudo):

Copiamos a chave pública do repositório no servidor com PostgreSQL:

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

Nesta etapa, você será solicitado a fornecer a senha do usuário root. Você deve inserir exatamente a senha do usuário root do repositório!

Verificamos:

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

sudo -u pgbackrest ssh postgres@

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

sudo -u postgres ssh pgbackrest@

Certifique-se de que o acesso seja feito sem problemas.

Configuração do servidor PostgreSQL

Servidor Postgres (usuário sudo ou root):

1. Permitiremos o acesso ao servidor PostgreSQL a partir de IPs externos. Para isso, editaremos o arquivo postgresql.conf (localizado na pasta /etc/postgresql/11/main), adicionando a seguinte linha:

listen_addresses = '*'

Se tal linha já existir — comente-a ou defina o parâmetro como ‘*’.

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

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

onde:

hostssl/host - conectando via SSL (ou não)
all - permitindo conexão a todos os bancos
todos - nome do usuário, a quem autorizamos a conexão (a todos)
0.0.0.0/0 - máscara da rede a partir da qual é permitido conectar
md5 - método de criptografia da senha

2. Faremos as configurações necessárias em postgresql.conf (localizado na pasta /etc/postgresql/11/main) para o funcionamento do pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Onde main é o nome do cluster. Ao instalar o PostgreSQL, automaticamente é criado o cluster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

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

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=

4. Reinicie o postgresql:

sudo service postgresql restart

Configuração do servidor de repositório

Repositório (usuário pgbackrest):

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

[main]
pg1-host=
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Parâmetro que indica quantos backups completos armazenar. Ou seja, se você tiver dois backups completos e criar um terceiro, os dois primeiros serão excluídos junto com os incrementais.
start-fast=y # Inicia o backup imediatamente, leia sobre este parâmetro aqui https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Criar repositório

Repositório (usuário pgbackrest):

Estamos criando um novo repositório para o cluster main:

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

Verificação

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-repositório:

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

Certifique-se de que na saída vemos a linha 'check command end: completed successfully'.

Cansado? Vamos para a parte mais interessante.

Fazendo backup

Repositório (usuário pgbackrest):

1. Execute o backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Verifique se o backup foi criado:

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

Pgbackrest criará o primeiro backup completo. Se desejar, você pode executar o comando de backup novamente e garantir que o sistema crie um backup incremental.

Se você quiser fazer um backup completo novamente, especifique a flag adicional:

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

Se você quiser uma saída detalhada no console, também especifique:

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

Restaurando o backup

Servidor Postgres (usuário sudo ou root):

1. Pare o cluster em execução:

sudo pg_ctlcluster 11 main stop

2. Restaure a partir do backup:

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

3. Inicie o cluster:

sudo pg_ctlcluster 11 main start

Após a restauração do backup, precisamos realizar um backup novamente:

Repositório (usuário pgbackrest):

sudo pgbackrest --stanza=main backup

Isso é tudo. Para concluir, quero lembrar que de forma alguma estou me colocando como um DBA sênior e, sempre que possível, estarei utilizando nuvens. Atualmente, estou começando a estudar diversos tópicos como backup, replicações, monitoramento, etc., e escrevendo pequenos relatórios sobre os resultados, para fazer uma pequena contribuição à comunidade e deixar algumas colas para mim mesmo.

Nos próximos artigos, tentarei falar sobre recursos adicionais — restauração de dados em um cluster limpo, criptografia de backups e publicação no S3, backups via rsync.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster