pg_createsubscriber

pg_createsubscriber — convierte una réplica física en una nueva réplica lógica

Synopsis

pg_createsubscriber [option...] { -d | --database }dbname { -D | --pgdata }datadir { -P | --publisher-server }connstr

Descripción

pg_createsubscriber crea una nueva réplica lógica a partir de un servidor en espera físico (physical standby). Todas las tablas de la base de datos especificada se incluyen en la configuración de la replicación lógica. Se crea un par de objetos de publicación y suscripción para cada base de datos. Debe ejecutarse en el servidor de destino.

Tras una ejecución exitosa, el estado del servidor de destino es análogo a una nueva configuración de replicación lógica. La principal diferencia entre la configuración de replicación lógica y pg_createsubscriber es cómo se realiza la sincronización de datos. pg_createsubscriber no copia los datos iniciales de las tablas. Solo realiza la fase de sincronización, lo que garantiza que cada tabla se lleve a un estado sincronizado.

pg_createsubscriber está diseñado para sistemas de bases de datos grandes porque, en una configuración de replicación lógica, la mayor parte del tiempo se dedica a realizar la copia inicial de datos. Además, un efecto secundario de este largo tiempo dedicado a sincronizar datos suele ser una gran cantidad de cambios a aplicar (que se produjeron durante la copia inicial de datos), lo que aumenta aún más el tiempo en que la réplica lógica estará disponible. Para bases de datos más pequeñas, se recomienda configurar la replicación lógica con sincronización de datos inicial. Para más detalles, consulta la opción copy_data de CREATE SUBSCRIPTION.

Opciones

pg_createsubscriber acepta los siguientes argumentos de línea de comandos:

-a
--all

Crea una suscripción por base de datos en el servidor de destino. Las excepciones son las bases de datos de plantilla (template) y las bases de datos que no permiten conexiones. Para descubrir la lista de todas las bases de datos, se conecta al servidor de origen utilizando el nombre de la base de datos especificado en la cadena de conexión de --publisher-server, o si no se especifica, se utilizará la base de datos postgres, o si esta no existe, se utilizará template1. Se utilizan nombres generados automáticamente para las suscripciones, publicaciones y slots de replicación cuando se especifica esta opción. Esta opción no se puede utilizar junto con --database, --publication, --replication-slot o --subscription.

-d dbname
--database=dbname

El nombre de la base de datos en la que crear una suscripción. Se pueden seleccionar múltiples bases de datos escribiendo múltiples opciones -d. Esta opción no se puede utilizar junto con -a. Si no se proporciona la opción -d, el nombre de la base de datos se obtendrá de la opción -P. Si el nombre de la base de datos no se especifica en la opción -d ni en la opción -P, y no se especifica la opción -a, se informará de un error.

-D directory
--pgdata=directory

El directorio de destino que contiene un directorio de clúster de una réplica física.

-n
--dry-run

Realiza todo el proceso excepto modificar realmente el directorio de destino.

-p port
--subscriber-port=port

El número de puerto en el que el servidor de destino está escuchando conexiones. Por defecto, ejecuta el servidor de destino en el puerto 50432 para evitar conexiones de clientes no deseadas.

-P connstr
--publisher-server=connstr

La cadena de conexión al publicador (publisher). Para más detalles, consulta Section 32.1.1.

-s dir
--socketdir=dir

El directorio que se utilizará para los sockets del postmaster en el servidor de destino. El valor predeterminado es el directorio actual.

-t seconds
--recovery-timeout=seconds

El número máximo de segundos a esperar a que finalice la recuperación. Establecer en 0 lo desactiva. El valor predeterminado es 0.

-T
--enable-two-phase

Habilita la confirmación en dos fases (two_phase) para la suscripción. Cuando se especifican múltiples bases de datos, esta opción se aplica de manera uniforme a todas las suscripciones creadas en esas bases de datos. El valor predeterminado es false.

-U username
--subscriber-username=username

El nombre de usuario con el que conectarse en el servidor de destino. Por defecto, el nombre de usuario del sistema operativo actual.

-v
--verbose

Habilita el modo detallado (verbose). Esto hará que pg_createsubscriber envíe mensajes de progreso e información detallada sobre cada paso a la salida de error estándar. Repetir la opción hace que aparezcan mensajes de depuración adicionales en la salida de error estándar.

--clean=objtype

Elimina todos los objetos del tipo especificado de las bases de datos especificadas en el servidor de destino.

  • publications: Las publicaciones FOR ALL TABLES establecidas para este suscriptor siempre se eliminan; especificar este tipo de objeto hace que también se eliminen todas las demás publicaciones replicadas desde el servidor de origen.

Los objetos seleccionados para ser eliminados se registran individualmente, incluso durante un --dry-run. No hay oportunidad de influir o detener la eliminación de los objetos seleccionados, así que considera realizar una copia de seguridad de ellos mediante pg_dump.

--config-file=filename

Utiliza el archivo de configuración principal del servidor especificado para el directorio de datos de destino. pg_createsubscriber utiliza internamente el comando pg_ctl para iniciar y detener el servidor de destino. Te permite especificar el archivo de configuración postgresql.conf real si está almacenado fuera del directorio de datos.

--publication=name

El nombre de la publicación para configurar la replicación lógica. Se pueden especificar múltiples publicaciones escribiendo múltiples opciones --publication. El número de nombres de publicaciones debe coincidir con el número de bases de datos especificadas; de lo contrario, se informa de un error. El orden de las múltiples opciones de nombre de publicación debe coincidir con el orden de las opciones de base de datos. Si no se especifica esta opción, se asigna un nombre generado al nombre de la publicación. Esta opción no puede ser utilizada junto con --all.

--replication-slot=name

El nombre del slot de replicación para configurar la replicación lógica. Se pueden especificar múltiples slots de replicación escribiendo múltiples opciones --replication-slot. El número de nombres de slots de replicación debe coincidir con el número de bases de datos especificadas; de lo contrario, se informa de un error. El orden de las múltiples opciones de nombre de slot de replicación debe coincidir con el orden de las opciones de base de datos. Si esta opción no se especifica, se asigna el nombre de la suscripción al nombre del slot de replicación. Esta opción no se puede utilizar junto con --all.

--subscription=name

El nombre de la suscripción para configurar la replicación lógica. Se pueden especificar múltiples suscripciones escribiendo múltiples opciones --subscription. El número de nombres de suscripciones debe coincidir con el número de bases de datos especificadas; de lo contrario, se informa de un error. El orden de las múltiples opciones de nombre de suscripción debe coincidir con el orden de las opciones de base de datos. Si no se especifica esta opción, se asigna un nombre generado al nombre de la suscripción. Esta opción no puede ser utilizada junto con --all.

-V
--version

Muestra la versión de pg_createsubscriber y termina.

-?
--help

Muestra ayuda sobre los argumentos de línea de comandos de pg_createsubscriber y termina.

Notas

Prerrequisitos

Existen algunos prerrequisitos para que pg_createsubscriber convierta el servidor de destino en una réplica lógica. Si estos no se cumplen, se informará de un error. Los servidores de origen y destino deben tener la misma versión principal que el pg_createsubscriber. El directorio de datos de destino dado debe tener el mismo identificador de sistema que el directorio de datos de origen. El usuario de la base de datos proporcionado para el directorio de datos de destino debe tener privilegios para crear suscripciones y utilizar pg_replication_origin_advance().

El servidor de destino debe utilizarse como un standby físico. El servidor de destino debe tener max_active_replication_origins y max_logical_replication_workers configurados a un valor mayor o igual al número de bases de datos especificadas. El servidor de destino debe tener max_worker_processes configurado a un valor mayor que el número de bases de datos especificadas. El servidor de destino debe aceptar conexiones locales. Si estás planeando utilizar la opción --enable-two-phase, también necesitarás configurar el max_prepared_transactions de manera adecuada.

El servidor de origen debe aceptar conexiones desde el servidor de destino. El servidor de origen no debe estar en recuperación. El servidor de origen debe tener wal_level establecido en logical. El servidor de origen debe tener max_replication_slots configurado a un valor mayor o igual al número de bases de datos especificadas más los slots de replicación existentes. El servidor de origen debe tener max_wal_senders configurado a un valor mayor o igual al número de bases de datos especificadas y los procesos de envío de WAL (WAL sender) existentes.

Advertencias

Si pg_createsubscriber falla después de que se haya promovido el servidor de destino, es probable que el directorio de datos no se encuentre en un estado recuperable. En tal caso, se recomienda crear un nuevo servidor en espera (standby).

pg_createsubscriber generalmente inicia el servidor de destino con diferentes parámetros de conexión durante la transformación. Por lo tanto, las conexiones al servidor de destino deberían fallar.

Dado que los comandos DDL no son replicados por la replicación lógica, evita ejecutar comandos DDL que cambien el esquema de la base de datos mientras ejecutas pg_createsubscriber. Si el servidor de destino ya se ha convertido en una réplica lógica, es posible que los comandos DDL no se repliquen, lo que podría causar un error.

Si pg_createsubscriber falla durante el procesamiento, los objetos (publicaciones, slots de replicación) creados en el servidor de origen son eliminados. La eliminación podría fallar si el servidor de destino no se puede conectar al servidor de origen. En tal caso, un mensaje de advertencia informará sobre los objetos que quedaron. Si el servidor de destino se está ejecutando, se detendrá.

Si la replicación está utilizando primary_slot_name, se eliminará del servidor de origen después de la configuración de la replicación lógica.

Si el servidor de destino es una réplica síncrona, las confirmaciones de transacciones en el primario podrían esperar a la replicación mientras se ejecuta pg_createsubscriber.

A menos que se especifique la opción --enable-two-phase, pg_createsubscriber configura la replicación lógica con la confirmación en dos fases deshabilitada. Esto significa que cualquier transacción preparada se replicará en el momento del COMMIT PREPARED, sin preparación previa. Una vez completada la configuración, puedes eliminar y volver a crear manualmente las suscripciones con la opción two_phase habilitada.

pg_createsubscriber cambia el identificador del sistema utilizando pg_resetwal. Esto evitaría situaciones en las que el servidor de destino pudiera utilizar archivos WAL del servidor de origen. Si el servidor de destino tiene un standby, la replicación se romperá y se deberá crear un nuevo standby.

Pueden ocurrir fallos de replicación si faltan archivos WAL necesarios. Para evitar esto, el servidor de origen debe establecer max_slot_wal_keep_size en -1 para garantizar que los archivos WAL requeridos no se eliminen prematuramente.

Cómo funciona

La idea básica es tener un punto de inicio de replicación desde el servidor de origen y configurar una replicación lógica para comenzar desde este punto:

  1. Inicia el servidor de destino con las opciones de línea de comandos especificadas. Si el servidor de destino ya se está ejecutando, pg_createsubscriber terminará con un error.

  2. Comprueba si el servidor de destino se puede convertir. También se realizan algunas comprobaciones en el servidor de origen. Si no se cumple alguno de los prerrequisitos, pg_createsubscriber terminará con un error.

  3. Crea una publicación y un slot de replicación para cada base de datos especificada en el servidor de origen. Cada publicación se crea utilizando FOR ALL TABLES. Si no se especifica la opción --publication, la publicación tiene el siguiente patrón de nombre: pg_createsubscriber_%u_%x (parámetro: oid de la base de datos, int aleatorio). Si no se especifica la opción --replication-slot, el slot de replicación tiene el siguiente patrón de nombre: pg_createsubscriber_%u_%x (parámetros: oid de la base de datos, int aleatorio). Estos slots de replicación serán utilizados por las suscripciones en un paso posterior. El LSN del último slot de replicación se utiliza como punto de detención en el parámetro recovery_target_lsn y por las suscripciones como un punto de inicio de replicación. Esto garantiza que no se perderá ninguna transacción.

  4. Escribe los parámetros de recuperación en el directorio de datos de destino y reinicia el servidor de destino. Especifica un LSN (recovery_target_lsn) de la ubicación del registro de transacciones hasta el cual procederá la recuperación. También especifica promote como la acción que debe tomar el servidor una vez alcanzado el objetivo de recuperación. Se agregan parámetros de recuperación adicionales para evitar comportamientos inesperados durante el proceso de recuperación, como el fin de la recuperación tan pronto como se alcance un estado consistente (el WAL se debe aplicar hasta la ubicación de inicio de la replicación) y múltiples objetivos de recuperación que pueden causar un fallo. Este paso finaliza una vez que el servidor termina el modo de espera (standby) y acepta transacciones de lectura y escritura. Si se establece la opción --recovery-timeout, pg_createsubscriber termina si la recuperación no finaliza dentro del número de segundos especificado.

  5. Crea una suscripción para cada base de datos especificada en el servidor de destino. Si no se especifica la opción --subscription, la suscripción tiene el siguiente patrón de nombre: pg_createsubscriber_%u_%x (parámetros: oid de la base de datos, int aleatorio). No copia los datos existentes desde el servidor de origen. No crea un slot de replicación. En su lugar, utiliza el slot de replicación que se creó en un paso anterior. La suscripción se crea pero aún no está habilitada. La razón es que el progreso de la replicación debe establecerse en el punto de inicio de la replicación antes de comenzar la replicación.

  6. Elimina las publicaciones en el servidor de destino que fueron replicadas porque se crearon antes de la ubicación de inicio de la replicación. No tiene utilidad en el suscriptor.

  7. Establece el progreso de la replicación en el punto de inicio de la replicación para cada suscripción. Cuando el servidor de destino inicia el proceso de recuperación, se pone al día hasta el punto de inicio de la replicación. Este es el LSN exacto a utilizarse como ubicación inicial de replicación para cada suscripción. El nombre del origen de replicación se obtiene desde que se creó la suscripción. El nombre del origen de replicación y el punto de inicio de la replicación se utilizan en pg_replication_origin_advance() para configurar la ubicación inicial de la replicación.

  8. Habilita la suscripción para cada base de datos especificada en el servidor de destino. La suscripción comienza a aplicar transacciones desde el punto de inicio de la replicación.

  9. Si el servidor en espera estaba utilizando primary_slot_name, ya no tiene utilidad, por lo que se elimina.

  10. Si el servidor en espera contiene slots de replicación de failover, ya no se pueden sincronizar, por lo que se eliminan.

  11. Actualiza el identificador del sistema en el servidor de destino. Se ejecuta pg_resetwal para modificar el identificador del sistema. El servidor de destino se detiene como requisito de pg_resetwal.

Ejemplos

Para crear una réplica lógica para las bases de datos hr y finance a partir de una réplica física en foo:

$ pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance

Véase también

pg_basebackup