Descripción general de los flujos de cambios

Un flujo de cambios observa y transmite los cambios en los datos de una base de datos de Spanner (inserciones, actualizaciones y eliminaciones) casi en tiempo 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. Para aprender a crear y administrar flujos de cambios en tu base de datos y conectarlos a otros servicios, sigue los vínculos que se indican en Pasos siguientes.

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 estadísticas

  • Activar la lógica de la aplicación según los cambios en los datos enviados a una cola de mensajes, como Pub/Sub

  • Los cambios de datos se almacenan en Cloud Storage para fines de cumplimiento o de archivo.

Cambia la configuración del flujo

Spanner trata las flujos de cambios como objetos de esquema, al igual que las tablas y los índices. Por lo tanto, puedes crear, modificar y borrar flujos de cambios mediante declaraciones DDL, y puedes ver los flujos de cambios de una base de datos al igual que otros objetos de esquema administrados por el DDL.

Puedes configurar un flujo de cambios para observar los cambios en los datos de 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 varias transmisiones que la miren dentro de los límites.

También puedes configurar un flujo de cambios para especificar un período de retención de datos, un tipo de captura de valor, un filtro de eliminaciones basadas en el TTL o un filtro de modificaciones de tablas.

La emisión del DDL que crea un flujo de cambios inicia una operación de larga duración. Cuando se completa, el nuevo flujo de cambios comienza a observar de inmediato las tablas y las columnas que se le asignaron.

Observa tablas y columnas de forma implícita

Los flujos de cambios que miran una tabla completa miran implícitamente todas las columnas de esa tabla, incluso cuando la definición de tabla está actualizada. Por ejemplo, cuando agregas columnas nuevas a esa tabla, el flujo de cambios comienza a observar automáticamente esas columnas nuevas, sin requerir ninguna modificación en la configuración de ese flujo de cambios. De manera similar, el flujo de cambios deja de observar automáticamente las columnas que se descartan de esa tabla.

Los flujos de cambios de todas las bases de datos funcionan de la misma manera. Miran de forma implícita cada columna de cada tabla, miran automáticamente las tablas o columnas agregadas después de la creación del flujo de cambios y dejan de observar las tablas o columnas descartadas.

Observar tablas y columnas de forma explícita

Si configuras un flujo de cambios para mirar solo columnas particulares de una tabla y luego agregas columnas a esa tabla, el flujo de cambios no comenzará a mirar esas columnas, a menos que reconfigures ese flujo de cambios para hacerlo.

El esquema de la base de datos trata las flujos de cambios como objetos dependientes de las columnas o tablas que miran de manera explícita. Antes de que puedas descartar cualquiera de estas columnas o tablas, debes quitarlas manualmente de la configuración de cualquier flujo de cambios que la miren de forma explícita.

Tipos de cambios en los datos que flujos de cambios

Los cambios en los datos que observa un flujo de cambios incluyen todas las inserciones, actualizaciones y eliminaciones realizadas en las tablas y columnas que observa. Estos cambios pueden deberse a lo siguiente:

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

Además, las flujos de cambios no observan los cambios de esquema ni los cambios de datos que resulten directamente de los cambios de esquema. Por ejemplo, un flujo de cambios que observa una base de datos completa no trataría descartar una tabla como un cambio en los datos, aunque esta acción quite todos los datos de la tabla de la base de datos.

Cómo Spanner escribe y almacena flujos de cambios

Cada vez que Spanner detecta un cambio en los datos en una columna observada por un flujo de cambios, escribe un registro de cambios de datos en su almacenamiento interno. Lo hace de forma síncrona con ese cambio de datos, dentro de la misma transacción. Spanner ubica ambas operaciones de escritura para que se procesen en el mismo servidor, lo que minimiza el procesamiento de escritura.

Contenido de un registro de cambios en los datos

Cada registro de cambios de datos escrito por un flujo de cambios incluye la siguiente información sobre el cambio en los datos:

  • El nombre de la tabla afectada

  • Los nombres, valores y 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 al que hacen un seguimiento, que puede ser solo las columnas modificadas o toda la fila con seguimiento, dependen 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 al que hacen un seguimiento dependen del tipo de captura de valores configurado por el usuario.

  • El tipo de modificación (insertar, actualizar o borrar)

  • La marca de tiempo de confirmación

  • El ID de transacción

  • El número de secuencia del registro

  • El tipo de captura del valor del registro de cambios de datos.

Para ver una explicación más detallada de la estructura de los registros de cambios de datos, consulta Registros de cambios de datos.

Retención de datos

Un flujo de cambios conserva sus registros de cambios de datos durante un período de entre uno y siete días. Puedes usar DDL para especificar un límite de retención de datos que no sea el predeterminado de un día cuando creas por primera vez un flujo de cambios o ajustarlo en cualquier momento futuro. Ten en cuenta que si reduces el límite de retención de datos de un flujo de cambios, todos los datos de cambios históricos anteriores al límite nuevo no estarán disponibles de manera inmediata y 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 conlleva mayores demandas de almacenamiento en la base de datos de la transmisión.

Tipo de captura de valor

La opción de configuración del tipo de captura de valores de un flujo de cambios controla la forma en que almacena los valores de una fila modificada. Puedes usar DDL a fin de especificar uno de los siguientes tipos de captura de valor 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 de clave, pero no los valores anteriores.

  • NEW_ROW: Captura todos los valores nuevos de las columnas observadas, tanto modificadas como no modificadas, 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 y excluir las eliminaciones basadas en el TTL. Cuando configuras este filtro para excluir las eliminaciones basadas en el TTL, solo se excluyen las eliminaciones futuras basadas en el TTL del flujo de cambios.

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

Tipo de modificación de tabla

De forma predeterminada, los flujos de cambios incluyen todas las modificaciones de la tabla, como inserciones, actualizaciones y eliminaciones. Puedes filtrar una o más de estas modificaciones de la tabla del alcance del 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 de 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 a 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.

Leyendo 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.

  • de forma directa con la API de Spanner. Esto cambia la abstracción y las capacidades de las canalizaciones de Dataflow para obtener la máxima velocidad y flexibilidad.

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

Puedes proporcionar aislamiento parcial para las lecturas de los flujos de cambios mediante lecturas dirigidas. Las lecturas directas 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 flujos de cambios a una región o un tipo de réplica específicos dentro de una configuración de instancias multirregional o una configuración regional personalizada con regiones opcionales de solo lectura. Para obtener más información, consulta las lecturas dirigidas.

Usa Dataflow

Usa el conector de Apache Beam Spanner para compilar canalizaciones de Dataflow que leen de los flujos de cambios. Después de configurar el conector con detalles sobre un flujo de cambios en particular, genera de forma automática los registros de cambios de datos nuevos en un solo conjunto de datos PCollection no delimitado, listo para su posterior procesamiento mediante transformaciones posteriores en la canalización de Dataflow.

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

Google proporciona plantillas que te permiten compilar canalizaciones de Dataflow con rapidez para casos prácticos comunes de flujos de cambios, como enviar todos los cambios en los datos de una transmisión 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 las transmisiones de cambios y Dataflow, consulta Crea conexiones de flujos de cambios con Dataflow.

Usar la API

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

Para obtener más información, consulta Cómo consultar flujos de cambios de cambios. Para obtener un análisis más detallado sobre cómo consultar transmisiones de cambios y también interpretar los registros que se muestran, visita Consultas, registros y particiones de flujos de cambios.

Usa el conector de Kafka

El conector de Kafka exporta directamente los registros de flujos de cambios en un tema de Kafka. Abstrae los detalles de las consultas de flujos de cambios mediante la API de Spanner.

Para obtener más información sobre cómo funcionan juntos los flujos de cambios y el conector de Kafka, consulta Crea 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 transmisiones que pueden observar una sola columna. Para obtener una lista completa, consulta Cambia los límites de flujo.

Permisos

Las transmisiones de cambios utilizan lo siguiente:

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

  • La lectura de los datos de un flujo de cambios requiere spanner.databases.select.

Si usas el conector SpannerIO, el propietario del trabajo de Dataflow que lee los datos de flujos 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 Crea una base de datos de metadatos.

¿Qué sigue?