postgresql postgres ha barman repmgr
-
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
-
Instalar os pacotes do PostgreSQL (servidor) nas três máquinas:
yum install postgresql16-server postgresql16-contrib
-
Instalar o Barman na máquina pg-a:
yum install barman
-
Instalar o barman-cli nas máquinas pg-1 e pg-2:
yum install barman-cli
-
Instalar os pacotes do repmgr nas três máquinas:
yum install repmgr16
-
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
-
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
-
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
-
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; } })
-
Inicialize a instância na máquina pg-1 (como root):
/usr/pgsql-16/bin/postgresql-16-setup initdb
-
Configure a instância (
postgresql.conf
, substituindo pela senha escolhida para o usuáriopostgres
):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'
-
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
-
Inicie o serviço:
systemctl start postgresql-16
-
Crie o slot de replicação do barman (psql, como
postgres
):SELECT pg_create_physical_replication_slot('barman');
-
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
-
Crie um banco de dados para o repmgr:
CREATE DATABASE repmgr OWNER repmgr;
-
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*
-
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-16/bin"
-
Execute um backup (como barman):
barman backup app
-
Agende a execução do backup com
crontab -e
(como barman):0 0 * * * barman backup app
-
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
-
Configure o
/etc/repmgr/16/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/16/data' pg_bindir='/usr/pgsql-16/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-16' service_stop_command = 'sudo systemctl stop postgresql-16' service_restart_command = 'sudo systemctl restart postgresql-16' service_reload_command = 'sudo systemctl reload postgresql-16'
-
Configure o
/etc/repmgr/16/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/16/data' pg_bindir='/usr/pgsql-16/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-16' service_stop_command = 'sudo systemctl stop postgresql-16' service_restart_command = 'sudo systemctl restart postgresql-16' service_reload_command = 'sudo systemctl reload postgresql-16'
-
Configure o
/etc/repmgr/16/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/16/data'
-
Inicialize uma instância na máquina pg-a (como root):
/usr/pgsql-16/bin/postgresql-16-setup initdb
-
Configure a instância (
postgresql.conf
, substituindo pela senha escolhida para o usuáriopostgres
em pg-a):listen_addresses = '*' password_encryption = 'scram-sha-256'
-
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
-
Inicie o serviço:
systemctl start postgresql-16
-
Crie um usuário para repmgr com senha (psql, como
postgres
em pg-a):\passwd postgres CREATE USER repmgr REPLICATION; \passwd repmgr
-
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;
-
Registre o primário no repmgr (em pg-1):
/usr/pgsql-16/bin/repmgr -f /etc/repmgr/16/repmgr.conf primary register
-
Crie a réplica (em pg-2):
/usr/pgsql-16/bin/repmgr -h pg-1.local -U repmgr standby clone
-
Inicie o serviço (em pg-2):
systemctl start postgresql-16
-
Registre a réplica (em pg-2):
/usr/pgsql-16/bin/repmgr -h pg-1.local standby register --upstream-node-id
-
Registre a testemunha (em pg-a):
/usr/pgsql-16/bin/repmgr -h pg-1.local witness register --upstream-node-id