AIOPS - Replicação Postgres em Container
AVISO: Após esse procedimento, o comando `simonctl masternode` não poderá mais ser utilizado, pois esta ação irá desfazer as mudanças realizadas.
Cenário de exemplo
1 - Master Principal: IP: 192.168.68.26
2 - Master Secundária (StandBy): IP: 192.168.68.27
Credencial do Postgres (default):
Usuário | Senha |
|---|---|
replicator | repl1c4-us3rs-410p3 |
Preparação dos ambientes
As ações a seguir devem ser realizadas nos dois nós (principal e secundário)
1 - Instalação utilitário de yaml yq:
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
chmod +x /usr/bin/yq2 - Assegurar um backup antes dos procedimentos de migração:
Ações: Dump, copia do deployment, copia dos dados do postgres Atenção: Executar apenas na master, pois os dados serão replicados
simonctl backup
cd /opt/apps/simon/docker
cp docker-compose.yml docker-compose.backup.yml
cp -rp /dados/var/lib/postgresql/data /dados/backup/postgres_data_$(date +%Y%m%d_%H%M%S)3 - Atualizar o deployment do postgres nas duas instancias (master principal e secundária)
Nó 1 - Master Principal:
curl -o /tmp/pg-replica-primary.yml https://repo.simonops.com/deployments/docker-files/pg-replica-primary.yml
yq -i '.services.postgres = load("/tmp/pg-replica-primary.yml").services.postgres' docker-compose.ymlNó 2 - Master Secundária ** StandBy:
curl -o /tmp/pg-replica-standby.yml https://repo.simonops.com/deployments/docker-files/pg-replica-standby.yml
yq -i '.services.postgres = load("/tmp/pg-replica-standby.yml").services.postgres' docker-compose.yml4 - Atualizar o deployment da pasta docker
cd /opt/apps/simon/docker
vi docker-compose.ymlAltere as linhas do extra_hosts (adicione o seu ip), veja um exemplo:
# Editar o extra_hosts do postgres
postgres:
...
extra_hosts:
- "postgres_primary:192.168.68.26"
- "postgres_secondary:192.168.68.27"5 - Remova o container do postgres anterior e seus dados
Prossiga somente se já efetuou o backup no passo 2 - Assegurar um backup...
docker stop postgres
docker rm postgres
rm -rf /dados/var/lib/postgresql
docker volume prune -f
docker system prune -f6A - Atualize o container do postgres
Nó 1 - Master Principal:
Inicializar o diretorio (Atenção: apenas na master principal):
docker run --rm --tty -ti \
-e POSTGRES_HOST_AUTH_METHOD="scram-sha-256" \
-e POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256" \
-v /dados/var/lib/postgresql/data:/var/lib/postgresql/data --name postgres-init docker.simonops.com/simonops/space-postgres:pg17
echo -e "host replication all 0.0.0.0/0 md5" >> /dados/var/lib/postgresql/data/pg_hba.confAtualizar o container principal:
docker compose pull postgres
docker compose up -d postgresRestaurar a partir do backup:
gunzip -c /dados/backup/db-dump.backup | docker exec -i postgres psql -U postgres -d simon_data
docker exec -i postgres psql -U postgres -d simon_data -c "GRANT ALL ON SCHEMA public TO simon_user;"(Opcional) Restaurar o inventory:
gunzip -c /dados/backup/inv-db-dump.backup | docker exec -i postgres psql -U postgres -d inventory_data
docker exec -i postgres psql -U postgres -d inventory_data -c "GRANT ALL ON SCHEMA public TO inventory_user;"Migração e restart dos containers:
simonctl migrate
docker restart app app-ws app-vibes celery celerybeat(Opcional) Migração e restart dos containers do inventory:
cd /opt/apps/simon/docker-inventory
docker compose restart6B - Atualize o container do postgres (secundária)
Nó 2 - Master Secundária (StandBy):
Inicializar os diretórios com o nível do usuário postgres e realizar o primeiro backup: Atenção: Trocar o IP do postgres_primary
docker run --rm --tty -ti \
--add-host "postgres_primary:192.168.68.26" \
-e PGUSER="replicator" \
-e PGPASSWORD="repl1c4-us3rs-410p3" \
-e POSTGRES_HOST_AUTH_METHOD="scram-sha-256" \
-e POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256" \
-v /dados/var/lib/postgresql/data:/var/lib/postgresql/data --name postgres-init docker.simonops.com/simonops/space-postgres:pg17 \
/bin/sh -c "echo 'Starting backup...' && pg_basebackup -D /var/lib/postgresql/data --progress -R --slot=replication_slot --host=postgres_primary --port=5432 && chmod 0700 /var/lib/postgresql/data && chown -R postgres:postgres /var/lib/postgresql/data && echo 'Concluido'"
docker compose up -d postgres