{"id":3012,"date":"2026-09-20T18:18:01","date_gmt":"2026-09-20T21:18:01","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/"},"modified":"2026-09-20T18:18:01","modified_gmt":"2026-09-20T21:18:01","slug":"aula-24-postgresql-em-producao-alta-disponibilidade-com-patr","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/","title":{"rendered":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer"},"content":{"rendered":"<p>Bem-vindo \u00e0 aula final do curso <strong>PostgreSQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: <strong>PostgreSQL em produ\u00e7\u00e3o<\/strong> com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning, replica\u00e7\u00e3o, backup e seguran\u00e7a. Agora chegou o momento de integrar todos esses conhecimentos para projetar uma arquitetura resiliente, capaz de minimizar downtime e garantir conex\u00f5es eficientes, mesmo sob picos de carga. O foco desta aula ser\u00e1 a combina\u00e7\u00e3o de duas ferramentas poderosas e amplamente adotadas no mercado: <strong>Patroni<\/strong>, respons\u00e1vel pelo gerenciamento autom\u00e1tico de failover e alta disponibilidade, e <strong>pgBouncer<\/strong>, um pooler de conex\u00f5es leve e essencial para aplica\u00e7\u00f5es com muitos clientes simult\u00e2neos.<\/p>\n<p>Por que este tema importa tanto? Em ambientes de produ\u00e7\u00e3o, a disponibilidade do banco de dados \u00e9 um requisito inegoci\u00e1vel. Um \u00fanico ponto de falha pode derrubar sistemas inteiros, gerar preju\u00edzos financeiros e comprometer a confian\u00e7a dos usu\u00e1rios. O PostgreSQL, por padr\u00e3o, n\u00e3o oferece failover autom\u00e1tico nativo \u2014 \u00e9 preciso orquestrar o processo com ferramentas externas. \u00c9 exatamente aqui que o <strong>Patroni<\/strong> entra: ele automatiza a elei\u00e7\u00e3o de um novo prim\u00e1rio, gerencia a replica\u00e7\u00e3o e mant\u00e9m o cluster saud\u00e1vel de forma aut\u00f4noma. J\u00e1 o <strong>pgBouncer<\/strong> resolve outro gargalo cl\u00e1ssico: o custo de abrir e fechar conex\u00f5es no PostgreSQL. Ao atuar como um proxy que mant\u00e9m um pool de conex\u00f5es persistentes, o pgBouncer reduz drasticamente a lat\u00eancia e o consumo de recursos, especialmente em aplica\u00e7\u00f5es web com centenas ou milhares de conex\u00f5es simult\u00e2neas.<\/p>\n<p>Neste artigo, voc\u00ea vai aprender a projetar, instalar, configurar e validar uma solu\u00e7\u00e3o completa de alta disponibilidade para <strong>PostgreSQL em produ\u00e7\u00e3o<\/strong>. Vamos come\u00e7ar com a teoria essencial sobre arquitetura de clusters e failover, passando pela instala\u00e7\u00e3o do <strong>etcd<\/strong> (o armazenamento distribu\u00eddo de consenso usado pelo Patroni), do <strong>Patroni<\/strong> em si e do <strong>pgBouncer<\/strong>. Cada passo ser\u00e1 demonstrado com comandos reais, comentados linha por linha, e com a sa\u00edda esperada no terminal, para que voc\u00ea possa reproduzir tudo em seu pr\u00f3prio ambiente. Tamb\u00e9m abordaremos as configura\u00e7\u00f5es completas dos arquivos, testes de failover, verifica\u00e7\u00e3o de integridade e os erros mais comuns que encontramos em campo, com suas respectivas solu\u00e7\u00f5es.<\/p>\n<p>\u00c9 importante destacar que, em nossos projetos na <strong>JRT Technology Solutions<\/strong>, nossos especialistas utilizam diariamente essa mesma stack \u2014 Patroni, etcd e pgBouncer \u2014 para implementar solu\u00e7\u00f5es de alta disponibilidade em clientes de diversos portes. Observamos na pr\u00e1tica que a combina\u00e7\u00e3o dessas ferramentas oferece um equil\u00edbrio excelente entre robustez, simplicidade operacional e maturidade. Ao final desta aula, voc\u00ea ter\u00e1 a confian\u00e7a necess\u00e1ria para implantar essa arquitetura em seu pr\u00f3prio ambiente de produ\u00e7\u00e3o, aplicar boas pr\u00e1ticas de opera\u00e7\u00e3o e solucionar problemas recorrentes. Prepare-se para a reta final do curso: esta aula \u00e9 densa, pr\u00e1tica e repleta de conhecimento aplic\u00e1vel imediatamente.<\/p>\n<p>Ao concluir esta li\u00e7\u00e3o, voc\u00ea ser\u00e1 capaz de: entender a arquitetura de alta disponibilidade com Patroni; instalar e configurar o etcd como camada de consenso; implantar um cluster PostgreSQL com failover autom\u00e1tico; configurar o pgBouncer para otimizar conex\u00f5es; realizar testes de failover e recupera\u00e7\u00e3o; diagnosticar e corrigir falhas comuns; e, por fim, projetar uma topologia de produ\u00e7\u00e3o madura e resiliente. Vamos come\u00e7ar!<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>Compreender os conceitos de alta disponibilidade, failover autom\u00e1tico e arquitetura de clusters no PostgreSQL.<\/li>\n<li>Instalar e configurar o <strong>etcd<\/strong> como armazenamento de consenso distribu\u00eddo para o Patroni.<\/li>\n<li>Instalar o <strong>Patroni<\/strong> e configurar um cluster PostgreSQL com replica\u00e7\u00e3o s\u00edncrona e ass\u00edncrona.<\/li>\n<li>Configurar o <strong>pgBouncer<\/strong> para pooling de conex\u00f5es, reduzindo overhead e lat\u00eancia.<\/li>\n<li>Realizar testes pr\u00e1ticos de failover, promover r\u00e9plicas e restaurar o n\u00f3 prim\u00e1rio original.<\/li>\n<li>Diagnosticar e corrigir erros operacionais frequentes em ambientes de produ\u00e7\u00e3o.<\/li>\n<li>Aplicar boas pr\u00e1ticas de monitoramento, seguran\u00e7a e otimiza\u00e7\u00e3o para <strong>PostgreSQL em produ\u00e7\u00e3o<\/strong>.<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Antes de iniciar os procedimentos desta aula, \u00e9 fundamental que voc\u00ea possua um ambiente m\u00ednimo preparado. Recomendamos a utiliza\u00e7\u00e3o de tr\u00eas servidores Linux para simular o cluster de alta disponibilidade, embora seja poss\u00edvel praticar com m\u00e1quinas virtuais em um \u00fanico host. Os pr\u00e9-requisitos b\u00e1sicos s\u00e3o: dom\u00ednio de linha de comando Linux, conhecimento de instala\u00e7\u00e3o de pacotes, familiaridade com arquivos de configura\u00e7\u00e3o do PostgreSQL e acesso administrativo (root ou sudo). Se voc\u00ea concluiu as aulas anteriores, j\u00e1 est\u00e1 apto a seguir esta etapa sem dificuldades.<\/p>\n<p>Nosso cen\u00e1rio de laborat\u00f3rio utiliza tr\u00eas n\u00f3s com as seguintes caracter\u00edsticas: <strong>node1<\/strong> (192.168.56.101), <strong>node2<\/strong> (192.168.56.102) e <strong>node3<\/strong> (192.168.56.103). Todos executam um sistema operacional Linux recente \u2014 voc\u00ea pode escolher entre <strong>Ubuntu 22.04 LTS<\/strong>, <strong>Debian 12<\/strong> ou <strong>Rocky Linux 9<\/strong> \/ <strong>CentOS Stream 9<\/strong>. Cada n\u00f3 deve ter o PostgreSQL instalado (vers\u00e3o 14 ou superior recomendada), juntamente com os pacotes de desenvolvimento e Python, pois o Patroni \u00e9 escrito em Python. \u00c9 importante que os tr\u00eas n\u00f3s consigam se comunicar entre si via rede, sem bloqueios de firewall entre as portas utilizadas (2379 para etcd, 5432 para PostgreSQL, 6432 para pgBouncer e 8008 para a API REST do Patroni).<\/p>\n<p>Al\u00e9m da infraestrutura, voc\u00ea precisar\u00e1 dos seguintes componentes instalados em cada n\u00f3: <strong>PostgreSQL<\/strong> (servidor e cliente), <strong>Python 3<\/strong> e <strong>pip<\/strong>, <strong>etcd<\/strong> (bin\u00e1rio ou pacote), <strong>Patroni<\/strong> (via pip) e <strong>pgBouncer<\/strong> (via pacote ou compila\u00e7\u00e3o). Nos exemplos a seguir, mostraremos os comandos para instalar cada componente em sistemas baseados em Debian (Ubuntu\/Debian) e em sistemas baseados em Red Hat (Rocky Linux\/CentOS\/RHEL). Acompanhe atentamente cada bloco, pois as diferen\u00e7as entre as fam\u00edlias de distribui\u00e7\u00f5es podem impactar o resultado final.<\/p>\n<p>Por fim, certifique-se de que cada n\u00f3 possua um nome de host \u00fanico e que o arquivo <strong>\/etc\/hosts<\/strong> contenha as entradas corretas para os tr\u00eas servidores. Isso evita problemas de resolu\u00e7\u00e3o de nomes e simplifica a configura\u00e7\u00e3o das ferramentas. Se voc\u00ea estiver utilizando um ambiente em nuvem ou cont\u00eaineres, adapte os endere\u00e7os IP conforme necess\u00e1rio. Lembre-se de que a consist\u00eancia entre os n\u00f3s \u00e9 um pilar da alta disponibilidade: todos os servidores devem ter a mesma vers\u00e3o do PostgreSQL e do Patroni para evitar incompatibilidades durante o failover.<\/p>\n<h3>Arquitetura de Alta Disponibilidade com Patroni e pgBouncer \u2014 Fundamentos Te\u00f3ricos<\/h3>\n<p>Antes de colocar a m\u00e3o na massa, \u00e9 essencial compreender como as pe\u00e7as se encaixam. O <strong>Patroni<\/strong> \u00e9 um template de orquestra\u00e7\u00e3o de alta disponibilidade para PostgreSQL, originalmente desenvolvido pela Zalando e hoje mantido pela comunidade. Ele funciona como um supervisor que controla o ciclo de vida de uma inst\u00e2ncia PostgreSQL em cada n\u00f3 do cluster. O Patroni utiliza um <strong>Distributed Consensus Store<\/strong> (DCS) para manter o estado do cluster e coordenar as elei\u00e7\u00f5es. O DCS mais comum \u00e9 o <strong>etcd<\/strong>, um armazenamento chave-valor distribu\u00eddo e consistente, projetado especificamente para esse tipo de cen\u00e1rio. Outras op\u00e7\u00f5es incluem ZooKeeper e Consul, mas o etcd \u00e9 o mais adotado em conjunto com o Patroni.<\/p>\n<p>O papel do Patroni \u00e9 garantir que, em qualquer momento, exista exatamente um n\u00f3 prim\u00e1rio (master) aceitando escritas, e que os demais n\u00f3s atuem como r\u00e9plicas (standby) prontas para assumir em caso de falha. Ele monitora a sa\u00fade da inst\u00e2ncia PostgreSQL via checagens peri\u00f3dicas, escreve atualiza\u00e7\u00f5es no etcd e, se detectar que o prim\u00e1rio n\u00e3o est\u00e1 respondendo, inicia automaticamente um processo de elei\u00e7\u00e3o. O Patroni tamb\u00e9m gerencia a configura\u00e7\u00e3o da replica\u00e7\u00e3o, ajustando automaticamente os par\u00e2metros do PostgreSQL conforme o papel do n\u00f3. Tudo isso \u00e9 exposto por uma <strong>API REST<\/strong> (porta 8008) e por um utilit\u00e1rio de linha de comando chamado <strong>patronictl<\/strong>, que permite inspecionar o estado do cluster, promover r\u00e9plicas, realizar failovers manuais e restaurar n\u00f3s.<\/p>\n<p>J\u00e1 o <strong>pgBouncer<\/strong> atua em uma camada diferente: ele \u00e9 um pooler de conex\u00f5es que fica entre a aplica\u00e7\u00e3o e o PostgreSQL. O PostgreSQL tradicionalmente cria um processo separado para cada conex\u00e3o, o que consome mem\u00f3ria e CPU \u00e0 medida que o n\u00famero de conex\u00f5es cresce. Em aplica\u00e7\u00f5es web, onde centenas de usu\u00e1rios podem gerar milhares de conex\u00f5es simult\u00e2neas (muitas vezes ociosas), esse modelo se torna um gargalo. O pgBouncer resolve isso mantendo um pool de conex\u00f5es persistentes com o banco e reutilizando-as entre os clientes. Ele suporta tr\u00eas modos de pooling: <strong>session<\/strong> (uma conex\u00e3o do cliente \u00e9 atribu\u00edda a uma conex\u00e3o do servidor durante toda a sess\u00e3o), <strong>transaction<\/strong> (a conex\u00e3o \u00e9 liberada ao final de cada transa\u00e7\u00e3o) e <strong>statement<\/strong> (liberada a cada statement). Em produ\u00e7\u00e3o, o modo <strong>transaction<\/strong> \u00e9 o mais recomendado para a maioria das cargas, pois oferece o melhor equil\u00edbrio entre compatibilidade e efici\u00eancia.<\/p>\n<p>Quando combinamos Patroni e pgBouncer, obtemos uma arquitetura robusta de <strong>PostgreSQL em produ\u00e7\u00e3o<\/strong>. O Patroni garante a disponibilidade dos dados e a continuidade do servi\u00e7o em caso de falha de um n\u00f3, enquanto o pgBouncer otimiza o uso de conex\u00f5es, reduzindo lat\u00eancia e prevenindo sobrecarga. Para o pgBouncer se integrar ao cluster gerenciado pelo Patroni, \u00e9 comum configur\u00e1-lo em cada n\u00f3 de aplica\u00e7\u00e3o ou em um servidor dedicado, apontando para o endere\u00e7o virtual do prim\u00e1rio do cluster. Em alguns cen\u00e1rios avan\u00e7ados, utiliza-se um proxy adicional, como o HAProxy, para rotear o tr\u00e1fego para o prim\u00e1rio correto, mas nesta aula focaremos na configura\u00e7\u00e3o direta do pgBouncer com o Patroni, usando a API REST para identificar o n\u00f3 prim\u00e1rio.<\/p>\n<h3>Passo a Passo \u2014 Instala\u00e7\u00e3o do etcd em PostgreSQL em produ\u00e7\u00e3o<\/h3>\n<p>O primeiro componente a ser instalado \u00e9 o <strong>etcd<\/strong>, pois ele serve como o c\u00e9rebro distribu\u00eddo do cluster. Nos ambientes baseados em Debian, o etcd est\u00e1 dispon\u00edvel nos reposit\u00f3rios oficiais, embora a vers\u00e3o possa variar. Para garantir uma vers\u00e3o est\u00e1vel e compat\u00edvel, recomendamos utilizar o bin\u00e1rio oficial do projeto ou o pacote dispon\u00edvel no reposit\u00f3rio da distribui\u00e7\u00e3o. Vamos demonstrar ambos os m\u00e9todos, come\u00e7ando pelo Ubuntu\/Debian.<\/p>\n<p>Em <strong>Ubuntu 22.04 LTS<\/strong> ou <strong>Debian 12<\/strong>, execute os seguintes comandos para instalar o etcd a partir do reposit\u00f3rio oficial:<\/p>\n<pre><code># Atualize a lista de pacotes e instale o etcd\nsudo apt update\nsudo apt install -y etcd\n\n# Verifique a vers\u00e3o instalada\netcd --version<\/code><\/pre>\n<p>Em <strong>Rocky Linux 9<\/strong> ou <strong>CentOS Stream 9<\/strong>, o etcd n\u00e3o est\u00e1 nos reposit\u00f3rios padr\u00e3o na vers\u00e3o mais recente, ent\u00e3o utilizaremos o bin\u00e1rio oficial. Execute:<\/p>\n<pre><code># Baixe o bin\u00e1rio do etcd (substitua a vers\u00e3o se necess\u00e1rio)\ncd \/tmp\ncurl -LO https:\/\/github.com\/etcd-io\/etcd\/releases\/download\/v3.5.11\/etcd-v3.5.11-linux-amd64.tar.gz\n\n# Extraia o arquivo baixado\ntar -xzf etcd-v3.5.11-linux-amd64.tar.gz\n\n# Mova os bin\u00e1rios para \/usr\/local\/bin\nsudo mv etcd-v3.5.11-linux-amd64\/etcd \/usr\/local\/bin\/\nsudo mv etcd-v3.5.11-linux-amd64\/etcdctl \/usr\/local\/bin\/\n\n# Verifique a vers\u00e3o instalada\netcd --version\netcdctl version<\/code><\/pre>\n<p>A sa\u00edda esperada para o comando de verifica\u00e7\u00e3o deve indicar a vers\u00e3o do etcd instalada, semelhante a:<\/p>\n<pre><code class=\"output\">etcd Version: 3.5.11\nGit SHA: d3c3a0e\nGo Version: go1.20.10\nGo OS\/Arch: linux\/amd64<\/code><\/pre>\n<p>Ap\u00f3s a instala\u00e7\u00e3o, \u00e9 necess\u00e1rio criar a estrutura de diret\u00f3rios e os arquivos de configura\u00e7\u00e3o. Em qualquer das distribui\u00e7\u00f5es, o etcd precisa de um diret\u00f3rio de dados, um usu\u00e1rio dedicado (recomendado) e um arquivo de unidade do systemd. Vamos configurar isso em cada um dos tr\u00eas n\u00f3s. Primeiro, crie o usu\u00e1rio e o diret\u00f3rio de dados:<\/p>\n<pre><code># Crie o usu\u00e1rio etcd (se n\u00e3o existir)\nsudo useradd -r -s \/sbin\/nologin etcd\n\n# Crie o diret\u00f3rio de dados e o diret\u00f3rio de configura\u00e7\u00e3o\nsudo mkdir -p \/var\/lib\/etcd\nsudo mkdir -p \/etc\/etcd\n\n# Ajuste as permiss\u00f5es\nsudo chown -R etcd:etcd \/var\/lib\/etcd\nsudo chown -R etcd:etcd \/etc\/etcd<\/code><\/pre>\n<p>Em seguida, crie o arquivo de configura\u00e7\u00e3o do etcd. O conte\u00fado completo abaixo deve ser ajustado com os nomes e IPs dos seus n\u00f3s. Este arquivo \u00e9 o mesmo nos tr\u00eas n\u00f3s, exceto pelos valores de <strong>name<\/strong>, <strong>initial-advertise-peer-urls<\/strong>, <strong>listen-peer-urls<\/strong>, <strong>listen-client-urls<\/strong> e <strong>advertise-client-urls<\/strong>, que devem refletir cada n\u00f3 espec\u00edfico.<\/p>\n<pre><code># Arquivo \/etc\/etcd\/etcd.conf (exemplo para node1)\n\n# Nome \u00fanico deste membro do cluster\nETCD_NAME=\"node1\"\n\n# Diret\u00f3rio onde os dados do etcd ser\u00e3o armazenados\nETCD_DATA_DIR=\"\/var\/lib\/etcd\"\n\n# URLs para comunica\u00e7\u00e3o entre os membros do cluster (peers)\nETCD_LISTEN_PEER_URLS=\"http:\/\/192.168.56.101:2380\"\nETCD_INITIAL_ADVERTISE_PEER_URLS=\"http:\/\/192.168.56.101:2380\"\n\n# URLs para comunica\u00e7\u00e3o com clientes (Patroni, etcdctl)\nETCD_LISTEN_CLIENT_URLS=\"http:\/\/192.168.56.101:2379,http:\/\/127.0.0.1:2379\"\nETCD_ADVERTISE_CLIENT_URLS=\"http:\/\/192.168.56.101:2379\"\n\n# Endere\u00e7os iniciais de todos os n\u00f3s do cluster\nETCD_INITIAL_CLUSTER=\"node1=http:\/\/192.168.56.101:2380,node2=http:\/\/192.168.56.102:2380,node3=http:\/\/192.168.56.103:2380\"\n\n# Token \u00fanico para o cluster (deve ser igual em todos os n\u00f3s)\nETCD_INITIAL_CLUSTER_TOKEN=\"postgresql-ha-token\"\n\n# Estado inicial do cluster (new para o primeiro boot)\nETCD_INITIAL_CLUSTER_STATE=\"new\"<\/code><\/pre>\n<p>Repita a cria\u00e7\u00e3o do arquivo nos demais n\u00f3s, ajustando os valores correspondentes. Depois, crie o arquivo de unidade do systemd para gerenciar o etcd. Em sistemas Debian, o pacote pode j\u00e1 incluir um servi\u00e7o; se voc\u00ea instalou via bin\u00e1rio, crie manualmente:<\/p>\n<pre><code># Arquivo \/etc\/systemd\/system\/etcd.service\n\n[Unit]\nDescription=etcd key-value store\nDocumentation=https:\/\/etcd.io\/docs\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=notify\nUser=etcd\nGroup=etcd\nExecStart=\/usr\/local\/bin\/etcd \\\n  --name=${ETCD_NAME} \\\n  --data-dir=${ETCD_DATA_DIR} \\\n  --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \\\n  --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \\\n  --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \\\n  --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \\\n  --initial-cluster=${ETCD_INITIAL_CLUSTER} \\\n  --initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \\\n  --initial-cluster-state=${ETCD_INITIAL_CLUSTER_STATE}\nEnvironmentFile=\/etc\/etcd\/etcd.conf\nRestart=always\nRestartSec=10s\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Ap\u00f3s criar o arquivo de servi\u00e7o, recarregue o systemd, habilite o servi\u00e7o para iniciar no boot e inicie-o em cada n\u00f3. Execute os seguintes comandos em todos os tr\u00eas servidores:<\/p>\n<pre><code># Recarregue as unidades do systemd\nsudo systemctl daemon-reload\n\n# Habilite o etcd para iniciar automaticamente no boot\nsudo systemctl enable etcd\n\n# Inicie o servi\u00e7o etcd\nsudo systemctl start etcd\n\n# Verifique o status do servi\u00e7o\nsudo systemctl status etcd --no-pager -l<\/code><\/pre>\n<p>A sa\u00edda esperada deve mostrar o servi\u00e7o ativo e em execu\u00e7\u00e3o, sem erros. Um exemplo de sa\u00edda bem-sucedida \u00e9:<\/p>\n<pre><code class=\"output\">\u25cf etcd.service - etcd key-value store\n     Loaded: loaded (\/etc\/systemd\/system\/etcd.service; enabled; vendor preset: enabled)\n     Active: active (running) since Sun 2026-09-20 10:15:32 UTC; 2s ago\n       Docs: https:\/\/etcd.io\/docs\n   Main PID: 1523 (etcd)\n      Tasks: 12 (limit: 2345)\n     Memory: 24.5M\n        CPU: 180ms\n     CGroup: \/system.slice\/etcd.service\n             \u2514\u25001523 \/usr\/local\/bin\/etcd --name=node1 --data-dir=\/var\/lib\/etcd ...<\/code><\/pre>\n<p>Com o etcd em execu\u00e7\u00e3o nos tr\u00eas n\u00f3s, voc\u00ea pode validar a sa\u00fade do cluster usando o <strong>etcdctl<\/strong>. Execute o comando abaixo em qualquer um dos n\u00f3s para listar os membros:<\/p>\n<pre><code># Liste os membros do cluster etcd\netcdctl --endpoints=http:\/\/192.168.56.101:2379 member list<\/code><\/pre>\n<p>A sa\u00edda deve mostrar os tr\u00eas n\u00f3s com seus respectivos IDs e endere\u00e7os, confirmando que o consenso foi estabelecido corretamente. Este \u00e9 um marco cr\u00edtico: sem o etcd saud\u00e1vel, o Patroni n\u00e3o conseguir\u00e1 coordenar o cluster PostgreSQL.<\/p>\n<h3>Instala\u00e7\u00e3o e Configura\u00e7\u00e3o do Patroni para PostgreSQL em produ\u00e7\u00e3o<\/h3>\n<p>Agora que o etcd est\u00e1 operacional, vamos instalar o <strong>Patroni<\/strong> em cada um dos tr\u00eas n\u00f3s. O Patroni \u00e9 distribu\u00eddo como um pacote Python e pode ser instalado via <strong>pip<\/strong> em um ambiente virtual ou diretamente no sistema. Para simplificar e manter a consist\u00eancia, recomendamos a instala\u00e7\u00e3o via <strong>pip3<\/strong> em um virtualenv, garantindo isolamento de depend\u00eancias. Os passos a seguir funcionam tanto em Debian quanto em Red Hat, desde que o Python e o pip estejam presentes.<\/p>\n<p>Primeiro, instale as depend\u00eancias de sistema necess\u00e1rias para o Patroni e para a integra\u00e7\u00e3o com o PostgreSQL. Em <strong>Ubuntu\/Debian<\/strong>, execute:<\/p>\n<pre><code># Instale as depend\u00eancias do sistema\nsudo apt update\nsudo apt install -y python3 python3-pip python3-venv libpq-dev postgresql-client\n\n# Crie um ambiente virtual para o Patroni\nsudo mkdir -p \/opt\/patroni\nsudo chown $USER:$USER \/opt\/patroni\npython3 -m venv \/opt\/patroni\/venv\n\n# Ative o ambiente virtual\nsource \/opt\/patroni\/venv\/bin\/activate\n\n# Instale o Patroni e o psycopg2 dentro do virtualenv\npip install patroni psycopg2-binary\n\n# Verifique a vers\u00e3o instalada\npatroni --version<\/code><\/pre>\n<p>Em <strong>Rocky Linux\/CentOS Stream<\/strong>, os comandos s\u00e3o ligeiramente diferentes devido ao gerenciador de pacotes. Execute:<\/p>\n<pre><code># Instale as depend\u00eancias do sistema\nsudo dnf install -y python3 python3-pip python3-virtualenv libpq-devel postgresql\n\n# Crie um ambiente virtual para o Patroni\nsudo mkdir -p \/opt\/patroni\nsudo chown $USER:$USER \/opt\/patroni\npython3 -m venv \/opt\/patroni\/venv\n\n# Ative o ambiente virtual\nsource \/opt\/patroni\/venv\/bin\/activate\n\n# Instale o Patroni e o psycopg2 dentro do virtualenv\npip install patroni psycopg2-binary\n\n# Verifique a vers\u00e3o instalada\npatroni --version<\/code><\/pre>\n<p>A sa\u00edda esperada para o comando de verifica\u00e7\u00e3o deve mostrar a vers\u00e3o do Patroni, algo como:<\/p>\n<pre><code class=\"output\">patroni 3.3.0<\/code><\/pre>\n<p>Com o Patroni instalado, precisamos criar seu arquivo de configura\u00e7\u00e3o principal. O Patroni utiliza um arquivo YAML para definir os par\u00e2metros de conex\u00e3o com o etcd, os dados da inst\u00e2ncia PostgreSQL, as op\u00e7\u00f5es de replica\u00e7\u00e3o e o endere\u00e7o da API REST. Vamos criar um arquivo chamado <strong>\/etc\/patroni\/patroni.yml<\/strong> em cada n\u00f3, ajustando os valores espec\u00edficos de cada m\u00e1quina. Abaixo est\u00e1 o conte\u00fado completo para o <strong>node1<\/strong>, com coment\u00e1rios explicativos:<\/p>\n<pre><code># Arquivo \/etc\/patroni\/patroni.yml (exemplo para node1)\n\n# Escopo do cluster \u2014 todos os n\u00f3s devem ter o mesmo valor\nscope: postgresql-ha\n\n# Nome deste n\u00f3 \u2014 deve ser \u00fanico para cada membro do cluster\nname: node1\n\n# Configura\u00e7\u00e3o do DCS (etcd)\nrestapi:\n  listen: 0.0.0.0:8008          # Porta da API REST do Patroni\n  connect_address: 192.168.56.101:8008  # Endere\u00e7o anunciado para outros n\u00f3s\n\netcd3:\n  hosts: 192.168.56.101:2379,192.168.56.102:2379,192.168.56.103:2379\n  # Lista de todos os n\u00f3s do etcd para toler\u00e2ncia a falhas\n\n# Configura\u00e7\u00f5es do PostgreSQL gerenciado pelo Patroni\nbootstrap:\n  dcs:\n    ttl: 30                    # Time-to-live para o lock de lideran\u00e7a no etcd\n    loop_wait: 10              # Intervalo entre as checagens do Patroni\n    retry_timeout: 10          # Tempo para tentar reconectar ao etcd\n    maximum_lag_on_failover: 1048576  # Lag m\u00e1ximo em bytes para failover\n    postgresql:\n      use_pg_rewind: true      # Habilita o pg_rewind para reintegra\u00e7\u00e3o\n      use_slots: true          # Usa replication slots para evitar perda de WAL\n      parameters:\n        wal_level: replica\n        hot_standby: \"on\"\n        max_connections: 100\n        max_worker_processes: 8\n        max_wal_senders: 10\n        max_replication_slots: 10\n        hot_standby_feedback: \"on\"\n        wal_log_hints: \"on\"\n        archive_mode: \"on\"\n        archive_command: '\/bin\/true'  # Placeholder; configure em produ\u00e7\u00e3o\n        synchronous_commit: \"on\"\n        synchronous_standby_names: '*'\n\n  initdb:\n    - encoding: UTF8\n    - data-checksums\n\n  pg_hba:\n    - host replication replicator 192.168.56.0\/24 md5\n    - host all all 192.168.56.0\/24 md5\n    - host all all 127.0.0.1\/32 trust\n\n  users:\n    admin:\n      password: adminpass123\n      options:\n        - createrole\n        - createdb\n    replicator:\n      password: replicapass123\n      options:\n        - replication\n\n# Configura\u00e7\u00e3o da inst\u00e2ncia PostgreSQL em si\npostgresql:\n  listen: 0.0.0.0:5432\n  connect_address: 192.168.56.101:5432\n  data_dir: \/var\/lib\/postgresql\/14\/main\n  bin_dir: \/usr\/lib\/postgresql\/14\/bin\n  pgpass: \/tmp\/pgpass\n  authentication:\n    replication:\n      username: replicator\n      password: replicapass123\n    superuser:\n      username: postgres\n      password: postgrespass123\n    rewind:\n      username: postgres\n      password: postgrespass123\n  parameters:\n    unix_socket_directories: '\/var\/run\/postgresql'\n\n# Tags para identifica\u00e7\u00e3o do n\u00f3\ntags:\n  nofailover: false\n  noloadbalance: false\n  clonefrom: false\n  nosync: false<\/code><\/pre>\n<p>Este arquivo deve ser replicado nos outros n\u00f3s, alterando os campos <strong>name<\/strong>, <strong>restapi.connect_address<\/strong> e <strong>postgresql.connect_address<\/strong> para corresponder a cada m\u00e1quina. Observe que o Patroni gerenciar\u00e1 a configura\u00e7\u00e3o do PostgreSQL automaticamente, incluindo a cria\u00e7\u00e3o do cluster no primeiro boot. Certifique-se de que os diret\u00f3rios referenciados existam e que o usu\u00e1rio postgres possua permiss\u00f5es adequadas.<\/p>\n<p>Depois de criar o arquivo de configura\u00e7\u00e3o, vamos criar a unidade de servi\u00e7o do systemd para o Patroni. O arquivo abaixo deve ser criado em <strong>\/etc\/systemd\/system\/patroni.service<\/strong> em todos os n\u00f3s:<\/p>\n<pre><code># Arquivo \/etc\/systemd\/system\/patroni.service\n\n[Unit]\nDescription=Patroni - PostgreSQL High Availability\nDocumentation=https:\/\/patroni.readthedocs.io\nAfter=network-online.target etcd.service\nWants=network-online.target\n\n[Service]\nType=simple\nUser=postgres\nGroup=postgres\nExecStart=\/opt\/patroni\/venv\/bin\/patroni \/etc\/patroni\/patroni.yml\nRestart=always\nRestartSec=5s\nLimitNOFILE=65536\nEnvironment=PATH=\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Ap\u00f3s criar o arquivo de servi\u00e7o em cada n\u00f3, execute os comandos abaixo para iniciar o Patroni. \u00c9 importante iniciar primeiro o n\u00f3 que ser\u00e1 o prim\u00e1rio inicial (por exemplo, o node1), aguardar alguns segundos e ent\u00e3o iniciar os demais n\u00f3s. O Patroni criar\u00e1 automaticamente o cluster PostgreSQL no primeiro n\u00f3 e configurar\u00e1 a replica\u00e7\u00e3o nos outros.<\/p>\n<pre><code># Recarregue as unidades do systemd\nsudo systemctl daemon-reload\n\n# Habilite o Patroni para iniciar no boot\nsudo systemctl enable patroni\n\n# Inicie o servi\u00e7o Patroni (comece pelo node1, depois node2 e node3)\nsudo systemctl start patroni\n\n# Verifique o status do servi\u00e7o no node1\nsudo systemctl status patroni --no-pager -l<\/code><\/pre>\n<p>A sa\u00edda esperada para o node1 deve mostrar o Patroni ativo e, nos logs, mensagens indicando a inicializa\u00e7\u00e3o do PostgreSQL e a aquisi\u00e7\u00e3o de lideran\u00e7a. Exemplo:<\/p>\n<pre><code class=\"output\">\u25cf patroni.service - Patroni - PostgreSQL High Availability\n     Loaded: loaded (\/etc\/systemd\/system\/patroni.service; enabled; vendor preset: enabled)\n     Active: active (running) since Sun 2026-09-20 10:22:45 UTC; 3s ago\n   Main PID: 2210 (patroni)\n      Tasks: 7 (limit: 2345)\n     Memory: 18.3M\n        CPU: 250ms\n     CGroup: \/system.slice\/patroni.service\n             \u2514\u25002210 \/opt\/patroni\/venv\/bin\/patroni \/etc\/patroni\/patroni.yml\nSep 20 10:22:45 node1 patroni[2210]: 2026-09-20 10:22:45,123 INFO: Lock owner: node1; I am node1\nSep 20 10:22:45 node1 patroni[2210]: 2026-09-20 10:22:45,456 INFO: pg_controldata:\nSep 20 10:22:45 node1 patroni[2210]:   PostgreSQL cluster state:  in production\nSep 20 10:22:45 node1 patroni[2210]: 2026-09-20 10:22:45,890 INFO: initialized a new cluster\nSep 20 10:22:45 node1 patroni[2210]: 2026-09-20 10:22:45,901 INFO: Lock owner: node1; I am node1\nSep 20 10:22:45 node1 patroni[2210]: 2026-09-20 10:22:45,912 INFO: No action. I am (node1), the leader<\/code><\/pre>\n<p>Ap\u00f3s iniciar o Patroni nos tr\u00eas n\u00f3s, voc\u00ea pode verificar o estado do cluster com o utilit\u00e1rio <strong>patronictl<\/strong>. Execute o comando abaixo:<\/p>\n<pre><code># Verifique o status do cluster\n\/opt\/patroni\/venv\/bin\/patronictl -c \/etc\/patroni\/patroni.yml list<\/code><\/pre>\n<p>A sa\u00edda esperada deve listar os tr\u00eas membros, destacando o l\u00edder e o estado da replica\u00e7\u00e3o:<\/p>\n<pre><code class=\"output\">+ Cluster: postgresql-ha (7381512345678901234) ----+----+-----------+\n| Member | Host                | Role    | State   | TL | Lag in MB |\n+--------+---------------------+---------+---------+----+-----------+\n| node1  | 192.168.56.101:5432 | Leader  | running |  1 |           |\n| node2  | 192.168.56.102:5432 | Replica | running |  1 |         0 |\n| node3  | 192.168.56.103:5432 | Replica | running |  1 |         0 |\n+--------+---------------------+---------+---------+----+-----------+<\/code><\/pre>\n<p>Neste momento, voc\u00ea tem um cluster PostgreSQL de alta disponibilidade totalmente funcional. O Patroni est\u00e1 monitorando a sa\u00fade do l\u00edder e das r\u00e9plicas, e o etcd est\u00e1 armazenando o estado do cluster de forma consistente. Qualquer falha no n\u00f3 prim\u00e1rio ser\u00e1 detectada automaticamente e uma nova elei\u00e7\u00e3o ser\u00e1 realizada em segundos.<\/p>\n<h3>Configura\u00e7\u00e3o Detalhada do pgBouncer para Pooling de Conex\u00f5es<\/h3>\n<p>Com o cluster PostgreSQL em alta disponibilidade operacional, o pr\u00f3ximo componente essencial para <strong>PostgreSQL em produ\u00e7\u00e3o<\/strong> \u00e9 o <strong>pgBouncer<\/strong>. Ele atua como um proxy de conex\u00f5es que reduz o overhead de abertura\/fechamento de conex\u00f5es, permitindo que milhares de clientes compartilhem um n\u00famero menor de conex\u00f5es reais com o banco. A instala\u00e7\u00e3o do pgBouncer pode ser feita via gerenciador de pacotes na maioria das distribui\u00e7\u00f5es. Em <strong>Ubuntu\/Debian<\/strong>, execute:<\/p>\n<pre><code># Instale o pgBouncer\nsudo apt update\nsudo apt install -y pgbouncer\n\n# Verifique a vers\u00e3o instalada\npgbouncer --version<\/code><\/pre>\n<p>Em <strong>Rocky Linux\/CentOS Stream<\/strong>, utilize o <strong>dnf<\/strong>:<\/p>\n<pre><code># Instale o pgBouncer\nsudo dnf install -y pgbouncer\n\n# Verifique a vers\u00e3o instalada\npgbouncer --version<\/code><\/pre>\n<p>A sa\u00edda esperada deve indicar a vers\u00e3o do pgBouncer, por exemplo:<\/p>\n<pre><code class=\"output\">PgBouncer 1.19.1\nlibevent 2.1.12-stable\nadns: evdns2\ntls: OpenSSL 3.0.2<\/code><\/pre>\n<p>O arquivo de configura\u00e7\u00e3o principal do pgBouncer est\u00e1 localizado em <strong>\/etc\/pgbouncer\/pgbouncer.ini<\/strong>. Vamos configur\u00e1-lo para apontar para o n\u00f3 prim\u00e1rio do cluster Patroni. Em um cen\u00e1rio ideal, voc\u00ea pode usar um endere\u00e7o virtual ou um proxy como o HAProxy para rotear automaticamente para o l\u00edder. Nesta aula, para simplificar, configuraremos o pgBouncer para se conectar ao endere\u00e7o IP do n\u00f3 prim\u00e1rio atual (node1), mas explicaremos como adaptar para o endere\u00e7o virtual. O conte\u00fado completo do arquivo \u00e9:<\/p>\n<pre><code># Arquivo \/etc\/pgbouncer\/pgbouncer.ini\n\n[databases]\n# Mapeie o banco de dados desejado para a inst\u00e2ncia do PostgreSQL\n# A sintaxe \u00e9: nome_do_pool = host=endere\u00e7o port=porta dbname=banco\n# Em produ\u00e7\u00e3o, substitua o IP pelo endere\u00e7o virtual do cluster\nappdb = host=192.168.56.101 port=5432 dbname=appdb\n\n# Para ambientes com HAProxy, voc\u00ea usaria algo como:\n# appdb = host=127.0.0.1 port=5432 dbname=appdb\n# e o HAProxy encaminharia para o prim\u00e1rio correto.\n\n[pgbouncer]\n# Endere\u00e7o e porta onde o pgBouncer escutar\u00e1 as conex\u00f5es dos clientes\nlisten_addr = 0.0.0.0\nlisten_port = 6432\n\n# Usu\u00e1rio do sistema operacional que executa o pgBouncer\nuser = postgres\ngroup = postgres\n\n# Arquivo de log\nlogfile = \/var\/log\/pgbouncer\/pgbouncer.log\npidfile = \/var\/run\/pgbouncer\/pgbouncer.pid\n\n# Modo de pooling: session, transaction ou statement\n# O modo transaction \u00e9 o recomendado para a maioria das aplica\u00e7\u00f5es web\npool_mode = transaction\n\n# N\u00famero m\u00e1ximo de conex\u00f5es que o pgBouncer aceitar\u00e1 dos clientes\nmax_client_conn = 1000\n\n# N\u00famero total de conex\u00f5es que o pgBouncer abrir\u00e1 com o PostgreSQL\ndefault_pool_size = 25\n\n# N\u00famero m\u00ednimo de conex\u00f5es por pool\nmin_pool_size = 5\n\n# Tempo de reserva de uma conex\u00e3o do pool (em segundos)\nreserve_pool_size = 5\n\n# Tempo m\u00e1ximo de vida de uma conex\u00e3o (em segundos)\nserver_lifetime = 3600\n\n# Tempo de inatividade antes de encerrar uma conex\u00e3o (em segundos)\nserver_idle_timeout = 60\n\n# Arquivo de autentica\u00e7\u00e3o dos clientes (senhas)\nauth_type = md5\nauth_file = \/etc\/pgbouncer\/userlist.txt\n\n# Configura\u00e7\u00f5es administrativas\nadmin_users = postgres\nstats_users = postgres\n\n# Habilitar consulta de estat\u00edsticas\nstats_period = 60\n\n# Log de conex\u00f5es\nlog_connections = 1\nlog_disconnections = 1\n\n# Timeouts\nquery_timeout = 0\nclient_idle_timeout = 0\n\n# Configura\u00e7\u00f5es de TLS (opcional)\n# client_tls_sslmode = prefer\n# client_tls_ca_file = \/etc\/pgbouncer\/ca.crt\n# client_tls_key_file = \/etc\/pgbouncer\/server.key\n# client_tls_cert_file = \/etc\/pgbouncer\/server.crt<\/code><\/pre>\n<p>Al\u00e9m do arquivo principal, o pgBouncer utiliza um arquivo de usu\u00e1rios para autentica\u00e7\u00e3o, chamado <strong>userlist.txt<\/strong>. Nele, voc\u00ea deve listar os usu\u00e1rios do PostgreSQL que poder\u00e3o se conectar atrav\u00e9s do pooler, juntamente com suas senhas (preferencialmente hashes MD5). Para gerar o hash MD5 da senha, utilize o comando <strong>pg_md5<\/strong>, que acompanha o pgBouncer:<\/p>\n<pre><code># Gere o hash MD5 da senha do usu\u00e1rio postgres\npg_md5 postgrespass123\n\n# Gere o hash MD5 da senha do usu\u00e1rio replicator (se necess\u00e1rio)\npg_md5 replicapass123<\/code><\/pre>\n<p>A sa\u00edda esperada para o primeiro comando \u00e9 algo como:<\/p>\n<pre><code class=\"output\">md5e8a5f2c1b3d4e5f6a7b8c9d0e1f2a3b4<\/code><\/pre>\n<p>Com os hashes em m\u00e3os, crie o arquivo <strong>\/etc\/pgbouncer\/userlist.txt<\/strong> no formato abaixo:<\/p>\n<pre><code># Arquivo \/etc\/pgbouncer\/userlist.txt\n\n# Usu\u00e1rio administrador do PostgreSQL\n\"postgres\" \"md5e8a5f2c1b3d4e5f6a7b8c9d0e1f2a3b4\"\n\n# Usu\u00e1rio de replica\u00e7\u00e3o (se necess\u00e1rio para aplica\u00e7\u00f5es)\n\"replicator\" \"md5f6e5d4c3b2a1908877665544332211ab\"<\/code><\/pre>\n<p>Ap\u00f3s configurar os arquivos, ajuste as permiss\u00f5es e inicie o servi\u00e7o do pgBouncer. Em distribui\u00e7\u00f5es baseadas em Debian, o servi\u00e7o pode ser gerenciado pelo systemd, mas primeiro edite o arquivo de configura\u00e7\u00e3o padr\u00e3o se necess\u00e1rio. Execute:<\/p>\n<pre><code># Ajuste as permiss\u00f5es dos arquivos de configura\u00e7\u00e3o\nsudo chown postgres:postgres \/etc\/pgbouncer\/pgbouncer.ini\nsudo chown postgres:postgres \/etc\/pgbouncer\/userlist.txt\nsudo chmod 600 \/etc\/pgbouncer\/userlist.txt\n\n# Crie o diret\u00f3rio de log\nsudo mkdir -p \/var\/log\/pgbouncer\nsudo chown postgres:postgres \/var\/log\/pgbouncer\n\n# Recarregue o systemd e inicie o pgBouncer\nsudo systemctl daemon-reload\nsudo systemctl enable pgbouncer\nsudo systemctl start pgbouncer\n\n# Verifique o status do servi\u00e7o\nsudo systemctl status pgbouncer --no-pager<\/code><\/pre>\n<p>A sa\u00edda esperada deve mostrar o pgBouncer ativo e escutando na porta 6432:<\/p>\n<pre><code class=\"output\">\u25cf pgbouncer.service - pgbouncer lightweight connection pooler\n     Loaded: loaded (\/lib\/systemd\/system\/pgbouncer.service; enabled; vendor preset: enabled)\n     Active: active (running) since Sun 2026-09-20 10:35:10 UTC; 1s ago\n   Main PID: 3012 (pgbouncer)\n      Tasks: 1 (limit: 2345)\n     Memory: 1.2M\n        CPU: 85ms\n     CGroup: \/system.slice\/pgbouncer.service\n             \u2514\u25003012 \/usr\/sbin\/pgbouncer \/etc\/pgbouncer\/pgbouncer.ini\nSep 20 10:35:10 node1 systemd[1]: Started pgbouncer lightweight connection pooler.<\/code><\/pre>\n<p>Para confirmar que o pgBouncer est\u00e1 operacional e aceitando conex\u00f5es, voc\u00ea pode se conectar a ele usando o cliente PostgreSQL, apontando para a porta 6432:<\/p>\n<pre><code># Conecte-se ao pgBouncer (que encaminhar\u00e1 para o PostgreSQL)\npsql -h 127.0.0.1 -p 6432 -U postgres -d appdb -c \"SELECT version();\"<\/code><\/pre>\n<p>A sa\u00edda esperada deve mostrar a vers\u00e3o do PostgreSQL, indicando que a conex\u00e3o foi estabelecida com sucesso atrav\u00e9s do pooler:<\/p>\n<pre><code class=\"output\">                                                                       version\n-----------------------------------------------------------------------------------------------------------------------------------------------------\n PostgreSQL 14.11 (Ubuntu 14.11-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit\n(1 row)<\/code><\/pre>\n<p>Neste ponto, a camada de pooling est\u00e1 configurada e pronta para uso. Em um ambiente real de <strong>PostgreSQL em produ\u00e7\u00e3o<\/strong>, voc\u00ea instalaria o pgBouncer em servidores de aplica\u00e7\u00e3o ou em um host dedicado, configurando o endere\u00e7o do host virtual do cluster para que as conex\u00f5es sejam sempre roteadas para o prim\u00e1rio atual, mesmo ap\u00f3s um failover.<\/p>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Agora que todos os componentes est\u00e3o instalados e configurados, \u00e9 hora de validar o funcionamento do cluster e do pooler. Esta se\u00e7\u00e3o \u00e9 obrigat\u00f3ria e tem como objetivo garantir que tudo esteja operando conforme o esperado. Vamos executar uma s\u00e9rie de comandos de verifica\u00e7\u00e3o e testes de failover para comprovar a resili\u00eancia da arquitetura.<\/p>\n<p>O primeiro teste \u00e9 consultar o status do cluster Patroni. Execute o comando <strong>patronictl list<\/strong> e verifique se todos os n\u00f3s est\u00e3o no estado <strong>running<\/strong> e se h\u00e1 um l\u00edder eleito:<\/p>\n<pre><code># Verifique o status do cluster\n\/opt\/patroni\/venv\/bin\/patronictl -c \/etc\/patroni\/patroni.yml list<\/code><\/pre>\n<p>A sa\u00edda esperada deve ser semelhante \u00e0 exibida anteriormente, com o node1 como Leader e os demais como Replica. Para obter mais detalhes sobre o l\u00edder e a replica\u00e7\u00e3o, use o comando <strong>patronictl show<\/strong>:<\/p>\n<pre><code># Mostre informa\u00e7\u00f5es detalhadas do cluster\n\/opt\/patroni\/venv\/bin\/patronictl -c \/etc\/patroni\/patroni.yml show postgresql-ha<\/code><\/pre>\n<p>Este comando exibir\u00e1 informa\u00e7\u00f5es como o endere\u00e7o do l\u00edder, o estado da replica\u00e7\u00e3o, o lag das r\u00e9plicas e a linha do tempo atual. Uma sa\u00edda bem-sucedida deve mostrar <strong>State: running<\/strong> e <strong>Role: Leader<\/strong> para o n\u00f3 prim\u00e1rio, al\u00e9m de <strong>Role: Replica<\/strong> com lag zero para os demais.<\/p>\n<p>Em seguida, teste a conectividade atrav\u00e9s do pgBouncer. Conecte-se ao pooler e execute uma consulta que insira dados em uma tabela de teste, verificando se a escrita chega ao PostgreSQL corretamente:<\/p>\n<pre><code># Crie uma tabela de teste via pgBouncer\npsql -h 127.0.0.1 -p 6432 -U postgres -d appdb -c \"CREATE TABLE IF NOT EXISTS teste_ha (id serial PRIMARY KEY, descricao text);\"\n\n# Insira um registro de teste\npsql -h 127.0.0.1 -p 6432 -U postgres -d appdb -c \"INSERT INTO teste_ha (descricao) VALUES ('Aula 24 - PostgreSQL em produ\u00e7\u00e3o');\"\n\n# Consulte os dados inseridos\npsql -h 127.0.0.1 -p 6432 -U postgres -d appdb -c \"SELECT * FROM teste_ha;\"<\/code><\/pre>\n<p>A sa\u00edda esperada para a \u00faltima consulta deve mostrar o registro inserido, confirmando que o pgBouncer est\u00e1 encaminhando as requisi\u00e7\u00f5es corretamente:<\/p>\n<pre><code class=\"output\"> id |            descricao\n----+----------------------------------\n  1 | Aula 24 - PostgreSQL em produ\u00e7\u00e3o\n(1 row)<\/code><\/pre>\n<p>Agora, o teste mais importante: o failover autom\u00e1tico. Para simular uma falha no n\u00f3 prim\u00e1rio, derrube o servi\u00e7o do Patroni no node1 (o l\u00edder atual) e observe o comportamento do cluster. Execute no node1:<\/p>\n<pre><code># Simule a queda do n\u00f3 prim\u00e1rio\nsudo systemctl stop patroni<\/code><\/pre>\n<p>Imediatamente ap\u00f3s parar o servi\u00e7o, monitore o estado do cluster a partir de outro n\u00f3, por exemplo, no node2. Execute repetidamente o comando <strong>patronictl list<\/strong> para acompan<\/p>\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de PostgreSQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20PostgreSQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning, &#8230; <a title=\"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer\" class=\"read-more\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/\" aria-label=\"Read more about Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer\">Ler mais<\/a><\/p>\n","protected":false},"author":1,"featured_media":3011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"iawp_total_views":0,"footnotes":""},"categories":[75],"tags":[3482],"class_list":["post-3012","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-postgresql-do-zero-ao-avancado-postgresql-em-producao-alta-disponibilidade-com-patroni-e-pgbouncer"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Thiago Paes Rodrigues\"\/>\n\t<meta name=\"google-site-verification\" content=\"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_BR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"100\" \/>\n\t\t<meta property=\"og:image:height\" content=\"75\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-09-20T21:18:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-20T21:18:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61590814880509\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#blogposting\",\"name\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer\",\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ai-image-1789939072019.jpg\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer\"},\"datePublished\":\"2026-09-20T18:18:01-03:00\",\"dateModified\":\"2026-09-20T18:18:01-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#webpage\"},\"articleSection\":\"DevOps, PostgreSQL \\u2014 Do Zero ao Avan\\u00e7ado: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#listItem\",\"name\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#listItem\",\"position\":3,\"name\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"telephone\":\"+552138277513\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-logo-mini.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61590814880509\",\"https:\\\/\\\/www.instagram.com\\\/jrtx.tech\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/\",\"name\":\"Thiago Paes Rodrigues\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#authorImage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/cropped-foto-rascunho3-96x96.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Thiago Paes Rodrigues\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/\",\"name\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions\",\"description\":\"Bem-vindo \\u00e0 aula final do curso PostgreSQL \\u2014 Do Zero ao Avan\\u00e7ado. Nesta etapa, vamos elevar o n\\u00edvel de exig\\u00eancia e mergulhar em um dos temas mais cr\\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\\u00e7\\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\\u00ea construiu bases s\\u00f3lidas em administra\\u00e7\\u00e3o, tuning,\",\"inLanguage\":\"pt-BR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ai-image-1789939072019.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#mainImage\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 24: PostgreSQL em produ\\u00e7\\u00e3o \\u2014 alta disponibilidade com Patroni e pgBouncer\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/20\\\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\\\/#mainImage\"},\"datePublished\":\"2026-09-20T18:18:01-03:00\",\"dateModified\":\"2026-09-20T18:18:01-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"alternateName\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"inLanguage\":\"pt-BR\",\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions","description":"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#blogposting","name":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions","headline":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer","author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/ai-image-1789939072019.jpg","width":1440,"height":1024,"caption":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer"},"datePublished":"2026-09-20T18:18:01-03:00","dateModified":"2026-09-20T18:18:01-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#webpage"},"articleSection":"DevOps, PostgreSQL \u2014 Do Zero ao Avan\u00e7ado: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","position":1,"name":"Home","item":"https:\/\/jrtx.com.br\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","position":2,"name":"DevOps","item":"https:\/\/jrtx.com.br\/blog\/category\/devops\/","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#listItem","name":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#listItem","position":3,"name":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer","previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}}]},{"@type":"Organization","@id":"https:\/\/jrtx.com.br\/blog\/#organization","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","url":"https:\/\/jrtx.com.br\/blog\/","telephone":"+552138277513","logo":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61590814880509","https:\/\/www.instagram.com\/jrtx.tech\/"]},{"@type":"Person","@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author","url":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/","name":"Thiago Paes Rodrigues","image":{"@type":"ImageObject","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#authorImage","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/cropped-foto-rascunho3-96x96.jpeg","width":96,"height":96,"caption":"Thiago Paes Rodrigues"}},{"@type":"WebPage","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/","name":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions","description":"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,","inLanguage":"pt-BR","isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#breadcrumblist"},"author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"creator":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/ai-image-1789939072019.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#mainImage","width":1440,"height":1024,"caption":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/#mainImage"},"datePublished":"2026-09-20T18:18:01-03:00","dateModified":"2026-09-20T18:18:01-03:00"},{"@type":"WebSite","@id":"https:\/\/jrtx.com.br\/blog\/#website","url":"https:\/\/jrtx.com.br\/blog\/","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","alternateName":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","inLanguage":"pt-BR","publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"}}]},"og:locale":"pt_BR","og:site_name":"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","og:type":"article","og:title":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions","og:description":"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/","og:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:secure_url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:width":100,"og:image:height":75,"article:published_time":"2026-09-20T21:18:01+00:00","article:modified_time":"2026-09-20T21:18:01+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer - BLOG - JRT Technology Solutions","twitter:description":"Bem-vindo \u00e0 aula final do curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, vamos elevar o n\u00edvel de exig\u00eancia e mergulhar em um dos temas mais cr\u00edticos para qualquer equipe de infraestrutura e banco de dados: PostgreSQL em produ\u00e7\u00e3o com alta disponibilidade. Ao longo das aulas anteriores, voc\u00ea construiu bases s\u00f3lidas em administra\u00e7\u00e3o, tuning,","twitter:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg"},"aioseo_meta_data":[],"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\/category\/devops\/\" title=\"DevOps\">DevOps<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/jrtx.com.br\/blog"},{"label":"DevOps","link":"https:\/\/jrtx.com.br\/blog\/category\/devops\/"},{"label":"Aula 24: PostgreSQL em produ\u00e7\u00e3o \u2014 alta disponibilidade com Patroni e pgBouncer","link":"https:\/\/jrtx.com.br\/blog\/2026\/09\/20\/aula-24-postgresql-em-producao-alta-disponibilidade-com-patr\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/3012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=3012"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/3012\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/3011"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=3012"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=3012"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=3012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}