¿Por qué veo un alto consumo de almacenamiento en mi base de datos de origen de PostgreSQL cuando ejecuto una tarea de CDC de AWS DMS?

Última actualización: 25-07-2022

Estoy ejecutando una tarea de captura de datos de cambio (CDC) de AWS Database Migration Service (AWS DMS) y utilizo una base de datos PostgreSQL como origen. ¿Por qué veo un alto consumo de almacenamiento en mi base de datos de origen cuando ejecuto una tarea de CDC de AWS DMS?

Descripción corta

Cuando utiliza PostgreSQL como origen para una tarea de CDC, AWS DMS utiliza ranuras de replicación lógicas, una función de PostgreSQL, para obtener los cambios de la base de datos de origen. Estas ranuras representan un flujo de operaciones que se reproducen en el mismo orden en que se realizaron en la base de datos de origen de PostgreSQL.

Por diseño, las ranuras de replicación lógica vuelven a entrenar los registros de traducción (WAL) que requiere AWS DMS, incluso cuando no están conectados al origen de PostgreSQL. Por lo tanto, el WAL se elimina de PostgreSQL solo después de que AWS DMS confirme que ha obtenido los cambios que necesita de la ranura de replicación. AWS DMS confirma que tiene los cambios necesarios al avanzar el restart_lsn de la ranura de replicación.

Causas del alto consumo de almacenamiento en un origen de PostgreSQL

Debido a la forma en que PostgreSQL implementa la función de ranura de replicación lógica, en algunos escenarios, pueden producirse problemas de volumen de almacenamiento en la base de datos de origen.

  • La tarea de CDC de AWS DMS se detiene durante mucho tiempo, lo que significa que AWS DMS no está conectado a la base de datos de origen y no consume cambios de la ranura de replicación de la fuente. Esto significa que PostgreSQL conserva el WAL de forma continua sin eliminar el WAL anterior que no haya leído AWS DMS. Por lo tanto, el almacenamiento de la base de datos de origen acaba llenándose.
  • Carga de trabajo intensa: las cargas de trabajo intensas que provocan una generación excesiva del WAL también pueden provocar que el almacenamiento se llene en una base de datos de PostgreSQL cuando se utilizan las ranuras de replicación lógica. Esto ocurre porque PostgreSQL aún conserva el WAL si la ranura de replicación requiere los números de secuencia de registro (LSN).
  • Ranuras de replicación inactivas: incluso si una tabla, esquema o base de datos desde la que AWS DMS está replicando cambios está inactiva, el WAL que retiene la ranura de replicación sigue conteniendo información sobre esa tabla, esquema o base de datos. Esto hace que el almacenamiento se llene en el origen, incluso si las tablas no tienen transacciones en ellas.

Resolución

Compruebe si las ranuras de replicación provocan un uso elevado del espacio en disco en el origen de PostgreSQL

Para comprobar si las ranuras de replicación son la causa del uso elevado de espacio del disco en la base de datos de PostgreSQL, ejecute las consultas que aparecen en ¿Por qué recibí un error “No space left on device” (No hay más espacio libre en el dispositivo) o “DiskFull” (Disco lleno) en Amazon RDS para PostgreSQL?

Nota: Muchas de estas consultas se pueden usar en instalaciones de PostgreSQL autogestionadas.

Activar la función de latido del corazón del WAL

Active la función de latido del WAL en AWS DMS para evitar consumir almacenamiento en una base de datos de origen de PostgreSQL. Esta función imita una transacción ficticia para que las ranuras de replicación lógica inactivas no retengan registros del WAL antiguos. Este latido mantiene restart_lsn en movimiento e impide que el almacenamiento se llene en el origen de PostgreSQL.

Para activar la función de latido del WAL, agregue este atributo de conexión adicional (ECA) al punto de conexión de origen de PostgreSQL:

heartbeatEnable=Y;

Si lo desea, especifique estos ECA adicionales:

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

heartbeatFrequency determina la frecuencia (en minutos) con la que se ejecuta la transacción de latidos en el origen de PostgreSQL. Por ejemplo, si establece heartbeatFrequency en un valor de 15, AWS DMS ejecuta la transacción de latido cada 15 minutos en el origen.

HeartbeatSchema especifica en qué esquema de base de datos crea AWS DMS los objetos de base de datos para generar la transacción de latido.

Nota: La transacción de latido se ejecuta en el origen solo si se está ejecutando una tarea de AWS DMS. Si sus tareas de AWS DMS se detienen, la función de latido del WAL no tiene efecto.

Limitar el tamaño de una ranura en PostgreSQL

Puede aplicar max_slot_wal_keep_size en la base de datos de origen en PostgreSQL 13 y posteriores. Esto establece la cantidad máxima del WAL que pueden retener las ranuras de replicación.

Nota: La configuración max_slot_wal_keep_size puede ayudarle a evitar problemas de almacenamiento completo en el origen de PostgreSQL. Sin embargo, también puede hacer que el WAL se elimine del origen antes de que la tarea de CDC de AWS DMS pueda leer sus cambios desde la ranura de replicación. Por lo tanto, la tarea falla.