Isenção de responsabilidadeEu 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'
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
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.