Exemplos práticos de como utilizar o cluster PostgreSQL de Alta Disponibilidade em diferentes cenários.
Simule a falha do nó primário e observe o comportamento do cluster durante a recuperação automática.
1. Identifique o container primário:
./scripts/health_checks/patroni.shA saída mostrará qual nó está como Leader (primário).
2. Simule a falha encerrando o container primário:
# Substitua <número-do-primário> pelo número identificado (1, 2 ou 3)
docker compose stop patroni-postgres-<número-do-primário>3. Observe o processo de failover:
# Monitore em tempo real
watch -n 1 'docker compose ps'
# Ou verifique os logs
docker compose logs -f patroni-postgres-2 patroni-postgres-34. Verifique o novo primário eleito:
./scripts/health_checks/patroni.sh5. Restaure o nó que falhou:
docker compose start patroni-postgres-<número-do-primário>O nó voltará como réplica e sincronizará automaticamente.
- ⏱️ Tempo de detecção: ~10-15 segundos
- 🔄 Tempo de eleição: ~5-10 segundos
- ✅ Disponibilidade: Conexões são redirecionadas automaticamente
- 📊 Perda de dados: Mínima (RPO < 1 segundo em condições normais)
Compare a performance entre um nó único PostgreSQL e o cluster com balanceamento de carga.
# Certifique-se de que apenas o ambiente de baseline está up
cd pytest/docker
docker compose -f docker-compose.pgbench-baseline.yaml up -d
# Execute o benchmark
sudo ../scripts/test/run-benchmark-baseline.sh# Suba o cluster completo
cd ../../
docker compose up -d
# Execute o benchmark
sudo ./scripts/test/run-benchmark-cluster.shOs resultados são salvos em pytest/outputs/performance/:
- TPS (Transações por Segundo): Vazão do sistema
- Latência Média: Tempo de resposta médio
- Latência P95/P99: Percentis de latência
Em breve será disponibilizado um guia completo de análise comparativa com gráficos.
Meça as características de resiliência do cluster.
Tempo necessário para o cluster se recuperar de uma falha.
# Teste de falha abrupta do primário
./scripts/test/run-crash-up.sh
# Os resultados incluem:
# - Tempo de detecção da falha
# - Tempo de eleição do novo líder
# - Tempo de recuperação do cluster
# - Tempo total de indisponibilidadeQuantidade de dados que pode ser perdida durante uma falha.
cd pytest
pytest tests/resilience/test_rpo_primary_failure.py -v -s
# O teste:
# 1. Inicia escrita contínua de transações
# 2. Simula falha do primário
# 3. Conta quantas transações foram perdidas
# 4. Calcula o RPOResultados: Salvos em pytest/outputs/resilience/
Demonstre como o PgPool distribui consultas SELECT entre as réplicas.
O PgPool está configurado para:
- Enviar
SELECTpara réplicas (load balancing) - Enviar
INSERT/UPDATE/DELETEpara o primário - Failover automático em caso de falha
# Conecte ao PgPool
psql -h localhost -p 5432 -U postgres -d postgres
# Execute várias consultas SELECT
SELECT pg_is_in_recovery(), inet_server_addr();
SELECT pg_is_in_recovery(), inet_server_addr();
SELECT pg_is_in_recovery(), inet_server_addr();Observe que as consultas são distribuídas entre diferentes nós (IPs diferentes).
# Verifique as estatísticas do PgPool
docker compose exec pgpool psql -h localhost -p 9999 -U postgres -c "SHOW POOL_NODES;"
# Veja as conexões ativas
docker compose exec pgpool psql -h localhost -p 9999 -U postgres -c "SHOW POOL_PROCESSES;"Realize uma troca planejada de líder sem indisponibilidade.
# 1. Identifique o líder atual
./scripts/health_checks/patroni.sh
# 2. Force um switchover para outro nó
docker compose exec patroni-postgres-1 patronictl switchover --force
# 3. Escolha o novo líder quando solicitado
# Exemplo: patroni-postgres-2
# 4. Verifique o novo líder
./scripts/health_checks/patroni.sh- Manutenção programada do servidor primário
- Balanceamento de carga entre servidores físicos
- Testes de DR (Disaster Recovery)
Verifique que os dados estão sendo replicados corretamente.
# 1. Conecte ao primário e insira dados
psql -h localhost -p 5432 -U postgres -d postgres -c "
CREATE TABLE IF NOT EXISTS test_replication (
id SERIAL PRIMARY KEY,
data TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
INSERT INTO test_replication (data)
VALUES ('Test 1'), ('Test 2'), ('Test 3');
"
# 2. Conecte a uma réplica e verifique os dados
# Primeiro identifique uma réplica
./scripts/health_checks/patroni.sh
# Conecte diretamente à réplica (substitua X pelo número da réplica)
docker compose exec patroni-postgres-X psql -U postgres -d postgres -c "
SELECT * FROM test_replication;
"
# 3. Verifique o lag de replicação
docker compose exec patroni-postgres-1 psql -U postgres -d postgres -c "
SELECT
client_addr,
state,
sync_state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes
FROM pg_stat_replication;
"Simule e recupere um nó que ficou desatualizado.
# 1. Pause um nó secundário
docker compose pause patroni-postgres-3
# 2. Faça alterações no primário
psql -h localhost -p 5432 -U postgres -d postgres -c "
INSERT INTO test_replication (data)
SELECT 'Data ' || generate_series(1, 10000);
"
# 3. Despause o nó
docker compose unpause patroni-postgres-3
# 4. Observe a sincronização
docker compose logs -f patroni-postgres-3
# 5. Verifique que está sincronizado
./scripts/health_checks/patroni.shEm breve será disponibilizado um guia completo de configuração e uso dos exporters Prometheus.
- PostgreSQL Exporter: Métricas de banco de dados
- Patroni API: Status do cluster
- PgPool Exporter: Estatísticas de conexões
- Etcd Metrics: Saúde do DCS
# Verifique o etcd
./scripts/health_checks/etcd.sh
# Verifique os logs do Patroni
docker compose logs patroni-postgres-1 patroni-postgres-2 patroni-postgres-3# Verifique o status dos nodes
docker compose exec pgpool psql -h localhost -p 9999 -U postgres -c "SHOW POOL_NODES;"
# Verifique logs do PgPool
docker compose logs pgpool# Verifique o lag em cada réplica
docker compose exec patroni-postgres-1 psql -U postgres -c "
SELECT * FROM pg_stat_replication;
"- Explore os testes automatizados para validação contínua
- Consulte a documentação técnica para configurações avançadas
- Revise o Quick Start para configuração inicial