Un flujo de cambios observa y transmite los cambios de 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 obtener información sobre cómo crear y administrar flujos de cambios en tu base de datos y conectarlos con otros servicios, sigue los vínculos 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 en función de los cambios de datos enviados a una cola de mensajes, como Pub/Sub.
Almacenar cambios de datos en Cloud Storage con fines de cumplimiento o archivo.
Configuración del flujo de cambios
Spanner trata los flujos de cambios como objetos de esquema, de forma similar a las tablas y los índices. Por lo tanto, puedes crear, modificar y borrar flujos de cambios con instrucciones DDL, y puedes ver los flujos de cambios de una base de datos como otros objetos de esquema administrados por DDL.
Puedes configurar un flujo de cambios para observar los cambios de datos en toda una base de datos 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 observan, dentro de los límites.
De manera opcional, puedes configurar un flujo de cambios con lo siguiente:
- Especifica el período de retención de datos para anular el período de retención predeterminado de siete días.
- Especifica el tipo de captura de valor para anular el
tipo de captura de valor predeterminado
OLD_AND_NEW_VALUES. - Aplica un filtro de eliminaciones basadas en TTL para filtrar las eliminaciones basadas en TTL de tus flujos de cambios.
- Aplica un filtro de modificaciones de tabla para excluir todas las modificaciones de tabla
INSERT,UPDATEoDELETE. - Habilita la exclusión de registros a nivel de la transacción para excluir ciertas transacciones de tus flujos de cambios.
La emisión de la DDL que crea un flujo de cambios inicia una operación de larga duración. Cuando se completa, el nuevo flujo de cambios comienza de inmediato a observar las tablas y columnas que se le asignaron.
Observación implícita de tablas y columnas
Los flujos de cambios que observan una tabla completa observan de forma implícita 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 observar automáticamente esas columnas nuevas, sin necesidad de modificar la configuración de ese flujo de cambios. Del mismo modo, el flujo de cambios deja de observar automáticamente las columnas que se quitan 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 las tablas o columnas que se agregan después de la creación del flujo de cambios y dejan de observar las tablas o columnas que se quitan.
Observación explícita de tablas y columnas
Si configuras un flujo de cambios para observar solo columnas particulares en una tabla y, luego, agregas columnas a esa tabla, el flujo de cambios no comenzará a observar esas columnas a menos que vuelvas a configurar ese flujo de cambios para que lo haga.
El esquema de la base de datos trata los flujos de cambios como objetos dependientes de cualquier columna o tabla que observen de forma explícita. Antes de que puedas quitar una columna o tabla de este tipo, debes quitarla de forma manual de la configuración de cualquier flujo de cambios que la observe de forma explícita.
Tipos de cambios de datos que observan los flujos de cambios
Los cambios de 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 provenir de lo siguiente:
Eliminaciones en cascada en tablas secundarias intercaladas
Eliminaciones que se producen a partir de las reglas de tiempo de actividad
Los flujos de cambios solo pueden observar los cambios de datos en las columnas y tablas creadas por el usuario. No observan í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 observan las columnas generadas, a menos que la columna forme parte de la clave primaria. Las columnas de clave primaria siempre se rastrean.
Además, los flujos de cambios no observan los cambios de esquema ni los cambios de datos que resultan directamente de los cambios de esquema, aparte de los reabastecimientos para valores predeterminados. Por ejemplo, un flujo de cambios que observa 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 observa un flujo de cambios, escribe un registro de cambios de datos en su almacenamiento interno. La escritura del cambio de datos y el registro de cambios de datos se escriben dentro de la misma transacción. Spanner coloca ambas escrituras 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 sujeta 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 escrito por 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 los 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 que rastrean, que pueden ser solo las columnas modificadas o toda la fila rastreada, depende del tipo de captura de valor configurado por el usuario.
Los valores nuevos de las columnas de la fila. La disponibilidad de los valores nuevos y el contenido que rastrean depende del tipo de captura de valor configurado por el usuario.
El tipo de modificación (inserción, actualización o eliminación)
La marca de tiempo de confirmación
El ID de transacción
El número de secuencia del registro
El tipo de captura de valor del registro de cambios de datos
Para obtener una descripció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 retiene sus registros de cambios de datos durante un período de entre uno y treinta días. Puedes usar DDL para especificar un límite de retención de datos que no sea el predeterminado de siete días cuando crees un flujo de cambios por primera vez o ajustarlo en cualquier momento 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 más antiguos que el nuevo límite no 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 conlleva mayores demandas de almacenamiento en la base de datos del flujo.
Tipo de captura de valor
La opción de configuración tipo de captura de valor de un flujo de cambios controla la forma en que almacena los valores de una fila modificada. Puedes usar DDL para 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 sin 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.
Excluye las 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 TTL. Puedes usar exclude_ttl_deletes para configurar tu flujo de cambios de modo que excluya las eliminaciones basadas en TTL.
Cuando configuras este filtro para excluir las eliminaciones basadas en TTL, solo se excluyen de tu flujo de cambios las eliminaciones basadas en TTL futuras.
El valor predeterminado de este filtro es false. Para excluir las eliminaciones basadas en TTL, configura el filtro como 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 la tabla, como inserciones, actualizaciones y eliminaciones. Puedes filtrar una o más de estas modificaciones de la tabla del alcance de tu flujo de cambios con las siguientes opciones de filtro disponibles:
exclude_insert: Excluye todas las modificaciones de tablaINSERT.exclude_update: Excluye todas las modificaciones de tablaUPDATE.exclude_delete: Excluye todas las modificaciones de tablaDELETE.
El valor predeterminado de estos filtros es false. Para excluir un tipo específico de modificación de la tabla, configura el filtro como true. Puedes configurar uno o más filtros al mismo tiempo.
Puedes agregar un filtro para un tipo de modificación de la tabla cuando creas un flujo de cambios o modificar el filtro para un tipo de modificación de la tabla para un flujo de cambios existente.
Exclusión de registros a nivel de la transacción
De forma predeterminada, un flujo de cambios observa todas las transacciones de escritura en la base de datos porque la opción DDL allow_txn_exclusion está configurada como false. Puedes configurar la opción allow_txn_exclusion como true para permitir que tu flujo de cambios ignore los registros de las transacciones de escritura especificadas. Si no configuras esta opción como true, se observará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 configurar el parámetro exclude_txn_from_change_streams como true. Este parámetro forma parte de los
TransactionOptions y
BatchWriteRequest
métodos. 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 Especifica una transacción de escritura para excluirla de los flujos de cambios.
No puedes configurar este parámetro como true para las transacciones de solo lectura. Si lo haces, la API muestra un error de argumento no válido.
Para los flujos de cambios que supervisan las columnas modificadas por las transacciones, cuando exclude_txn_from_change_streams se establece en true, son posibles dos situaciones:
- Si la opción DDL
allow_txn_exclusionestá configurada comotrue, las actualizaciones realizadas dentro de esta transacción no se registran en el flujo de cambios. - Si no configuras la opción DDL
allow_txn_exclusiono si está configurada comofalse, las actualizaciones realizadas dentro de 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 como false, los flujos de cambios que supervisan las columnas modificadas por las transacciones capturarán las actualizaciones realizadas dentro de esa transacción.
Lectura de 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 conector de Kafka basado en Debezium para flujos de cambios de Spanner. Este conector transmite registros de cambios directamente a temas de Kafka.
Con Datastream para transmitir directamente tus cambios a BigQuery, tablas de BigLake Iceberg o Cloud Storage.
Puedes proporcionar aislamiento parcial para las lecturas de flujos de cambios con lecturas dirigidas. Las lecturas 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 flujos de cambios a un tipo o región de réplica específico 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 desde flujos de cambios. Después
de configurar el conector con detalles
sobre un flujo de cambios en particular, genera automáticamente registros de cambios de datos nuevos
en un conjunto de datos
PCollection
único y no delimitado, listo para su procesamiento posterior 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 transmisión casi en tiempo real cuando se lee desde flujos de cambios.
Google proporciona plantillas que te permiten compilar rápidamente canalizaciones de Dataflow para casos de uso comunes de flujos de cambios, incluido el envío de todos los cambios de datos de un flujo a un conjunto de datos de BigQuery o la copia a un bucket de Cloud Storage.
Para obtener una descripción general más detallada de cómo funcionan los flujos de cambios y Dataflow en conjunto, consulta Compila conexiones de flujos de cambios con Dataflow.
Usa la API
Como alternativa al uso de 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 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 Consulta flujos de cambios. Para obtener un análisis más detallado sobre cómo consultar flujos de cambios y cómo interpretar los registros que se muestran, consulta Cambia particiones, registros y consultas.
Usa el conector de Kafka
El conector de Kafka genera directamente registros de flujos de cambios en 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 en conjunto, consulta Compila conexiones de flujos de cambios con el conector de Kafka.
Usa Datastream
Usa Datastream, un servicio de captura de datos modificados (CDC) y replicación sin servidores y fácil de usar disponible en Google Cloud. Datastream admite flujos de cambios de Spanner y te permite leer y transmitir tus datos de cambios a varios destinos.
Para obtener más información sobre cómo Datastream admite Spanner para leer y transmitir datos de cambios, consulta Spanner como fuente.
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 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 los datos de flujos de cambios requiere permisos adicionales de Identity and Access Management (IAM), 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?
Aprende la sintaxis de DDL para crear y administrar flujos de cambios.
Usa flujos de cambios y plantillas para replicar cambios de Spanner a BigQuery o a Cloud Storage.
Obtén más información para compilar canalizaciones de Dataflow para procesar datos de flujos de cambios.
Explora más detalles de los flujos de cambios, incluidos más detalles sobre la arquitectura de flujos de cambios, cómo consultar flujos de cambios con la API y cómo interpretar los registros que se muestran.
Obtén más información para usar el conector de Kafka para procesar datos de flujos de cambios.