Cómo funciona la replicación de streaming en diferentes versiones de RDS para PostgreSQL - Amazon Relational Database Service

Cómo funciona la replicación de streaming en diferentes versiones de RDS para PostgreSQL

Como se discute en Configuración de réplicas de lectura con PostgreSQL, RDS para PostgreSQL utiliza el protocolo de replicación de streaming nativo de PostgreSQL para enviar datos WAL desde la instancia de base de datos de origen. Envía datos WAL de origen a réplicas de lectura tanto para réplicas de lectura dentro de la región como entre regiones. Con la versión 9.4, PostgreSQL introdujo slots de replicación física como mecanismo de soporte para el proceso de replicación.

Una slot de replicación física impide que una instancia de base de datos de origen elimine los datos WAL antes de que todas las réplicas de lectura los consuman. Cada réplica de lectura tiene su propia slot física en la instancia de base de datos de origen. La slot realiza un seguimiento del WAL más antiguo (por número de secuencia lógica, LSN) que podría necesitar la réplica. Después de que todas las slots y conexiones de base de datos hayan progresado más allá de un WAL (LSN) determinado, ese LSN se convierte en candidato para su eliminación en el siguiente punto de control.

Amazon RDS utiliza Amazon S3 para archivar datos WAL. En las réplicas de lectura dentro de la región, puede utilizar estos datos archivados para recuperar la réplica de lectura cuando sea necesario. Un ejemplo de cuándo podría hacerse es si la conexión entre la base de datos de origen y la réplica de lectura se interrumpe por cualquier motivo.

En la tabla siguiente, encontrará un resumen de las diferencias entre las versiones de PostgreSQL y los mecanismos de soporte para dentro de la región y entre regiones que utiliza RDS para PostgreSQL.

Versión En región Entre regiones
PostgreSQL 14.1 y versiones posteriores
  • Slots de replicación

  • Archivo de Amazon S3

  • Slots de replicación

PostgreSQL 13 y versiones anteriores
  • Archivo de Amazon S3

  • Slots de replicación

Para obtener más información, consulte Supervisión y ajuste del proceso de replicación.

Descripción de los parámetros que controlan la replicación de PostgreSQL

Los siguientes parámetros afectan al proceso de replicación y determinan qué tal se actualizan las réplicas de lectura con la instancia de base de datos de origen:

max_wal_senders

El parámetro max_wal_senders especifica el número máximo de conexiones que la instancia de base de datos de origen puede admitir al mismo tiempo a través del protocolo de replicación de streaming.

El valor predeterminado varía para las versiones de RDS para PostgreSQL:

  • Para las versiones 13, 14 y 15, el valor predeterminado es 20.

  • Para las versiones 16 y posteriores, el valor predeterminado es 35.

Este parámetro debe establecerse en ligeramente superior al número real de réplicas de lectura. Si este parámetro se establece demasiado bajo para el número de réplicas de lectura, la replicación se detiene.

Para obtener más información, consulte see max_wal_senders enla documentación de PostgreSQL.

nota

max_wal_senders es un parámetro estático que requiere un reinicio de la instancia de base de datos para que los cambios surtan efecto.

wal_keep_segments

El parámetro wal_keep_segments especifica el número de archivos de registro de escritura anticipada (WAL) que mantiene la instancia de base de datos de origen en el directorio pg_wal. La configuración predeterminada es 32.

Si wal_keep_segments no tiene un valor lo suficientemente grande para su implementación, una réplica de lectura puede quedarse tan rezagada que se detenga la replicación en streaming. Si es así, Amazon RDS genera un error de replicación e inicia la recuperación en la réplica de lectura. Para ello, reproduce los datos WAL archivados de la instancia de base de datos de origen desde Amazon S3. Este proceso de recuperación continúa hasta que la réplica de lectura reduce el retraso lo suficiente para seguir con la replicación en streaming. Puede ver este proceso en acción tal como lo captó el registro de PostgreSQL en Ejemplo: Cómo se recupera una réplica de lectura de las interrupciones de la replicación.

nota

En la versión 13 de PostgreSQL, el parámetro wal_keep_segments se denomina wal_keep_size. Tiene el mismo propósito que wal_keep_segments, pero su valor predeterminado está en megabytes (MB) (2048 MB) en lugar del número de archivos. Para obtener más información, consulte wal_keep_segments y wal_keep_size en la documentación de PostgreSQL.

max_slot_wal_keep_size

El parámetro max_slot_wal_keep_size controla la cantidad de datos WAL que conserva la instancia de base de datos de RDS para PostgreSQL en el directorio pg_wal para servir slots. Este parámetro se utiliza para configuraciones que utilizan slots de replicación. El valor predeterminado para este parámetro es -1, lo que significa que no hay límite en cuanto a la cantidad de datos WAL que se conservan en la instancia de base de datos de origen. Para obtener información sobre cómo supervisar las slots de replicación, consulte Supervisión de las slots de replicación de su instancia de base de datos de RDS para PostgreSQL.

Para obtener más información sobre este parámetro, consulte max_slot_wal_keep_size en la documentación de PostgreSQL.

Siempre que se interrumpe el flujo que proporciona los datos de WAL a una réplica de lectura, PostgreSQL cambia al modo de recuperación. Restaura la réplica de lectura mediante datos de WAL archivados de Amazon S3 o mediante el uso de datos de WAL asociados a la ranura de replicación. Cuando finaliza este proceso, PostgreSQL restablece la replicación en streaming.

Ejemplo: Cómo se recupera una réplica de lectura de las interrupciones de la replicación

En el siguiente ejemplo, encontrará los detalles del registro que muestran el proceso de recuperación de una réplica de lectura. El ejemplo procede de una instancia de base de datos de RDS para PostgreSQL que ejecuta la versión 12.9 de PostgreSQL en la misma Región de AWS que la base de datos de origen, por lo que no se utilizan slots de replicación. El proceso de recuperación es el mismo para otras instancias de base de datos de PostgreSQL que ejecutan PostgreSQL anterior a la versión 14.1 con réplicas de lectura dentro de la región.

Cuando la réplica de lectura perdió el contacto con la instancia de base de datos de origen, Amazon RDS registra el problema en el registro como el mensaje FATAL: could not receive data from WAL stream, junto con ERROR: requested WAL segment ... has already been removed. Como se muestra en la línea en negrita, Amazon RDS recupera la réplica reproduciendo un archivo WAL archivado.

2014-11-07 19:01:10 UTC::@:[23180]:DEBUG:  switched WAL source from archive to stream after failure 2014-11-07 19:01:10 UTC::@:[11575]:LOG: started streaming WAL from primary at 1A/D3000000 on timeline 1 2014-11-07 19:01:10 UTC::@:[11575]:FATAL: could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000001A000000D3 has already been removed 2014-11-07 19:01:10 UTC::@:[23180]:DEBUG: could not restore file "00000002.history" from archive: return code 0 2014-11-07 19:01:15 UTC::@:[23180]:DEBUG: switched WAL source from stream to archive after failure recovering 000000010000001A000000D3 2014-11-07 19:01:16 UTC::@:[23180]:LOG:  restored log file "000000010000001A000000D3" from archive

Cuando Amazon RDS reproduce suficientes datos de WAL archivados en la réplica para ponerse al corriente, el streaming a la réplica de lectura comienza de nuevo. Cuando se reanuda el streaming, Amazon RDS escribe una entrada en el archivo de registro, similar a la siguiente.

2014-11-07 19:41:36 UTC::@:[24714]:LOG:started streaming WAL from primary at 1B/B6000000 on timeline 1

Configuración de los parámetros que controlan la memoria compartida

Los parámetros que establezca determinan el tamaño de la memoria compartida para rastrear los identificadores de las transacciones, los bloqueos y las transacciones preparadas. La estructura de la memoria compartida de una instancia en espera debe ser igual o mayor que la de una instancia principal. Esto garantiza que la primera no se quede sin memoria compartida durante la recuperación. Si los valores de los parámetros de la réplica son inferiores a los valores de los parámetros de la principal, Amazon RDS ajustará automáticamente los parámetros de la réplica y reiniciará el motor.

Los parámetros afectados son:

  • max_connections

  • max_worker_processes

  • max_wal_senders

  • max_prepared_transactions

  • max_locks_per_transaction

Para evitar que RDS reinicie las réplicas por falta de memoria, se recomienda aplicar los cambios de los parámetros como un reinicio progresivo en cada réplica. Al configurar los parámetros, debe aplicar las siguientes reglas:

  • Aumentar los valores de los parámetros:

    • En primer lugar, siempre debe aumentar los valores de los parámetros de todas las réplicas de lectura y realizar un reinicio progresivo de todas las réplicas. A continuación, aplique los cambios de los parámetros a la instancia principal y reinicie.

  • Disminuir los valores de los parámetros:

    • En primer lugar, debe reducir los valores de los parámetros de la instancia principal y llevar a cabo un reinicio. A continuación, aplique los cambios de los parámetros a todas las réplicas de lectura asociadas y lleve a cabo un reinicio progresivo.