Quiero solucionar el alto consumo de almacenamiento en mi base de datos de origen de PostgreSQL cuando ejecuto una tarea de captura de datos de cambios (CDC) de AWS Database Migration Service (AWS DMS).
Descripción corta
Cuando utilizas PostgreSQL como origen de una tarea de CDC, AWS DMS utiliza ranuras de replicación lógica de PostgreSQL para obtener los cambios de la base de datos de origen. Las ranuras conservan los registros de escritura anticipada (WAL) que requiere AWS DMS, incluso cuando no se conectan las WAL al origen de PostgreSQL. AWS DMS solo elimina las WAL de PostgreSQL después de obtener los cambios necesarios de la ranura de replicación y avanza el proceso restart_lsn de la ranura de replicación.
Para más información, consulta Logical decoding concepts (Conceptos de decodificación lógica) en el sitio web de PostgreSQL.
Los problemas de volumen de almacenamiento pueden producirse por los siguientes motivos:
- Has detenido la tarea de CDC de AWS DMS durante mucho tiempo. Si no conectas AWS DMS a la base de datos de origen, no aplicará los cambios de la ranura de replicación del origen. Por lo tanto, PostgreSQL conserva las WAL de forma continua.
- Tienes una gran carga de trabajo que provoca una generación excesiva de WAL. Cuando utilizas ranuras de replicación lógica, PostgreSQL conserva las WAL si la ranura de replicación requiere los números de secuencia de registro (LSN).
- Tienes ranuras de replicación inactivas. Incluso cuando una ranura de replicación está inactiva, la WAL que conserva la ranura de replicación aún contiene información sobre la tabla, el esquema o la base de datos. Esto llena el espacio de almacenamiento del origen, incluso cuando no hay transacciones en las tablas.
Resolución
Comprobación para ver 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 provocan un uso elevado de espacio en disco en la base de datos de PostgreSQL, ejecuta una de las siguientes consultas:
Para PostgreSQL v9:
psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
Para PostgreSQL v10 y versiones posteriores:
psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
Resultado de ejemplo:
slot_name | replicationslotlag | active---------------------------------------------------------------+--------------------+--------
xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d | 129 GB | f
7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB | t
zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB | t
Si una ranura de replicación tiene un estado activo establecido en f (false), la base de datos no consume esa ranura.
Para eliminar las ranuras que no se utilicen, ejecuta la siguiente consulta:
psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');
Nota: Sustituye YOUR_SLOTNAME por el nombre de la ranura.
Para más información, consulta ¿Por qué he recibido el error «No space left on device» o «DiskFull» en Amazon Relational Database Service (Amazon RDS) para PostgreSQL?
Activación de la característica de latido de WAL
Para reducir el consumo de almacenamiento en una base de datos de origen de PostgreSQL, activa el atributo de conexión adicional (ECA)HeartBateEnable. Este atributo te permite evitar que el almacenamiento se complete en el origen de PostgreSQL.
Para activar la característica de latido de WAL, agrega el siguiente ECA al punto de enlace de origen de PostgreSQL:
heartbeatEnable=Y;
Nota: La transacción de latido se ejecuta en el origen solo si se está ejecutando una tarea de AWS DMS. Si detienes tus tareas de AWS DMS, la característica de latido de WAL no tendrá ningún efecto.
También puedes especificar los siguientes ECA:
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
El atributo heartbeatFrequency determina la frecuencia en minutos con la que se ejecuta la transacción de latidos en el origen de PostgreSQL. Sustituye la frecuencia por la regularidad con la que deseas que se ejecute la transacción. Por ejemplo, si estableces heartbeatFrequency en un valor de 15, AWS DMS ejecutará la transacción de latidos cada 15 minutos en el origen.
El atributo heartbeatSchema especifica en qué esquema de base de datos crea AWS DMS objetos de base de datos para generar la transacción de latidos. Sustituye schemaname por el esquema de tu base de datos.
Establecimiento del tamaño máximo de una ranura en PostgreSQL
Puedes aplicar max_slot_wal_keep_size en la base de datos de origen en la versión 13 y posteriores de PostgreSQL. Esto establece la cantidad máxima de WAL que pueden retener las ranuras de replicación. Para más información, consulta max_slot_wal_keep_size en el sitio web de PostgreSQL.
**Nota:**La configuración max_slot_wal_keep_size te permitirá evitar problemas con el almacenamiento completo del origen de PostgreSQL. Sin embargo, esto puede provocar que la base de datos de origen de PostgreSQL purgue las WAL antes de que la tarea CDC de AWS DMS lea los cambios de la ranura de replicación. Esto puede provocar un error en la tarea.
Información relacionada
Tipos de ranuras de replicación de PostgreSQL en el sitio web de Hevo