{"id":6863,"date":"2026-05-19T21:58:37","date_gmt":"2026-05-19T19:58:37","guid":{"rendered":"https:\/\/rootfan.com\/?p=6863"},"modified":"2026-05-27T15:05:08","modified_gmt":"2026-05-27T13:05:08","slug":"configuracion-de-repmgr-en-postgresql","status":"publish","type":"post","link":"https:\/\/rootfan.com\/es\/postgresql-repmgr-setup\/","title":{"rendered":"Configuraci\u00f3n de repmgr en PostgreSQL para replicaci\u00f3n con conmutaci\u00f3n por error autom\u00e1tica"},"content":{"rendered":"<p class=\"wp-block-paragraph\">PostgreSQL no incluye conmutaci\u00f3n por error autom\u00e1tica de f\u00e1brica.<br>Cuando el primario falla, alguien tiene que promover el secundario manualmente, lo que significa tiempo de inactividad.<br>repmgr a\u00f1ade un demonio de conmutaci\u00f3n por error autom\u00e1tica (repmgrd) que supervisa el cl\u00faster y promueve el standby en cuesti\u00f3n de segundos cuando el primario falla.<br>Esta gu\u00eda explica c\u00f3mo configurar un cl\u00faster PostgreSQL 18 de dos nodos con r\u00e9plica por streaming y conmutaci\u00f3n por error autom\u00e1tica en Ubuntu 24.04, utilizando repmgr 5.x.<br>Cada paso se ha ejecutado en tiempo real en un cl\u00faster real y la salida ha sido verificada.<\/p>\n\n\n\n<!--more-->\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Una copia en espera de transmisi\u00f3n continua que requiere una promoci\u00f3n manual no es una configuraci\u00f3n de alta disponibilidad, es una configuraci\u00f3n de recuperaci\u00f3n ante desastres.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La diferencia importa durante un incidente a las 3 AM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL incluye los componentes b\u00e1sicos para la replicaci\u00f3n, pero la l\u00f3gica de failover autom\u00e1tico reside en una herramienta separada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">repmgr es la herramienta a la que la mayor\u00eda de los administradores de bases de datos de PostgreSQL recurren primero: es ligera, est\u00e1 bien documentada y se integra limpiamente con systemd.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta gu\u00eda construye la pila completa: replicaci\u00f3n en streaming desde cero, repmgrd ejecut\u00e1ndose como un demonio y una falla autom\u00e1tica probada que recupera el cl\u00faster sin intervenci\u00f3n humana.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>\u00cdndice<\/h2><nav><ul><li><a href=\"#the-environment\">El medioambiente<\/a><\/li><li><a href=\"#step-1-install-postgre-sql-18-and-repmgr\">Paso 1 \u2014 Instalar PostgreSQL 18 y repmgr<\/a><\/li><li><a href=\"#step-2-configure-postgre-sql-for-streaming-replication\">Paso 2 \u2014 Configurar PostgreSQL para la replicaci\u00f3n por streaming<\/a><\/li><li><a href=\"#step-3-allow-replication-connections-in-pg-hba-conf\">Paso 3 \u2014 Permitir conexiones de replicaci\u00f3n en pg_hba.conf<\/a><\/li><li><a href=\"#step-4-create-the-repmgr-user-and-database\">Paso 4: Cree el usuario y la base de datos repmgr<\/a><\/li><li><a href=\"#step-5-configure-repmgr-on-both-nodes\">Paso 5: Configurar repmgr en ambos nodos<\/a><\/li><li><a href=\"#step-6-set-up-ssh-keys-and-passwordless-sudo\">Paso 6 \u2014 Configurar claves SSH y sudo sin contrase\u00f1a<\/a><\/li><li><a href=\"#step-7-register-the-primary-and-clone-the-standby\">Paso 7 \u2014 Registrar el Primario y Clonar el Secundario<\/a><\/li><li><a href=\"#step-8-start-repmgrd-for-automatic-failover\">Paso 8. Inicie repmgrd para la conmutaci\u00f3n por error autom\u00e1tica<\/a><\/li><li><a href=\"#step-9-test-automatic-failover\">Paso 9 \u2014 Probar la conmutaci\u00f3n por error autom\u00e1tica<\/a><\/li><li><a href=\"#step-10-rejoin-the-failed-node-as-a-standby\">Paso 10: Reincorporar el nodo fallido como en espera<\/a><\/li><li><a href=\"#frequently-asked-questions\">Preguntas frecuentes<\/a><ul><li><a href=\"#faq-question-1779206653802\">\u00bfrepmgr funciona con PostgreSQL 18?<\/a><\/li><li><a href=\"#faq-question-1779206654802\">\u00bfPor qu\u00e9 falla mi cambio planeado con \u201cno se pudo confirmar el apagado principal\u201d?<\/a><\/li><li><a href=\"#faq-question-1779206655802\">\u00bfPor qu\u00e9 repmgrd no activa la conmutaci\u00f3n por error a pesar de que el primario est\u00e1 ca\u00eddo?<\/a><\/li><li><a href=\"#faq-question-1779206656802\">\u00bfEl nodo degradado se reinicia autom\u00e1ticamente despu\u00e9s de un cambio de rol?<\/a><\/li><li><a href=\"#faq-question-1779206657802\">pg_rewind es una utilidad que se utiliza para acercar una base de datos PostgreSQL a un estado sincronizado con otra base de datos PostgreSQL. Es particularmente \u00fatil en escenarios de alta disponibilidad donde puede ser necesario reconectar un nodo de base de datos a un cl\u00faster despu\u00e9s de que se haya separado.\n\n**\u00bfPor qu\u00e9 es necesario para la reconexi\u00f3n de nodos?**\n\nCuando un nodo de base de datos se separa de un cl\u00faster (por ejemplo, debido a un problema de red o una falla del servidor), el contenido de su base de datos puede volverse diferente al del nodo principal o de otros nodos del cl\u00faster. Si este nodo se intenta reconectar sin m\u00e1s intervenci\u00f3n, podr\u00eda existir el riesgo de conflictos de datos o de que el nodo reconectado se presente como el \"estado m\u00e1s reciente\" cuando en realidad no lo es, lo que podr\u00eda llevar a la p\u00e9rdida de datos o a una inconsistencia general del cl\u00faster.\n\nAqu\u00ed es donde interviene `pg_rewind`:\n\n1.  **Identifica las diferencias:** `pg_rewind` compara los datos de la base de datos separada con una base de datos de origen (generalmente el nodo principal actual). Identifica qu\u00e9 bloques de datos han sido modificados en la base de datos separada y cu\u00e1les est\u00e1n desactualizados en comparaci\u00f3n con la base de datos de origen.\n\n2.  **Rebobina y reescribe:** En lugar de realizar una copia de seguridad y restauraci\u00f3n completa (que puede ser lenta y costosa en t\u00e9rminos de tiempo y recursos), `pg_rewind` \"rebobina\" la base de datos separada a un punto seguro en el tiempo (el \u00faltimo punto en el que estaba sincronizada con la fuente). Luego, reescribe selectivamente solo los bloques de datos que difieren y que son anteriores a ese punto de sincronizaci\u00f3n. B\u00e1sicamente, copia los bloques de datos necesarios del origen a la base de datos separada.\n\n**En resumen:**\n\n`pg_rewind` es una herramienta de recuperaci\u00f3n eficiente que permite que un nodo de base de datos previamente separado y con datos potencialmente divergentes se vuelva compatible y se sincronice r\u00e1pidamente con un cl\u00faster existente. Evita la necesidad de operaciones de restauraci\u00f3n completas, lo que minimiza el tiempo de inactividad y contribuye a la resiliencia del sistema de bases de datos.<\/a><\/li><\/ul><\/li><li><a href=\"#in-summary\">En resumen<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-environment\">El medioambiente<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Esta gu\u00eda utiliza dos servidores Ubuntu 24.04 en la misma subred.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Anfitri\u00f3n<\/th><th>PI<\/th><th>Rol inicial<\/th><\/tr><\/thead><tbody><tr><td>servidor1<\/td><td>192.168.0.181<\/td><td>Primario<\/td><\/tr><tr><td>servidor2<\/td><td>192.168.0.182<\/td><td>En espera<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL 18 y repmgr 5.5.0 est\u00e1n instalados desde el repositorio PGDG en ambos servidores.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-1-install-postgre-sql-18-and-repmgr\">Paso 1 \u2014 Instalar PostgreSQL 18 y repmgr<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL 18 no se encuentra en el repositorio predeterminado de Ubuntu 24.04.<br>En <code>postgresql-common<\/code> El paquete incluye un script oficial que agrega autom\u00e1ticamente el repositorio APT de PGDG y la clave de firma.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ambos servidores:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt install -y postgresql-common\nsudo \/usr\/share\/postgresql-common\/pgdg\/apt.postgresql.org.sh\n\nsudo apt update\nsudo apt install -y postgresql-18 postgresql-18-repmgr\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verifique la instalaci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\npsql --version\n# Expected: psql (PostgreSQL) 18.x\n\nrepmgr --version\n# Expected: repmgr 5.x\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En server2, detenga PostgreSQL y elimine el directorio de datos predeterminado.<br>repmgr clonar\u00e1 el directorio de datos del primario a server2 en un paso posterior; si ya existe un directorio de datos, <code>clonar r\u00e9plica de repmgr<\/code> se negar\u00e1 a proceder.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo systemctl stop postgresql\nsudo rm -rf \/var\/lib\/postgresql\/18\/main\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-2-configure-postgre-sql-for-streaming-replication\">Paso 2 \u2014 Configurar PostgreSQL para la replicaci\u00f3n por streaming<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Estos par\u00e1metros deben configurarse en <code>\/etc\/postgresql\/18\/main\/postgresql.conf<\/code> en ambos servidores antes de configurar la replicaci\u00f3n.<br>repmgr requiere <code>wal_log_hints<\/code> y <code>shared_preload_libraries<\/code> \u2014 sin ellos, el proceso de reincorporaci\u00f3n del nodo (pg_rewind) y el demonio repmgrd no funcionar\u00e1n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ambos servidores, edita <code>\/etc\/postgresql\/18\/main\/postgresql.conf<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\">\nlisten_addresses = &#8216;*'\nwal_level = replica\nmax_wal_senders = 10\nmax_replication_slots = 10\nhot_standby = on\nwal_log_hints = on\nshared_preload_libraries = &#8216;repmgr'\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Estos par\u00e1metros requieren un reinicio de PostgreSQL para que surtan efecto.<br>No reinicies todav\u00eda \u2014 a\u00f1ade la <code>pg_hba.conf<\/code> entrar primero para que no reinicie dos veces.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-3-allow-replication-connections-in-pg-hba-conf\">Paso 3 \u2014 Permitir conexiones de replicaci\u00f3n en pg_hba.conf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En ambos servidores, adjunta estas l\u00edneas a <code>\/etc\/postgresql\/18\/main\/pg_hba.conf<\/code>.<br>Estos permiten la <code>repmgr<\/code> para conectarse tanto a consultas de gesti\u00f3n como a streaming de WAL desde cualquier nodo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo tee -a \/etc\/postgresql\/18\/main\/pg_hba.conf &gt; \/dev\/null &lt;&lt; &#039;EOF&#039;\n\nhost    repmgr          repmgr          192.168.0.181\/32        scram-sha-256\nhost    repmgr          repmgr          192.168.0.182\/32        scram-sha-256\nhost    replication     repmgr          192.168.0.181\/32        scram-sha-256\nhost    replication     repmgr          192.168.0.182\/32        scram-sha-256\nEOF\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ahora reinicia PostgreSQL en server1 (server2 a\u00fan no tiene directorio de datos):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo systemctl restart postgresql\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-4-create-the-repmgr-user-and-database\">Paso 4: Cree el usuario y la base de datos repmgr<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ejecuta estos comandos en server1 (el principal) solamente.<br>El standby recibir\u00e1 el esquema repmgr a trav\u00e9s de la replicaci\u00f3n en un paso posterior.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres psql -c &quot;CREATE USER repmgr WITH SUPERUSER REPLICATION LOGIN PASSWORD &#039;repmgr&#039;;&quot;\nsudo -u postgres psql -c &quot;CREATE DATABASE repmgr OWNER repmgr;&quot;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A\u00f1adir un <code>.pgpass<\/code> archivo para el usuario del sistema operativo postgres en ambos servidores para que repmgr pueda conectarse sin solicitud de contrase\u00f1a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En server1:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres bash -c &#039;cat &gt; \/var\/lib\/postgresql\/.pgpass &lt;&lt;EOF\n192.168.0.181:5432:repmgr:repmgr:repmgr\n192.168.0.182:5432:repmgr:repmgr:repmgr\n192.168.0.181:5432:replication:repmgr:repmgr\n192.168.0.182:5432:replication:repmgr:repmgr\nEOF&#039;\nsudo chmod 600 \/var\/lib\/postgresql\/.pgpass\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En server2:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres bash -c &#039;cat &gt; \/var\/lib\/postgresql\/.pgpass &lt;&lt;EOF\n192.168.0.181:5432:repmgr:repmgr:repmgr\n192.168.0.182:5432:repmgr:repmgr:repmgr\n192.168.0.181:5432:replication:repmgr:repmgr\n192.168.0.182:5432:replication:repmgr:repmgr\nEOF&#039;\nsudo chmod 600 \/var\/lib\/postgresql\/.pgpass\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-5-configure-repmgr-on-both-nodes\">Paso 5: Configurar repmgr en ambos nodos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crear <code>\/etc\/repmgr.conf<\/code> en cada servidor.<br>En <code>pg_bindir<\/code> par\u00e1metro es requerido en Ubuntu \u2014 el <code>pg_rewind<\/code> binario no est\u00e1 en el PATH predeterminado para el usuario del sistema operativo postgres, y repmgr lo necesita durante la reintegraci\u00f3n de nodos despu\u00e9s de una conmutaci\u00f3n por error.<br>En <code>comando_inicio_servicio<\/code> y <code>comando_detener_servicio<\/code> par\u00e1metros son requeridos: sin <code>comando_detener_servicio<\/code>, los cambios de sistema planeados fallan con el mensaje \u201cno se pudo confirmar el apagado primario\u201d; sin <code>comando_inicio_servicio<\/code>, un nodo no puede volver a unirse autom\u00e1ticamente al cl\u00faster despu\u00e9s de ser rebobinado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En server1:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo tee \/etc\/repmgr.conf &gt; \/dev\/null &lt;&lt; &#039;EOF&#039;\nnode_id=1\nnode_name=&#039;server1&#039;\nconninfo=&#039;host=192.168.0.181 user=repmgr dbname=repmgr connect_timeout=2&#039;\ndata_directory=&#039;\/var\/lib\/postgresql\/18\/main&#039;\n\nfailover=automatic\npromote_command=&#039;repmgr standby promote -f \/etc\/repmgr.conf --log-to-file&#039;\nfollow_command=&#039;repmgr standby follow -f \/etc\/repmgr.conf --upstream-node-id=%n --log-to-file&#039;\n\nuse_replication_slots=yes\nmonitoring_history=yes\nlog_file=&#039;\/var\/log\/repmgr\/repmgr.log&#039;\n\npg_bindir=&#039;\/usr\/lib\/postgresql\/18\/bin&#039;\nservice_start_command=&#039;sudo systemctl start postgresql&#039;\nservice_stop_command=&#039;sudo systemctl stop postgresql&#039;\n\nnode_rejoin_timeout=120\nstandby_reconnect_timeout=120\nEOF\n\nsudo chown postgres:postgres \/etc\/repmgr.conf\nsudo chmod 640 \/etc\/repmgr.conf\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En server2, solo <code>node_id<\/code> y <code>nombre_nodo<\/code> diferir<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo tee \/etc\/repmgr.conf &gt; \/dev\/null &lt;&lt; &#039;EOF&#039;\nnode_id=2\nnode_name=&#039;server2&#039;\nconninfo=&#039;host=192.168.0.182 user=repmgr dbname=repmgr connect_timeout=2&#039;\ndata_directory=&#039;\/var\/lib\/postgresql\/18\/main&#039;\n\nfailover=automatic\npromote_command=&#039;repmgr standby promote -f \/etc\/repmgr.conf --log-to-file&#039;\nfollow_command=&#039;repmgr standby follow -f \/etc\/repmgr.conf --upstream-node-id=%n --log-to-file&#039;\n\nuse_replication_slots=yes\nmonitoring_history=yes\nlog_file=&#039;\/var\/log\/repmgr\/repmgr.log&#039;\n\npg_bindir=&#039;\/usr\/lib\/postgresql\/18\/bin&#039;\nservice_start_command=&#039;sudo systemctl start postgresql&#039;\nservice_stop_command=&#039;sudo systemctl stop postgresql&#039;\n\nnode_rejoin_timeout=120\nstandby_reconnect_timeout=120\nEOF\n\nsudo chown postgres:postgres \/etc\/repmgr.conf\nsudo chmod 640 \/etc\/repmgr.conf\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Crea el directorio de registros en ambos servidores:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo mkdir -p \/var\/log\/repmgr\nsudo chown postgres:postgres \/var\/log\/repmgr\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-6-set-up-ssh-keys-and-passwordless-sudo\">Paso 6 \u2014 Configurar claves SSH y sudo sin contrase\u00f1a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los cambios de configuraci\u00f3n planificados requieren que repmgr se conecte por SSH desde un nodo al otro como el usuario del sistema operativo postgres y ejecute <code>systemctl stop postgresql<\/code>.<br>Este paso es obligatorio; sin \u00e9l, los conmutadores fallan en el punto donde repmgr intenta detener el primario actual de forma remota.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Configuraci\u00f3n de claves SSH:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En server1 \u2014 generar una clave y mostrar la clave p\u00fablica:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo -u postgres ssh-keygen -t ed25519 -N &#039;&#039; -f \/var\/lib\/postgresql\/.ssh\/id_ed25519\nsudo -u postgres cat \/var\/lib\/postgresql\/.ssh\/id_ed25519.pub\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En server2 \u2014 autoriza la clave p\u00fablica de server1:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo -u postgres mkdir -p \/var\/lib\/postgresql\/.ssh\n# Paste the public key from server1 in place of &lt;server1-public-key&gt;\nsudo -u postgres bash -c &#039;echo &quot;&lt;server1-public-key&gt;&quot; &gt;&gt; \/var\/lib\/postgresql\/.ssh\/authorized_keys&#039;\nsudo chmod 700 \/var\/lib\/postgresql\/.ssh\nsudo chmod 600 \/var\/lib\/postgresql\/.ssh\/authorized_keys\nsudo chown -R postgres:postgres \/var\/lib\/postgresql\/.ssh\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Repite en la otra direcci\u00f3n: genera una clave en server2 y luego autor\u00edzala en server1:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo -u postgres ssh-keygen -t ed25519 -N &#039;&#039; -f \/var\/lib\/postgresql\/.ssh\/id_ed25519\nsudo -u postgres cat \/var\/lib\/postgresql\/.ssh\/id_ed25519.pub\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo -u postgres mkdir -p \/var\/lib\/postgresql\/.ssh\nsudo -u postgres bash -c &#039;echo &quot;&lt;server2-public-key&gt;&quot; &gt;&gt; \/var\/lib\/postgresql\/.ssh\/authorized_keys&#039;\nsudo chmod 700 \/var\/lib\/postgresql\/.ssh\nsudo chmod 600 \/var\/lib\/postgresql\/.ssh\/authorized_keys\nsudo chown -R postgres:postgres \/var\/lib\/postgresql\/.ssh\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verificar desde cada nodo (tipo <code>s\u00ed<\/code> si se le pide que acepte la clave del host \u2014solo la primera vez):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo -u postgres ssh postgres@192.168.0.182 &quot;echo OK&quot;\n# Expected: OK\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo -u postgres ssh postgres@192.168.0.181 &quot;echo OK&quot;\n# Expected: OK\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Sudo sin contrase\u00f1a \u2014 en ambos servidores:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crear <code>\/etc\/sudoers.d\/postgres-repmgr<\/code> para permitir que el usuario postgres inicie y detenga PostgreSQL sin contrase\u00f1a.<br>El camino debe ser <code>\/usr\/bin\/systemctl<\/code> \u2014 en Ubuntu 24.04 aqu\u00ed es donde vive systemctl, y sudo valida la ruta exacta.<br>El archivo debe tener permisos 440 \u2014 sudo ignora silenciosamente los archivos con permisos legibles por el mundo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo tee \/etc\/sudoers.d\/postgres-repmgr &gt; \/dev\/null &lt;&lt; &#039;EOF&#039;\npostgres ALL=(ALL) NOPASSWD: \/usr\/bin\/systemctl start postgresql, \/usr\/bin\/systemctl stop postgresql, \/usr\/bin\/systemctl restart postgresql\nEOF\nsudo chmod 440 \/etc\/sudoers.d\/postgres-repmgr\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verificar \u2014 no se espera solicitud de contrase\u00f1a:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres sudo systemctl status postgresql@18-main\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-7-register-the-primary-and-clone-the-standby\">Paso 7 \u2014 Registrar el Primario y Clonar el Secundario<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En server1, registre la instancia de PostgreSQL en ejecuci\u00f3n como nodo primario:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo -u postgres repmgr -f \/etc\/repmgr.conf primary register\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En server2, ejecuta primero una simulaci\u00f3n para confirmar la conectividad:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo -u postgres repmgr -h 192.168.0.181 -U repmgr -d repmgr \\\n  -f \/etc\/repmgr.conf standby clone --dry-run\n# Expected: &quot;STANDBY CLONE (target node \\&quot;server2\\&quot;) would complete successfully&quot;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Luego, ejecuta el clon real:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo -u postgres repmgr -h 192.168.0.181 -U repmgr -d repmgr \\\n  -f \/etc\/repmgr.conf standby clone\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En Ubuntu, <code>postgresql.conf<\/code> y <code>pg_hba.conf<\/code> vivir en <code>\/etc\/postgresql\/18\/main\/<\/code> \u2014 fuera del directorio de datos.<br><code>pg_basebackup<\/code> solo clona el directorio de datos, por lo que estos archivos de configuraci\u00f3n no se copian autom\u00e1ticamente.<br>C\u00f3pialos del servidor1 al servidor2:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1 \u2014 stage the files for transfer\nsudo cp \/etc\/postgresql\/18\/main\/postgresql.conf \/tmp\/postgresql.conf\nsudo cp \/etc\/postgresql\/18\/main\/pg_hba.conf \/tmp\/pg_hba.conf\nsudo chmod 644 \/tmp\/postgresql.conf \/tmp\/pg_hba.conf\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2 \u2014 copy and install\nscp fernando@192.168.0.181:\/tmp\/postgresql.conf \/tmp\/postgresql.conf\nscp fernando@192.168.0.181:\/tmp\/pg_hba.conf \/tmp\/pg_hba.conf\nsudo cp \/tmp\/postgresql.conf \/etc\/postgresql\/18\/main\/postgresql.conf\nsudo cp \/tmp\/pg_hba.conf \/etc\/postgresql\/18\/main\/pg_hba.conf\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Inicie PostgreSQL en el servidor2 y reg\u00edstrelo como un respaldo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo systemctl start postgresql\nsudo -u postgres repmgr -f \/etc\/repmgr.conf standby register\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verifica el cl\u00faster desde cualquiera de los nodos:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres repmgr -f \/etc\/repmgr.conf cluster show\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Salida esperada:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n ID | Name    | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string\n----+---------+---------+-----------+----------+----------+----------+----------+----------------------------------------------------------\n 1  | server1 | primary | * running |          | default  | 100      | 1        | host=192.168.0.181 user=repmgr dbname=repmgr connect_timeout=2\n 2  | server2 | standby |   running | server1  | default  | 100      | 1        | host=192.168.0.182 user=repmgr dbname=repmgr connect_timeout=2\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-8-start-repmgrd-for-automatic-failover\">Paso 8. Inicie repmgrd para la conmutaci\u00f3n por error autom\u00e1tica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">repmgrd es el demonio de monitoreo que activa la conmutaci\u00f3n autom\u00e1tica por error.<br>En Ubuntu 24.04, repmgr no incluye un archivo de unidad de systemd para repmgrd \u2014 in\u00edcielo manualmente utilizando <code>--demonio<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ambos servidores:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres repmgrd -f \/etc\/repmgr.conf --daemonize\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verifica que el demonio est\u00e9 en ejecuci\u00f3n y no en pausa:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres repmgr daemon status\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Salida esperada:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n ID | Name    | Role    | Status    | repmgrd Active | PID  | Paused? | Upstream\n----+---------+---------+-----------+----------------+------+---------+---------\n 1  | server1 | primary | * running | yes            | XXXX | no      | n\/a\n 2  | server2 | standby |   running | yes            | XXXX | no      | server1\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En <code>\u00bfPausado? no<\/code> la columna es cr\u00edtica \u2014 repmgrd se pausa a s\u00ed mismo despu\u00e9s de un intento fallido de failover y no intentar\u00e1 otro failover mientras est\u00e9 pausado.<br>Antes de cualquier prueba de conmutaci\u00f3n por error, verifique que ambos nodos muestren <code>\u00bfPausado? no<\/code>.<br>Si un nodo muestra <code>\u00bfPausado? s\u00ed<\/code>, ejecutar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres repmgr daemon unpause\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-9-test-automatic-failover\">Paso 9 \u2014 Probar la conmutaci\u00f3n por error autom\u00e1tica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Detener PostgreSQL en server1 para simular un fallo primario:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo systemctl stop postgresql\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En server2, observa la reacci\u00f3n de repmgrd:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo tail -f -n 50 \/var\/log\/repmgr\/repmgr.log\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">repmgrd espera un n\u00famero configurable de intentos de reconexi\u00f3n (predeterminado: 6 intentos \u00d7 10 segundos = ~60 segundos) antes de promover el standby.<br>Cuando la promoci\u00f3n se completa, el registro muestra:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nNOTICE: promoting standby to primary\nNOTICE: STANDBY PROMOTE successful\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verificar la nueva topolog\u00eda:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server2\nsudo -u postgres repmgr -f \/etc\/repmgr.conf cluster show\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">server2 es ahora el principal, server1 aparece como no disponible.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-10-rejoin-the-failed-node-as-a-standby\">Paso 10: Reincorporar el nodo fallido como en espera<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de la conmutaci\u00f3n por error, server1 necesita ser reintegrado.<br>PostgreSQL puede haber avanzado en server2 mientras server1 estaba ca\u00eddo; los directorios de datos ahora divergieron.<br>repmgr usa <code>pg_rewind<\/code> para sincronizar server1 con la l\u00ednea de tiempo del nuevo primario antes de iniciar la replicaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En server1, verifica que PostgreSQL est\u00e9 detenido, luego ejecuta:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# On server1\nsudo systemctl status postgresql@18-main\n# Expected: inactive (dead) \u2014 if active, stop it first: sudo systemctl stop postgresql\n\nsudo -u postgres repmgr node rejoin \\\n  -d &#039;host=192.168.0.182 user=repmgr dbname=repmgr&#039; \\\n  -f \/etc\/repmgr.conf \\\n  --force-rewind \\\n  --verbose\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>--forzar-rebobinado<\/code> indicar a repmgr que se ejecute <code>pg_rewind<\/code> independientemente de la verificaci\u00f3n de divergencia temporal.<br>En Ubuntu 24.04, la reconexi\u00f3n a veces falla por tiempo de espera antes de que PostgreSQL termine de iniciarse como respaldo.<br>Si el comando sale con un mensaje de tiempo de espera agotado pero el registro muestra que pg_rewind se complet\u00f3 con \u00e9xito, inicia PostgreSQL manualmente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl start postgresql\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Registrar el servidor server1 en los metadatos de repmgr e iniciar el demonio repmgrd.<br>En <code>--forzar<\/code> se requiere el indicador porque server1 se registr\u00f3 previamente como el principal:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres repmgr -f \/etc\/repmgr.conf standby register --force\nsudo -u postgres repmgrd -f \/etc\/repmgr.conf --daemonize\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Verifica que ambos nodos est\u00e9n ejecut\u00e1ndose:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo -u postgres repmgr -f \/etc\/repmgr.conf cluster show\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Esperado: server1 listado como en espera, server2 como principal.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"frequently-asked-questions\">Preguntas frecuentes<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list\">\n<div id=\"faq-question-1779206653802\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question\"><strong>\u00bfrepmgr funciona con PostgreSQL 18?<\/strong><\/h3>\n<div class=\"rank-math-answer\">\n\n<p>S\u00ed.<br \/>repmgr 5.5.0 es compatible con PostgreSQL 18.<br \/>Instale desde el repositorio PGDG usando el paquete postgresql-18-repmgr.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1779206654802\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question\"><strong>\u00bfPor qu\u00e9 falla mi cambio planeado con \u201cno se pudo confirmar el apagado principal\u201d?<\/strong><\/h3>\n<div class=\"rank-math-answer\">\n\n<p>El par\u00e1metro service_stop_command no est\u00e1 configurado en \/etc\/repmgr.conf.<br \/>repmgr necesita detener el primario actual a trav\u00e9s de SSH durante un cambio y requiere un comando expl\u00edcito para hacerlo.<br \/>A\u00f1ada service_stop_command='sudo systemctl stop postgresql' a \/etc\/repmgr.conf en ambos nodos.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1779206655802\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question\"><strong>\u00bfPor qu\u00e9 repmgrd no activa la conmutaci\u00f3n por error a pesar de que el primario est\u00e1 ca\u00eddo?<\/strong><\/h3>\n<div class=\"rank-math-answer\">\n\n<p>repmgrd est\u00e1 en pausa.<br \/>El demonio se detiene a s\u00ed mismo despu\u00e9s de un intento fallido de conmutaci\u00f3n por error para prevenir la promoci\u00f3n en cascada en escenarios de split-brain.<br \/>Ejecute el estado del demonio repmgr para verificar la columna Paused? y el demonio repmgr unpause para reanudar la supervisi\u00f3n.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1779206656802\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question\"><strong>\u00bfEl nodo degradado se reinicia autom\u00e1ticamente despu\u00e9s de un cambio de rol?<\/strong><\/h3>\n<div class=\"rank-math-answer\">\n\n<p>No.<br \/>repmgr detiene el primario antiguo durante el cambio pero no lo reinicia.<br \/>La documentaci\u00f3n oficial de repmgr afirma: El primario original se detendr\u00e1 en cualquier caso y deber\u00e1 reintegrarse manualmente en el cl\u00faster de replicaci\u00f3n.<br \/>Una vez que se complete el cambio de rol, ejecuta sudo systemctl start postgresql en el nodo degradado para que vuelva a ser un nodo en espera.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1779206657802\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question\"><strong>pg_rewind es una utilidad que se utiliza para acercar una base de datos PostgreSQL a un estado sincronizado con otra base de datos PostgreSQL. Es particularmente \u00fatil en escenarios de alta disponibilidad donde puede ser necesario reconectar un nodo de base de datos a un cl\u00faster despu\u00e9s de que se haya separado.\n\n**\u00bfPor qu\u00e9 es necesario para la reconexi\u00f3n de nodos?**\n\nCuando un nodo de base de datos se separa de un cl\u00faster (por ejemplo, debido a un problema de red o una falla del servidor), el contenido de su base de datos puede volverse diferente al del nodo principal o de otros nodos del cl\u00faster. Si este nodo se intenta reconectar sin m\u00e1s intervenci\u00f3n, podr\u00eda existir el riesgo de conflictos de datos o de que el nodo reconectado se presente como el \"estado m\u00e1s reciente\" cuando en realidad no lo es, lo que podr\u00eda llevar a la p\u00e9rdida de datos o a una inconsistencia general del cl\u00faster.\n\nAqu\u00ed es donde interviene `pg_rewind`:\n\n1.  **Identifica las diferencias:** `pg_rewind` compara los datos de la base de datos separada con una base de datos de origen (generalmente el nodo principal actual). Identifica qu\u00e9 bloques de datos han sido modificados en la base de datos separada y cu\u00e1les est\u00e1n desactualizados en comparaci\u00f3n con la base de datos de origen.\n\n2.  **Rebobina y reescribe:** En lugar de realizar una copia de seguridad y restauraci\u00f3n completa (que puede ser lenta y costosa en t\u00e9rminos de tiempo y recursos), `pg_rewind` \"rebobina\" la base de datos separada a un punto seguro en el tiempo (el \u00faltimo punto en el que estaba sincronizada con la fuente). Luego, reescribe selectivamente solo los bloques de datos que difieren y que son anteriores a ese punto de sincronizaci\u00f3n. B\u00e1sicamente, copia los bloques de datos necesarios del origen a la base de datos separada.\n\n**En resumen:**\n\n`pg_rewind` es una herramienta de recuperaci\u00f3n eficiente que permite que un nodo de base de datos previamente separado y con datos potencialmente divergentes se vuelva compatible y se sincronice r\u00e1pidamente con un cl\u00faster existente. Evita la necesidad de operaciones de restauraci\u00f3n completas, lo que minimiza el tiempo de inactividad y contribuye a la resiliencia del sistema de bases de datos.<\/strong><\/h3>\n<div class=\"rank-math-answer\">\n\n<p>pg_rewind resincroniza un directorio de datos de PostgreSQL que se ha desviado de la l\u00ednea de tiempo primaria.<br \/>Esto sucede despu\u00e9s de una conmutaci\u00f3n por error: la antigua principal puede haber confirmado transacciones que no se replicaron antes de que fallara.<br \/>pg_rewind reemplaza esos bloques divergidos con los datos correctos del nuevo primario, permitiendo que el nodo reanude la replicaci\u00f3n sin una copia de seguridad base completa.<br \/>wal_log_hints = on debe estar configurado en postgresql.conf para que pg_rewind funcione.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"in-summary\">En resumen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La replicaci\u00f3n en streaming de PostgreSQL est\u00e1 integrada; el failover autom\u00e1tico requiere repmgr.<br>La configuraci\u00f3n involucra seis partes m\u00f3viles que deben estar correctas: configuraci\u00f3n de PostgreSQL, configuraci\u00f3n de repmgr, claves SSH entre los usuarios de postgres, sudo sin contrase\u00f1a para la gesti\u00f3n de servicios, ranuras de replicaci\u00f3n y repmgrd en ejecuci\u00f3n y sin pausa.<br>Los puntos de fallo m\u00e1s comunes son los permisos del archivo sudoers (deben ser 440, no 644) y la ausencia de <code>comando_detener_servicio<\/code> para cambios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que el cl\u00faster est\u00e9 en funcionamiento, el siguiente paso es agregar una IP virtual flotante con Keepalived para que las aplicaciones siempre se conecten autom\u00e1ticamente a la principal actual. Consulte <a href=\"https:\/\/rootfan.com\/es\/postgresql-repmgr-con-keepalived\/\">PostgreSQL repmgr con Keepalived Agregando un VIP Flotante<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si est\u00e1s construyendo un cl\u00faster de alta disponibilidad de PostgreSQL para un entorno de producci\u00f3n y buscas una segunda opini\u00f3n sobre la arquitectura antes de comprometerte, <a href=\"https:\/\/rootfan.com\/es\/servicios\/\">ponerse en contacto<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>PostgreSQL no incluye conmutaci\u00f3n por error autom\u00e1tica de f\u00e1brica. Cuando el primario falla, alguien tiene que promocionar el secundario manualmente, lo que significa tiempo de inactividad. repmgr a\u00f1ade un demonio de conmutaci\u00f3n por error autom\u00e1tica (repmgrd) que supervisa el cl\u00faster y promociona el secundario en segundos cuando falla el primario. Esta gu\u00eda repasa la configuraci\u00f3n de un cl\u00faster de PostgreSQL 18 de dos nodos... <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/rootfan.com\/es\/postgresql-repmgr-setup\/\" class=\"more-link\">Seguir leyendo<span class=\"screen-reader-text\"> \u201cConfiguraci\u00f3n de replicaci\u00f3n de repmgr en PostgreSQL con conmutaci\u00f3n por error autom\u00e1tica\u201d<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":6864,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_focus_keyword":"postgresql repmgr automatic failover","rank_math_title":"%title% %sep% %sitename%","rank_math_description":"Step-by-step guide to setting up a two-node PostgreSQL 18 cluster with streaming replication and automatic failover using repmgr 5.x on Ubuntu 24.04. Includes common pitfalls and how to avoid them.","rank_math_robots":"","rank_math_og_title":"","rank_math_og_description":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[126],"tags":[127,81],"class_list":["post-6863","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","tag-architecture","tag-step-by-step"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/rootfan.com\/wp-content\/uploads\/pexels-photo-37455405.jpeg?fit=975%2C1300&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts\/6863","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/comments?post=6863"}],"version-history":[{"count":5,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts\/6863\/revisions"}],"predecessor-version":[{"id":6881,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts\/6863\/revisions\/6881"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/media\/6864"}],"wp:attachment":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/media?parent=6863"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/categories?post=6863"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/tags?post=6863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}