Chapter 48. Seguimiento del progreso de la replicación

Los orígenes de replicación están destinados a facilitar la implementación de soluciones de replicación lógica sobre el decodificado lógico. Proporcionan una solución a dos problemas comunes:

Los orígenes de replicación tienen solo dos propiedades: un nombre y un ID. El nombre, que es lo que debe usarse para referirse al origen en todos los sistemas, es un text de formato libre. Debe utilizarse de manera que evite conflictos entre orígenes de replicación creados por diferentes soluciones de replicación; por ejemplo, anteponiendo el nombre de la solución de replicación. El ID se utiliza únicamente para evitar tener que almacenar la versión larga en situaciones donde la eficiencia de espacio es importante. Nunca debe compartirse entre sistemas.

Los orígenes de replicación se pueden crear utilizando la función pg_replication_origin_create(); eliminar utilizando pg_replication_origin_drop(); y ver en el catálogo del sistema pg_replication_origin.

Una parte no trivial de la construcción de una solución de replicación es realizar el seguimiento del progreso de la reproducción de manera segura. Cuando el proceso de aplicación, o todo el clúster, muere, es necesario poder averiguar hasta dónde se han replicado correctamente los datos. Las soluciones ingenuas a esto, como actualizar una fila en una tabla por cada transacción reproducida, tienen problemas como la sobrecarga de tiempo de ejecución y el hinchamiento (bloat) de la base de datos.

Utilizando la infraestructura de origen de replicación, una sesión se puede marcar como reproduciendo desde un nodo remoto (utilizando la función pg_replication_origin_session_setup()). Además, el LSN y la marca de tiempo de confirmación de cada transacción de origen se pueden configurar por transacción utilizando pg_replication_origin_xact_setup(). Si se hace esto, el progreso de la replicación persistirá de una manera tolerante a fallos (crash safe). El progreso de la reproducción para todos los orígenes de replicación se puede ver en la vista pg_replication_origin_status . El progreso de un origen individual, por ejemplo, al reanudar la replicación, se puede obtener utilizando pg_replication_origin_progress() para cualquier origen o pg_replication_origin_session_progress() para el origen configurado en la sesión actual.

En topologías de replicación más complejas que la replicación de exactamente un sistema a otro, otro problema puede ser que sea difícil evitar replicar nuevamente las filas ya reproducidas. Eso puede conducir tanto a ciclos en la replicación como a ineficiencias. Los orígenes de replicación proporcionan un mecanismo opcional para reconocer y prevenir esto. Cuando se configura utilizando las funciones mencionadas en el párrafo anterior, cada cambio y transacción pasada a las funciones de retorno (callbacks) del complemento de salida (consulta la Section 47.6) generada por la sesión se etiqueta con el origen de replicación de la sesión generadora. Esto permite tratarlos de manera diferente en el complemento de salida, por ejemplo, ignorando todas las filas excepto las de origen local. Además, la función de retorno filter_by_origin_cb se puede utilizar para filtrar el flujo de cambios de decodificación lógica basado en el origen. Aunque es menos flexible, el filtrado a través de esa función de retorno es considerablemente más eficiente que hacerlo en el complemento de salida.