Descripción general de los flujos de cambios

Un flujo de cambios observa y transmite los cambios de datos (insertiones, actualizaciones y eliminaciones) de una base de datos de Spanner en tiempo casi real.

En esta página, se ofrece una descripción general de alto nivel de los flujos de cambios de Spanner: qué hacen y cómo funcionan. Si deseas obtener información para crear y gestionar flujos de cambios en tu base de datos y conectarlos con otros servicios, sigue los vínculos que se indican en Qué sigue.

Propósito de los flujos de cambios

Los flujos de cambios proporcionan una forma flexible y escalable de transmitir cambios de datos a otros servicios. Los casos de uso comunes incluyen los siguientes:

  • Replicar los cambios de datos de Spanner en un almacén de datos, como BigQuery, para realizar análisis

  • Activar la lógica de la aplicación según los cambios de datos que se envían a una fila de mensajes, como Pub/Sub

  • Almacenar cambios de datos en Cloud Storage para fines de cumplimiento o archivo

Cómo cambiar la configuración de un flujo de cambios

Spanner trata los flujos de cambios como objetos de esquema, al igual que las tablas y los índices. Por lo tanto, creas, modificas y borras flujos de cambios con instrucciones DDL, y puedes ver los flujos de cambios de una base de datos al igual que otros objetos de esquema administrados por DDL.

Puedes configurar un flujo de cambios para supervisar los cambios de datos en una base de datos completa o limitar su alcance a tablas y columnas específicas. Una base de datos puede tener varios flujos de cambios, y una tabla o columna en particular puede tener varios flujos que la supervisan, dentro de límites.

De forma opcional, puedes configurar un flujo de cambios con lo siguiente:

Emitir el DDL que crea un flujo de cambios inicia una operación de larga duración. Cuando se completa, la nueva transmisión de cambios comienza a observar de inmediato las tablas y columnas que se le asignaron.

Cómo supervisar tablas y columnas de forma implícita

Los flujos de cambios que supervisan una tabla completa supervisan implícitamente todas las columnas de esa tabla, incluso cuando se actualiza la definición de la tabla. Por ejemplo, cuando agregas columnas nuevas a esa tabla, el flujo de cambios comienza a supervisar automáticamente esas columnas nuevas, sin necesidad de modificar la configuración de ese flujo de cambios. Del mismo modo, la transmisión de cambios deja de observar automáticamente las columnas que se eliminan de esa tabla.

Los flujos de cambios de toda la base de datos funcionan de la misma manera. Observan de forma implícita cada columna de cada tabla, observan automáticamente cualquier tabla o columna que se agregue después de la creación del flujo de cambios y dejan de observar cualquier tabla o columna que se elimine.

Cómo supervisar tablas y columnas de forma explícita

Si configuras un flujo de cambios para supervisar solo columnas específicas en una tabla y, más adelante, agregas columnas a esa tabla, el flujo de cambios no comenzará a supervisar esas columnas, a menos que vuelvas a configurarlo para hacerlo.

El esquema de la base de datos trata los flujos de cambios como objetos dependientes de cualquier columna o tabla que supervisen de forma explícita. Antes de que puedas soltar cualquier columna o tabla de este tipo, debes quitarla de forma manual de la configuración de cualquier flujo de cambios que la supervise de forma explícita.

Tipos de cambios de datos que observan los flujos de cambios

Los cambios de datos que supervisa un flujo de cambios incluyen todas las inserciones, actualizaciones y eliminaciones que se realizan en las tablas y columnas que supervisa. Estos cambios pueden provenir de las siguientes fuentes:

Los flujos de cambios pueden observar los cambios de datos solo en las columnas y tablas creadas por el usuario. No supervisan índices, vistas, otros flujos de cambios ni tablas del sistema, como el esquema de información o las tablas de estadísticas. Los flujos de cambios no supervisan las columnas generadas, a menos que la columna forme parte de la clave primaria. Siempre se realiza un seguimiento de las columnas de clave primaria.

Además, los flujos de cambios no supervisan los cambios de esquema ni los cambios de datos que resultan directamente de los cambios de esquema, excepto los reabastecimientos de valores predeterminados. Por ejemplo, un flujo de cambios que supervisa una base de datos completa no considera ni registra la eliminación de una tabla como un cambio de datos, aunque esta acción borre todos los datos de esa tabla de la base de datos.

Cómo Spanner escribe y almacena flujos de cambios

Cada vez que Spanner detecta un cambio de datos en una columna que supervisa un flujo de cambios, escribe un registro de cambios de datos en su almacenamiento interno. La escritura de cambios de datos y el registro de cambios de datos se escriben en la misma transacción. Spanner coloca ambas operaciones de escritura en la misma ubicación para que las procese el mismo servidor, lo que minimiza el procesamiento de escritura. Luego, la transacción se replica en las réplicas de la base de datos, lo que la somete a costos de almacenamiento y replicación. Para obtener más información, consulta Precios de Spanner.

Contenido de un registro de cambios de datos

Cada registro de cambios de datos que escribe un flujo de cambios incluye la siguiente información sobre el cambio de datos:

  • El nombre de la tabla afectada

  • Los nombres, los valores y los tipos de datos de las claves primarias que identifican la fila modificada

  • Los nombres y tipos de datos de las columnas de la fila modificada que se capturaron según la definición del flujo de cambios

  • Los valores anteriores de las columnas de la fila. La disponibilidad de los valores anteriores y el contenido del que realizan un seguimiento, que puede ser solo las columnas modificadas o toda la fila a la que se le realiza un seguimiento, depende del tipo de captura de valores configurado por el usuario.

  • Los valores nuevos de las columnas de la fila. La disponibilidad de los valores nuevos y el contenido del que hacen un seguimiento dependen del tipo de captura de valores que configura el usuario.

  • El tipo de modificación (inserción, actualización o eliminación)

  • La marca de tiempo de confirmación

  • El ID de la transacción

  • El número de secuencia del registro

  • Es el tipo de captura de valor del registro de cambio de datos.

Para obtener un análisis más detallado de la estructura de los registros de cambios de datos, consulta Registros de cambios de datos.

Retención de datos

Una transmisión de cambios retiene sus registros de cambios de datos durante un período de tiempo de entre uno y siete días. Puedes usar DDL para especificar un límite de retención de datos distinto del predeterminado de un día cuando creas un flujo de cambios inicialmente, o bien ajustarlo en cualquier momento en el futuro. Ten en cuenta que reducir el límite de retención de datos de un flujo de cambios hará que todos los datos de cambios históricos anteriores al límite nuevo estén disponibles de inmediato y de forma permanente para los lectores de ese flujo de cambios.

Este período de retención de datos presenta una compensación: un período de retención más largo implica mayores demandas de almacenamiento en la base de datos del flujo.

Tipo de captura de valor

La opción de configuración del tipo de captura de valor de un flujo de cambios controla la forma en que se almacenan los valores de una fila modificada. Puedes usar DDL para especificar uno de los siguientes tipos de captura de valores para un flujo de cambios:

  • OLD_AND_NEW_VALUES: Captura los valores antiguos y nuevos de las columnas modificadas de una fila.

  • NEW_VALUES: Captura solo los valores nuevos de las columnas que no son clave, pero no los valores antiguos.

  • NEW_ROW: Captura todos los valores nuevos de las columnas observadas, tanto modificados como no modificados, cada vez que cambia alguna de esas columnas. No se capturan valores anteriores.

  • NEW_ROW_AND_OLD_VALUES: Captura todos los valores nuevos de las columnas modificadas y no modificadas, y los valores anteriores de las columnas modificadas.

Cómo excluir eliminaciones basadas en el tiempo de actividad

En Spanner, el tiempo de actividad (TTL) te permite establecer políticas para borrar datos de las tablas de Spanner de forma periódica. De forma predeterminada, los flujos de cambios incluyen todas las eliminaciones basadas en el TTL. Puedes usar exclude_ttl_deletes para configurar tu flujo de cambios para que excluya las eliminaciones basadas en el TTL. Cuando configuras este filtro para excluir las eliminaciones basadas en el TTL, solo se excluyen de tu flujo de cambios las eliminaciones futuras basadas en el TTL.

El valor predeterminado de este filtro es false. Para excluir las eliminaciones basadas en el TTL, configura el filtro en true. Puedes agregar el filtro cuando creas un flujo de cambios o modificar un flujo de cambios existente para incluir el filtro.

Tipo de modificación de la tabla

De forma predeterminada, los flujos de cambios incluyen todas las modificaciones de tablas, como inserciones, actualizaciones y eliminaciones. Puedes filtrar una o más de estas modificaciones de tablas del alcance de tu flujo de cambios con las siguientes opciones de filtro disponibles:

  • exclude_insert: Excluye todas las modificaciones de la tabla INSERT.
  • exclude_update: Excluye todas las modificaciones de la tabla UPDATE.
  • exclude_delete: Excluye todas las modificaciones de la tabla DELETE.

El valor predeterminado para estos filtros es false. Para excluir un tipo específico de modificación de tabla, establece el filtro en true. Puedes establecer uno o más filtros al mismo tiempo.

Puedes agregar un filtro para un tipo de modificación de tabla cuando creas un flujo de cambios o modificar el filtro para un tipo de modificación de tabla en un flujo de cambios existente.

Exclusión de registros a nivel de la transacción

De forma predeterminada, un flujo de cambios supervisa todas las transacciones de escritura en la base de datos porque la opción DDL allow_txn_exclusion está establecida en false. Puedes establecer la opción allow_txn_exclusion en true para permitir que tu flujo de cambios omita los registros de las transacciones de escritura especificadas. Si no configuras esta opción en true, se supervisarán todas las transacciones de escritura, incluso si usas el parámetro exclude_txn_from_change_streams en tu transacción de escritura.

Puedes habilitar esta opción cuando creas un flujo de cambios o modificar un flujo de cambios existente.

Excluye la transacción de escritura de los flujos de cambios

Para excluir una transacción de escritura de los flujos de cambios, debes establecer el parámetro exclude_txn_from_change_streams en true. Este parámetro forma parte de los métodos TransactionOptions y BatchWriteRequest. El valor predeterminado para este parámetro es false. Puedes configurar este parámetro con la API de RPC, la API de REST o las bibliotecas cliente. Para obtener más información, consulta Cómo especificar una transacción de escritura que se excluirá de los flujos de cambios.

No puedes establecer este parámetro en true para transacciones de solo lectura. Si lo haces, la API mostrará un error de argumento no válido.

En el caso de los flujos de cambios que supervisan columnas modificadas por transacciones, cuando exclude_txn_from_change_streams se establece en true, se pueden dar dos situaciones:

  • Si la opción DDL allow_txn_exclusion se establece en true, las actualizaciones realizadas en esta transacción no se registran en el flujo de cambios.
  • Si no configuras la opción DDL allow_txn_exclusion o si está configurada como false, las actualizaciones realizadas en esta transacción se registran en el flujo de cambios.

Si no configuras la opción exclude_txn_from_change_streams o si está configurada en false, cualquier flujo de cambios que supervise las columnas modificadas por las transacciones capturará las actualizaciones realizadas en esa transacción.

Cómo leer flujos de cambios

Spanner ofrece varias formas de leer los datos de un flujo de cambios:

  • A través de Dataflow, con el conector SpannerIO de Apache Beam Esta es nuestra solución recomendada para la mayoría de las aplicaciones de flujo de cambios. Google también proporciona plantillas de Dataflow para casos de uso comunes.

  • Directamente, con la API de Spanner Esto cambia la abstracción y las capacidades de las canalizaciones de Dataflow por la máxima velocidad y flexibilidad.

  • A través del uso del conector de Kafka basado en Debezium para los flujos de cambios de Spanner. Este conector transmite registros de cambios directamente a los temas de Kafka.

Puedes proporcionar aislamiento parcial para las operaciones de lectura de flujos de cambios mediante operaciones de lectura dirigidas. Las operaciones de lectura dirigidas pueden ayudar a minimizar el impacto en las cargas de trabajo transaccionales de tu base de datos. Puedes usar la API de Spanner para enrutar las lecturas de los flujos de cambios a un tipo de réplica o una región específicos dentro de una configuración de instancia multirregional o una configuración regional personalizada con regiones opcionales de solo lectura. Para obtener más información, consulta lecturas dirigidas.

Usa Dataflow

Usa el conector SpannerIO de Apache Beam para compilar canalizaciones de Dataflow que lean de flujos de cambios. Después de configurar el conector con detalles sobre un flujo de cambios en particular, este genera automáticamente registros de cambios de datos nuevos en un conjunto de datos PCollection único y sin límites, listo para que se procese más en las transformaciones posteriores de la canalización de Dataflow.

Dataflow usa funciones analíticas para dividir las colecciones ilimitadas en componentes lógicos o ventanas. Como resultado, Dataflow proporciona una transmisión casi en tiempo real cuando se lee de los flujos de cambios.

Google proporciona plantillas que te permiten compilar rápidamente canalización de Dataflow para casos de uso comunes de flujos de cambios, como enviar todos los cambios de datos de un flujo a un conjunto de datos de BigQuery o copiarlos en un bucket de Cloud Storage.

Para obtener una descripción general más detallada de cómo funcionan en conjunto los flujos de cambios y Dataflow, consulta Cómo compilar conexiones de flujos de cambios con Dataflow.

Usar la API

Como alternativa a usar Dataflow para compilar canalizaciones de flujos de cambios, puedes escribir código que use la API de Spanner para leer los registros de un flujo de cambios directamente. Esto te permite leer registros de cambios de datos de la misma manera que lo hace el conector de SpannerIO, ya que proporciona las latencias más bajas posibles cuando se leen datos de flujos de cambios en lugar de proporcionar la flexibilidad de Dataflow.

Para obtener más información, consulta Cómo consultar flujos de cambios. Para obtener una explicación más detallada sobre cómo consultar flujos de cambios y cómo interpretar los registros que se muestran, consulta Particiones, registros y consultas de flujos de cambios.

Usa el conector de Kafka

El conector de Kafka envía directamente los registros del flujo de cambios a un tema de Kafka. Abstrae los detalles de la consulta de flujos de cambios con la API de Spanner.

Para obtener más información sobre cómo funcionan los flujos de cambios y el conector de Kafka, consulta Cómo compilar conexiones de flujos de cambios con el conector de Kafka.

Límites

Existen varios límites en los flujos de cambios, incluida la cantidad máxima de flujos de cambios que puede tener una base de datos y la cantidad máxima de flujos que pueden observar una sola columna. Para obtener una lista completa, consulta Límites de los flujos de cambios.

Permisos

Los flujos de cambios usan lo siguiente:

  • Para crear, actualizar o descartar flujos de cambios, se requiere spanner.databases.updateDdl.

  • Para leer los datos de un flujo de cambios, se requiere spanner.databases.select.

Si usas el conector SpannerIO, el propietario del trabajo de Dataflow que lee datos de flujo de cambios requiere permisos de IAM adicionales, ya sea en la base de datos de tu aplicación o en una base de datos de metadatos independiente. Consulta Cómo crear una base de datos de metadatos.

¿Qué sigue?