Copia de seguranza postgresql incremental con pgbackrest: un curso para un novo loitador do programador

Exención de responsabilidade

Son un programador. Escribo código e interactúo coa base de datos só como usuario. De ningún xeito pretendo ser un administrador do sistema, e moito menos un dba. Pero…

Ocorreu que necesitaba organizar unha copia de seguridade da base de datos postgresql. Sen nubes: só usa SSH e asegúrate de que todo funciona sen pedir diñeiro. Que facemos nestes casos? É certo, empuxamos pgdump a cron, realizamos unha copia de seguridade de todo no arquivo todos os días e, se estamos completamente perdidos, enviamos este arquivo a algún lugar moi afastado.

Esta vez a dificultade foi que, segundo os plans, a base de datos debía crecer uns +- 100 MB por día. Por suposto, despois dun par de semanas desaparecerá o desexo de facer unha copia de seguridade de todo con pgdump. Aquí é onde as copias de seguridade incrementais veñen ao rescate.

Interesante? Benvido ao gato.

A copia de seguridade incremental é un tipo de copia de seguridade cando non se copian todos os ficheiros de orixe, senón só os novos e os modificados desde a creación da copia anterior.

Como calquera desenvolvedor que non estaba ABSOLUTAMENTE disposto (naquel momento) a comprender as complejidades de postgres, quería atopar o botón verde. Ben, xa sabes, como en AWS, DigitalOcean: premeches un botón - obtiveches a replicación, presionastes o segundo - configuraches copias de seguridade, o terceiro - retrocediste todo un par de horas. Non atopei un botón ou unha fermosa ferramenta GUI. Se coñeces algún (gratis ou barato), escribe sobre el nos comentarios.

Despois de buscar en Google atopei dúas ferramentas pgbarman и pgbackrest. Simplemente non conseguín co primeiro (documentación moi escasa, intentei averiguar todo segundo manuais antigos), pero co segundo a documentación resultou estar á altura, pero non exenta de fallos. Para simplificar o traballo dos que se enfrontan a unha tarefa similar, escribiuse este artigo.

Despois de ler este artigo, aprenderás a facer copias de seguridade incrementais, gardalas nun servidor remoto (repositorio con copias de seguridade) e restauralas en caso de perda de datos ou outros problemas no servidor principal.

Adestramento

Para reproducir o manual necesitará dous VPS. O primeiro será o almacenamento (o repositorio no que se almacenarán as copias de seguridade), e o segundo, de feito, o propio servidor con postgres (no meu caso, a versión 11 de postgres).

Suponse que no servidor con postgres tes root, usuario sudo, usuario postgres e o propio postgres está instalado (o usuario postgres créase automaticamente ao instalar postgresql), e no servidor do repositorio hai usuario root e sudo (no manual). empregarase o nome de usuario pgbackrest).

Para que teñas menos problemas á hora de reproducir as instrucións, escribo en cursiva onde, con que usuario e con que dereitos executei o comando ao escribir e comprobar o artigo.

Instalando pgbackrest

Repositorio (usuario pgbackrest):

1. Descarga o arquivo de pgbackrest e transfire o seu contido ao cartafol /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. Instala as dependencias necesarias para a montaxe:

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

3. Montaxe do pgbackrest:

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

4. Copie o ficheiro executable no directorio /usr/bin:

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

5. Pgbackrest require perl. Instalar:

sudo apt-get install perl

6. Crea directorios para rexistros, dálles certos dereitos:

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

pgbackrest version

Servidor Postgres (usuario sudo ou root):

O proceso de instalación de pgbackrest nun servidor con postgres é similar ao proceso de instalación no repositorio (si, pgbackrest debe estar instalado en ambos os servidores), pero no 6º parágrafo o segundo e último comando:

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

substituír por:

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

Configurar a interacción entre servidores mediante SSH sen contrasinal

Para que pgbackrest funcione correctamente, é necesario configurar a interacción entre o servidor postgres e o repositorio mediante o ficheiro de chave.

Repositorio (usuario pgbackrest):

Crea un par de claves:

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

Atención! Executamos os comandos anteriores sen sudo.

Servidor Postgres (usuario sudo ou root):

Crea un par de claves:

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

Repositorio (usuario sudo):

Copie a chave pública do servidor postgres no servidor do repositorio:

(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

Neste paso pediráselle o contrasinal para o usuario root. Debe introducir o contrasinal do usuario root do servidor postgres!

Servidor Postgres (usuario sudo):

Copie a chave pública do repositorio no servidor con 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

Neste paso pediráselle o contrasinal para o usuario root. Debe introducir exactamente o contrasinal do usuario root do repositorio!

Comprobamos:

Repositorio (usuario raíz, para a pureza do experimento):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Servidor Postgres (usuario root, para a pureza do experimento):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Asegurámonos de que teñamos acceso sen problemas.

Configurando un servidor postgres

Servidor Postgres (usuario sudo ou root):

1. Permitimos chamar ao servidor postgres desde IPs externas. Para iso, edite o ficheiro postgresql.conf (situado no cartafol /etc/postgresql/11/main), engadindolle a liña:

listen_addresses = '*'

Se esa liña xa existe, descoméntala ou estableza o valor do parámetro como '*'.

En arquivo pg_hba.conf (tamén situado no cartafol /etc/postgresql/11/main) Engade as seguintes liñas:

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

en que:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Fagamos os axustes necesarios en postgresql.conf (está no cartafol /etc/postgresql/11/main) para que pgbackrest funcione:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Fagamos os axustes necesarios no ficheiro de configuración de pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Recarga postgresql:

sudo service postgresql restart

Configurar un servidor de repositorio

Repositorio (usuario de pgbackrest):

Fagamos os axustes necesarios no ficheiro de configuración 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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Creando un repositorio

Repositorio (usuario de pgbackrest):

Crea un novo almacenamento para o clúster Inicio:

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

Проверка

Servidor Postgres (usuario sudo ou root):

Comprobamos no servidor postgres:

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

Repositorio (usuario de pgbackrest):

Comprobamos no servidor do repositorio:

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

Asegurámonos de que na saída vexamos a liña "check command end: completed successfully".

Canso? Pasemos á parte máis interesante.

Facendo unha copia de seguridade

Repositorio (usuario de pgbackrest):

1. Realice unha copia de seguridade:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Asegúrate de que se creou unha copia de seguridade:

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

Pgbackrest creará a primeira copia de seguridade completa. Se o desexa, pode executar o comando de copia de seguridade de novo e asegurarse de que o sistema crea unha copia de seguridade incremental.

Se queres facer unha copia de seguranza completa de novo, especifique unha marca adicional:

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

Se queres unha saída detallada da consola, especifique tamén:

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

Restaurando unha copia de seguridade

Servidor Postgres (usuario sudo ou root):

1. Detén o clúster en execución:

sudo pg_ctlcluster 11 main stop

2. Restauración desde a copia de seguranza:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Para restaurar a base de datos ao estado da última copia de seguridade COMPLETA, use o comando sen especificar recovery_target:

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

Importante! Despois da recuperación, pode ocorrer que a base de datos quede atascada no modo de recuperación (haberá erros como ERRO: non se pode executar DROP DATABASE nunha transacción de só lectura). Para ser honesto, aínda non entendín con que está conectado isto. A solución é a seguinte (terá que esperar un pouco despois de executar o comando):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

De feito, é posible restaurar unha copia de seguridade específica polo seu nome. Aquí só estou Proporcionarei unha ligazón á descrición desta función na documentación. Os desenvolvedores aconsellan usar esta opción con precaución e explican por que. Podo engadir de min mesmo que o usei. Se realmente o precisa, asegúrese de que despois da recuperación a base de datos sae do modo de recuperación (seleccione pg_is_in_recovery() debería mostrar "f") e, por se acaso, faga unha copia de seguridade completa despois da recuperación.

3. Inicia o clúster:

sudo pg_ctlcluster 11 main start

Despois de restaurar a copia de seguridade, necesitamos realizar unha segunda copia de seguridade:

Repositorio (usuario de pgbackrest):

sudo pgbackrest --stanza=main backup

Iso é todo. Como conclusión, gustaríame lembrarvos que de ningún xeito pretendo facerme pasar por un senior dba e que vou aproveitar as nubes na menor oportunidade. Actualmente, eu mesmo estou comezando a estudar diversos temas como backup, replicación, monitorización, etc. e escribo pequenos informes sobre os resultados para facer unha pequena contribución á comunidade e deixar pequenas follas de trucos para min.

Nos seguintes artigos tentarei falar de funcións adicionais: recuperación de datos nun clúster limpo, cifrado de copias de seguridade e publicación en S3, copias de seguridade mediante rsync.

Fonte: www.habr.com

Engadir un comentario