postgresql postgres ha barman repmgr

Gabarito de um cluster de HA com Barman e Repmgr

Instalações

  1. Instalar o repositório PGDG nas três máquinas:
       yum install epel-release
       rpm -iv https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    
  2. Instalar os pacotes do PostgreSQL (servidor) nas três máquinas: yum install postgresql14-server postgresql14-contrib
  3. Instalar o Barman na máquina pg-a: yum install barman
  4. Instalar o barman-cli nas máquinas pg-1 e pg-2: yum install barman-cli
  5. Instalar os pacotes do repmgr nas três máquinas: yum install repmgr14
  6. Faça a criação dos pares de chaves assimétricas ssh (ssh-keygen) nos usuários e então a troca das chaves públicas entre eles:
    • postgres@pg-1
    • postgres@pg-2
    • postgres@pg-a
    • barman@pg-a
  7. Crie o arquivo .pgpass de postgres@{pg-1,pg-2,pg-a} com permissões 0600 e conteúdo (substitua "senha" pela senha escolhida):
       pg-1.local:5432:*:repmgr:senha
    
  8. Crie o arquivo .pgpass de barman@pg-a com permissões 0600 e conteúdo (substitua "senha" pela senha escolhida):
       pg-1.local:5432:*:barman:senha
    
  9. Crie o arquivo /etc/polkit-1/rules.d/30-postgres.rules para permitir o gerenciamento do serviço pelo postgres/repmgr com o conteúdo:
       polkit.addRule(function(action, subject) {
         if (action.id == "org.freedesktop.systemd1.manage-units" &&
           /^postgresql.*\.service$/.test(action.lookup("unit")) &&
           subject.isInGroup("postgres"))
         {
           return polkit.Result.YES;
         }
       })
    

Primário

  1. Inicialize a instância na máquina pg-1 (como root): /usr/pgsql-14/bin/postgresql-14-setup initdb
  2. Configure a instância (postgresql.conf, substituindo pela senha escolhida para o usuário postgres):
       listen_addresses = '*'
       password_encryption = 'scram-sha-256'
       archive_mode = on
       archive_command = 'barman-wal-archive pg-a.local app %p'
       restore_command = 'barman-wal-restore pg-a.local app %f %p'
       primary_conninfo = 'host=pg-1.local port=5432 user=postgres password=senha'
    
  3. Configure a instancia para aceitar conexões da mesma rede por senha (pg_hba.conf):
       host all         all                    samenet scram-sha-256
       host replication postgres,barman,repmgr samenet scram-sha-256
    
  4. Inicie o serviço: systemctl start postgresql-14
  5. Crie o slot de replicação do barman (psql, como postgres): SELECT pg_create_physical_replication_slot('barman');
  6. Crie usuários para o barman e repmgr com senhas (psql, como postgres):
       \passwd postgres
       CREATE USER barman REPLICATION SUPERUSER;
       \passwd barman
       CREATE USER repmgr REPLICATION SUPERUSER;
       \passwd repmgr
    
  7. Crie um banco de dados para o repmgr:
       CREATE DATABASE repmgr OWNER repmgr;
    

Barman (máquina pg-a)

  1. Garanta que o arquivo /etc/barman.conf, o diretório /etc/barman.d e todo o seu conteúdo são do usuário barman (como root): chown -R barman:barman /etc/barman*
  2. Crie um arquivo de configuração do barman /etc/barman.d/app.conf (como barman):
       [app]
    
       ; como o barman consegue acessar a máquina original por ssh
       ssh_command = ssh postgres@pg-1.local
    
       ; como o barman consegue acessar a máquina original por postgres
       conninfo = host=pg-1.local,pg-2.local user=barman dbname=postgres target_session_attrs=read-write
    
       ; modo de backup
       backup_options = concurrent_backup
       backup_method = rsync
       reuse_backup = link
    
       ; aceita arquivamento por barman-cli
       archiver = on
    
       ; aceita arquivamento por pg_receivewal
       streaming_conninfo = host=pg-1.local,pg-2.local user=barman target_session_attrs=read-write
       streaming_archiver = on
       slot_name = barman
    
       ; política de retenção
       retention_policy = REDUNDANCY 2
    
       ; caminho para os binários da versão do PostgreSQL
       path_prefix = "/usr/pgsql-14/bin"
    
  3. Execute um backup (como barman): barman backup app
  4. Agende a execução do backup com crontab -e (como barman): 0 0 * * * barman backup app

repmgr

  1. Garanta que o arquivo de configuração do repmgr pertence ao usuário postgres em todas as máquinas: chown -R postgres:postgres /etc/repmgr
  2. Configure o /etc/repmgr/14/repmgr.conf na máquina pg-1:
       # identificador numérico único do nó dentro do cluster
       node_id=1
    
       # nome do nó no cluster
       node_name='pg-1.local'
    
       # conexão
       conninfo='host=pg-1.local user=repmgr dbname=repmgr'
    
       # diretórios de dados
       data_directory='/var/lib/pgsql/14/data'
       pg_bindir='/usr/pgsql-14/bin/'
    
       # identificador do cluster no barman
       barman_server='app'
    
       # hostname do servidor do barman
       barman_host='barman@pg-a.local'
    
       # comandos de controle do nó
       service_start_command   = 'sudo systemctl start postgresql-14'
       service_stop_command    = 'sudo systemctl stop postgresql-14'
       service_restart_command = 'sudo systemctl restart postgresql-14'
       service_reload_command  = 'sudo systemctl reload postgresql-14'
    
  3. Configure o /etc/repmgr/14/repmgr.conf na máquina pg-2:
       # identificador numérico único do nó dentro do cluster
       node_id=2
    
       # nome do nó no cluster
       node_name='pg-2.local'
    
       # conexão
       conninfo='host=pg-2.local user=repmgr dbname=repmgr'
    
       # diretórios de dados
       data_directory='/var/lib/pgsql/14/data'
       pg_bindir='/usr/pgsql-14/bin/'
    
       # identificador do cluster no barman
       barman_server='app'
    
       # hostname do servidor do barman
       barman_host='barman@pg-a.local'
    
       # comandos de controle do nó
       service_start_command   = 'sudo systemctl start postgresql-14'
       service_stop_command    = 'sudo systemctl stop postgresql-14'
       service_restart_command = 'sudo systemctl restart postgresql-14'
       service_reload_command  = 'sudo systemctl reload postgresql-14'
    
  4. Configure o /etc/repmgr/14/repmgr.conf na máquina pg-a:
       # identificador numérico único do nó dentro do cluster
       node_id=3
    
       # nome do nó no cluster
       node_name='pg-a.local'
    
       # conexão
       conninfo='host=pg-a.local user=repmgr dbname=repmgr'
    
       # diretório de dados
       data_directory='/var/lib/pgsql/14/data'
    
  5. Inicialize uma instância na máquina pg-a (como root): /usr/pgsql-14/bin/postgresql-14-setup initdb
  6. Configure a instância (postgresql.conf, substituindo pela senha escolhida para o usuário postgres em pg-a):
       listen_addresses = '*'
       password_encryption = 'scram-sha-256'
    
  7. Configure a instancia para aceitar conexões da mesma rede por senha (pg_hba.conf em pg-a):
       host all         all             samenet scram-sha-256
       host replication postgres,repmgr samenet scram-sha-256
    
  8. Inicie o serviço: systemctl start postgresql-14
  9. Crie um usuário para repmgr com senha (psql, como postgres em pg-a):
       \passwd postgres
       CREATE USER repmgr REPLICATION;
       \passwd repmgr
    
  10. Crie um banco de dados para o repmgr, com a extensão dele (psql, como postgres em pg-a):
       CREATE DATABASE repmgr OWNER repmgr;
       \c repmgr
       CREATE EXTENSION repmgr;
    

cluster

  1. Registre o primário no repmgr (em pg-1): /usr/pgsql-14/bin/repmgr -f /etc/repmgr/14/repmgr.conf primary register
  2. Crie a réplica (em pg-2): /usr/pgsql-14/bin/repmgr -h pg-1.local -U repmgr standby clone
  3. Inicie o serviço (em pg-2): systemctl start postgresql-14
  4. Registre a réplica (em pg-2): /usr/pgsql-14/bin/repmgr -h pg-1.local standby register --upstream-node-id
  5. Registre a testemunha (em pg-a): /usr/pgsql-14/bin/repmgr -h pg-1.local witness register --upstream-node-id