He configurado una réplica de lectura para mi instancia de Amazon Relational Database Service (Amazon RDS) para PostgreSQL. Cuando consulto la réplica de lectura, aparece el error «cancelando la instrucción debido a un conflicto con la recuperación».
Resolución
Si hay un conflicto de replicación entre la instancia principal y la réplica de lectura, recibirá el error de la instrucción de cancelación. PostgreSQL no puede aplicar la información de WAL a la réplica de lectura porque los cambios pueden bloquear una actividad que está ocurriendo en la réplica de lectura. Por ejemplo, se ejecuta una instrucción DROP en la instancia principal cuando se ejecuta una instrucción SELECT en la tabla eliminada de la réplica de lectura. Si la réplica de lectura aplica el registro WAL y cancela la instrucción SELECT, recibirá el error de la instrucción de cancelación.
Para resolver el error de la instrucción de cancelación, defina parámetros personalizados en la réplica de lectura en función de los detalles del mensaje de error.
También puede usar la vista pg_stat_database_conflicts de la réplica de lectura para obtener estadísticas sobre las instrucciones que se cancelan debido a conflictos con la recuperación de la réplica de lectura. Para obtener más información, consulte 27.2.18 pg_stat_database_conflicts en el sitio web de PostgreSQL.
Detalles del mensaje de error: «El usuario mantuvo un bloqueo de relación durante demasiado tiempo»
Para resolver este problema, cambie los parámetros max_standby_streaming_delay o max_standby_archive_delay para que pase más tiempo antes de que la réplica de lectura cancele una instrucción de espera conflictiva. Si la réplica de lectura lee los datos de WAL de la replicación de streaming, modifique el parámetro max_standby_streaming_delay. Si la réplica de lectura lee los datos de WAL de la ubicación del archivo en Amazon Simple Storage Service (Amazon S3), modifique el parámetro max_standby_archive_delay.
Para obtener más información sobre estos parámetros, consulte max_standby_streaming_delay (integer) y max_standby_archive_delay (integer) en el sitio web de PostgreSQL.
Si establece el valor del parámetro en 0, la réplica de lectura cancela las consultas conflictivas y aplica las entradas de WAL en la instancia de réplica. Si establece el valor en -1, permite que la instancia de réplica espere indefinidamente para recibir consultas conflictivas y el retraso de replicación aumenta. En función de su caso de uso, ajuste los valores de estos parámetros para equilibrar la cancelación de consultas o el retraso de replicación.
Nota: Si aumenta max_standby_archive_delay para mantener las consultas que entran en conflicto con la lectura de las entradas del archivo WAL, se recomienda aumentar también max_standby_streaming_delay para evitar cancelaciones.
Detalles del mensaje de error: «Es posible que la consulta del usuario haya necesitado ver las versiones de filas que deben eliminarse»
Normalmente, este problema se produce cuando una transacción de la réplica de lectura lee tuplas que están configuradas para su eliminación en la instancia principal. Para resolver este problema, es posible que tenga que activar el parámetro hot_standby_feedback.
Cuando activa hot_standby_feedback, la réplica de lectura envía mensajes de comentarios a la instancia principal con información sobre la transacción activa más antigua. Como resultado, la instancia principal no elimina los registros que pueda necesitar la transacción. Para obtener más información sobre este parámetro, consulte hot_standby_feedback (boolean) en el sitio web de PostgreSQL.
Importante: El parámetro hot_standby_feedback está desactivado de forma predeterminada. Al activar hot_standby_feedback en la réplica de lectura, las consultas de larga duración en la réplica de lectura pueden provocar una sobrecarga de tablas en la instancia principal. Las operaciones de vacío no eliminan las tuplas inactivas (infladas) que pueden requerir las consultas de larga duración. Para reducir el riesgo de que se inflen, se recomienda reducir también autovacuum_threshold y autovacuum_vacuum_scale_factor y aumentar autovacuum_cost_limit.