{"id":50145264,"url":"https://github.com/richwrd/postgres-ha-cluster-lab","last_synced_at":"2026-05-24T03:34:42.682Z","repository":{"id":311845744,"uuid":"1037056488","full_name":"richwrd/postgres-ha-cluster-lab","owner":"richwrd","description":"Bachelor's Thesis project focusing on the quantitative analysis and implementation of a PostgreSQL HA cluster with Patroni, etcd, and Pgpool-II.","archived":false,"fork":false,"pushed_at":"2025-12-16T20:35:35.000Z","size":458,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T03:34:40.663Z","etag":null,"topics":["database-administration","disaster-recovery","docker","docker-compose","etcd","failover","high-availability","iac","metrics","open-source","patroni","pgpool-ii","postgresql","sre","streaming-replication"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/richwrd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-13T02:11:06.000Z","updated_at":"2026-01-23T10:37:00.000Z","dependencies_parsed_at":"2025-08-27T09:13:15.641Z","dependency_job_id":"4f82271c-9a3f-4eb5-bb81-f2230e8a4136","html_url":"https://github.com/richwrd/postgres-ha-cluster-lab","commit_stats":null,"previous_names":["richwrd/postgres-ha-cluster-lab"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/richwrd/postgres-ha-cluster-lab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richwrd%2Fpostgres-ha-cluster-lab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richwrd%2Fpostgres-ha-cluster-lab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richwrd%2Fpostgres-ha-cluster-lab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richwrd%2Fpostgres-ha-cluster-lab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/richwrd","download_url":"https://codeload.github.com/richwrd/postgres-ha-cluster-lab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/richwrd%2Fpostgres-ha-cluster-lab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33420660,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-administration","disaster-recovery","docker","docker-compose","etcd","failover","high-availability","iac","metrics","open-source","patroni","pgpool-ii","postgresql","sre","streaming-replication"],"created_at":"2026-05-24T03:34:40.632Z","updated_at":"2026-05-24T03:34:42.677Z","avatar_url":"https://github.com/richwrd.png","language":"Python","funding_links":["https://www.buymeacoffee.com/richwrd"],"categories":[],"sub_categories":[],"readme":"# Cluster PostgreSQL de Alta Disponibilidade com Patroni, etcd e Pgpool-II\n\n\u003e Projeto de Trabalho de Conclusão de Curso focado na implementação e análise de uma arquitetura de alta disponibilidade para PostgreSQL usando ferramentas open-source em um ambiente containerizado com Docker.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"docs/assets/arquitetura.png\" width=100% alt=\"Banner\"\u003e\n\u003c/p\u003e\n\n## 🚀 Sobre o Projeto\n\nCluster PostgreSQL de alta disponibilidade desenvolvido como TCC, implementando uma arquitetura resiliente a falhas com ferramentas open-source em ambiente containerizado.\n\n### Componentes Principais\n\n- **PostgreSQL** (3 nós) + **Patroni**: Replicação streaming e failover automático\n- **etcd** (3 nós): Coordenação distribuída e eleição de líder\n- **PgPool-II**: Proxy com balanceamento de carga e roteamento inteligente\n- **Prometheus Exporters**: Monitoramento de métricas\n\n### Funcionalidades\n\n✅ Failover automático e recuperação rápida  \n✅ Balanceamento de carga para leituras  \n✅ Replicação streaming assíncrona  \n✅ Testes automatizados de resiliência (RTO/RPO)  \n✅ Testes de performance com pgbench\n\n## 📋 Pré-requisitos\n\n- **Arquitetura ARM64** (projeto otimizado para ARM)\n- Docker 20.10+ e Docker Compose v2.20+\n- Python 3.10+ (para testes)\n- Mínimo: 4 CPU cores, 8GB RAM, 20GB disco\n\nVeja os detalhes completos em [docs/QUICK-START.md](docs/QUICK-START.md)\n\n## 🛠️ Começando\n\n```bash\n# Clone e configure\ngit clone https://github.com/richwrd/postgres-ha-cluster-lab\ncd postgres-ha-cluster-lab\ncp .env.example .env\n\n# Crie diretórios e suba o cluster\n./scripts/create_data_dirs.sh\ndocker compose up -d\n\n# Verifique a saúde\n./scripts/health_checks/check_cluster_status.sh\n```\n\n**📖 Guia completo:** [docs/QUICK-START.md](docs/QUICK-START.md)\n\n## 🧪 Testes\n\n```bash\n# Configurar ambiente\ncd pytest\npython3 -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\n\n# Testes de resiliência\n./scripts/test/run-crash-up.sh  # RTO\npytest tests/resilience/test_rpo_primary_failure.py -v -s  # RPO\n\n# Testes de performance\nsudo ./scripts/test/run-benchmark-baseline.sh  # Baseline\nsudo ./scripts/test/run-benchmark-cluster.sh   # Cluster\n```\n\n**📖 Documentação completa:** [docs/TESTES.md](docs/TESTES.md)\n\n## 📊 Estrutura do Projeto\n\n```\npostgres-ha-cluster-lab/\n├── docker-compose*.yaml       # Configuração Docker modular\n├── infra/                     # Dockerfiles e configs (Patroni, PgPool)\n├── pytest/                    # Framework de testes\n├── scripts/                   # Utilitários e health checks\n└── docs/                      # Documentação técnica\n```\n\n## 📚 Documentação\n\n### Guias de Uso\n\n- **[Quick Start](docs/QUICK-START.md)**: Instalação e configuração inicial\n- **[Guia de Testes](docs/TESTES.md)**: Executando testes de resiliência e performance\n- **[Casos de Uso](docs/CASOS-DE-USO.md)**: Exemplos práticos e cenários reais\n\n### Documentação Técnica\n\n- **[Configuração Docker Compose](docs/stack/DOCKER-COMPOSE-GUIDE.md)**: Arquivos compose modulares _(em breve)_\n- **[Configuração Patroni + DCS](docs/stack/CONFIGURACAO-DCS-PATRONI.md)**: etcd e Patroni _(em breve)_\n- **[Autenticação PgPool](docs/stack/AUTENTICACAO-PGPOOL.md)**: Configuração de autenticação _(em breve)_\n- **[Arquitetura do Projeto](docs/stack/ARQUITETURA-MODULAR.txt)**: Estrutura e design _(em breve)_\n\n### Framework de Testes\n\n- **[README Pytest](pytest/README.md)**: Visão geral do framework\n- **[Arquitetura de Testes](pytest/ARCHITECTURE.md)**: Design e padrões\n\n## 🎯 Casos de Uso\n\nExemplos práticos de uso do cluster:\n\n- **Failover Automático**: Simule falhas e observe a recuperação\n- **Benchmark de Performance**: Compare nó único vs. cluster\n- **Análise de Resiliência**: Meça RTO e RPO\n- **Balanceamento de Carga**: Distribua leituras entre réplicas\n- **Switchover Planejado**: Troca de líder sem downtime\n\n**📖 Guia completo com exemplos:** [docs/CASOS-DE-USO.md](docs/CASOS-DE-USO.md)\n\n## 🔍 Monitoramento\n\nExporters Prometheus disponíveis:\n\n- **PostgreSQL**: `patroni-postgres-X:9187/metrics`\n- **Patroni API**: `patroni-postgres-X:8008/metrics`\n- **etcd**: `etcd-X:2379/metrics`\n- **PgPool**: `pgpool:9719/metrics`\n\n_Guia completo de configuração com Prometheus e Grafana em breve._\n\n## 🤝 Contribuindo\n\nContribuições são bem-vindas! Por favor:\n\n1. Fork o projeto\n2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)\n3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)\n4. Push para a branch (`git push origin feature/AmazingFeature`)\n5. Abra um Pull Request\n\n## 🔗 Links Úteis\n\n- **Documentação Oficial Patroni**: [patroni.readthedocs.io](https://patroni.readthedocs.io/en/latest/)\n- **Documentação Oficial PgPool-II**: [pgpool.net](https://www.pgpool.net/docs/latest/pt/html/index.html)\n\n---\n\n⭐ **Se este projeto foi útil para você, considere dar uma estrela no repositório!**\n\n---\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n\u003cdiv align=\"center\"\u003e\n\n## 👤 Author\n\n**Eduardo Richard** (richwrd)\n\n[![GitHub](https://img.shields.io/badge/GitHub-@richwrd-181717?logo=github\u0026logoColor=white)](https://github.com/richwrd)\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-0A66C2?logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/eduardorichard/)\n[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-support-FFDD00?logo=buy-me-a-coffee\u0026logoColor=black)](https://www.buymeacoffee.com/richwrd)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n**Built with ❤️ for the PostgreSQL community**\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frichwrd%2Fpostgres-ha-cluster-lab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frichwrd%2Fpostgres-ha-cluster-lab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frichwrd%2Fpostgres-ha-cluster-lab/lists"}