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 aprender a crear y administrar flujos de cambios en tu base de datos, y conectarlas con otros servicios, sigue los vínculos en Próximos pasos.
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
Activación de 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 los cambios de datos en Cloud Storage para fines de cumplimiento o archivo
Cómo cambiar la configuración del flujo de cambios
Spanner trata los flujos de cambios como objetos de esquema, de manera muy similar a las tablas y los índices. Por lo tanto, crea, modifica y borra transmisiones de cambios con instrucciones DDL, y puedes ver las transmisiones de cambios de una base de datos al igual que 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 un día.
- 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 el TTL para filtrar las eliminaciones basadas en el TTL de tus flujos de cambios.
- Aplica un filtro de modificaciones de la tabla para excluir todas las modificaciones de las tablas
INSERT
,UPDATE
oDELETE
. - Habilita la exclusión de registros a nivel de la transacción para excluir ciertas transacciones de tus flujos de cambios.
La emisión del DDL que crea un flujo de cambios inicia una operación de larga duración. Cuando se complete, el nuevo flujo de cambios comenzará de inmediato a supervisar las tablas y las columnas que se le asignaron.
Supervisión implícita de tablas y columnas
Los flujos de cambios que supervisan una tabla completa supervisan 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 automáticamente a supervisar esas columnas nuevas, sin necesidad de modificar la configuración de ese flujo de cambios. Del mismo modo, el flujo de cambios deja de supervisar 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, observando automáticamente cualquier tabla o columna que se agregue después de la creación del flujo de cambios y dejando de observar cualquier tabla o columna que se quite.
Observación explícita de tablas y columnas
Si configuras un flujo de cambios para que observe solo columnas específicas de 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 descartar cualquier columna o tabla de este tipo, debes quitarla manualmente de la configuración de cualquier transmisión de cambios que la observe de forma explícita.
Tipos de cambios de datos que supervisan los flujos de cambios
Los cambios de datos que supervisa un flujo de cambios incluyen todas las inserciones, actualizaciones y eliminaciones realizadas en las tablas y columnas que supervisa. Estos cambios pueden provenir de las siguientes fuentes:
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 supervisar los cambios en los datos de 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. Las columnas de clave primaria siempre se rastrean.
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 del cambio de datos y el registro de cambios de datos se escriben dentro de la misma transacción. Spanner coloca ambas escrituras 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 cambio de datos
Cada registro de cambios de datos que escribe un flujo de cambios incluye la siguiente información sobre el cambio de datos:
Nombre de la tabla afectada
Los nombres, los valores y los tipos de datos de las claves primarias que identifican la fila modificada
Son 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.
Son 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 valores configurado por el usuario.
Son los valores nuevos de las columnas de la fila. La disponibilidad de los valores nuevos y el contenido que rastrean dependen del tipo de captura de valores configurado por el usuario.
El tipo de modificación (inserción, actualización o eliminación)
Marca de tiempo de la confirmación
ID de transacción
Número de secuencia del registro
Es el tipo de captura de valor del registro de cambio 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 conserva 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 diferente del predeterminado de un día cuando creas inicialmente un flujo de cambios 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 que sean más antiguos que el nuevo límite dejen de estar disponibles de forma 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 genera 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 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 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 sin clave, pero no los valores anteriores.NEW_ROW
: Captura todos los valores nuevos de las columnas supervisadas, tanto modificadas como sin modificar, cada vez que cambia alguna de esas columnas. No se capturan valores antiguos.NEW_ROW_AND_OLD_VALUES
: Captura todos los valores nuevos de las columnas modificadas y no modificadas, y los valores antiguos 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 todos los borrados basados en el TTL. Puedes usar exclude_ttl_deletes
para configurar tu transmisión de cambios de modo que excluya las eliminaciones basadas en el TTL.
Cuando configuras este filtro para excluir los borrados basados en TTL, solo se excluyen de tu flujo de cambios los borrados basados en TTL futuros.
El valor predeterminado para este filtro es false
. Para excluir los borrados basados en el TTL, establece 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 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 la tablaINSERT
.exclude_update
: Excluye todas las modificaciones de la tablaUPDATE
.exclude_delete
: Excluye todas las modificaciones de la tablaDELETE
.
El valor predeterminado para estos filtros es false
. Para excluir un tipo específico de modificación de la 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 para 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, ya que la opción de 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 ignore 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 crees 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 establecer 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 para que se excluya de los flujos de cambios.
No puedes establecer este parámetro en true
para las transacciones de solo lectura. Si lo haces, la API devolverá un error de argumento no válido.
En el caso de las columnas de supervisión de flujos de cambios modificadas por transacciones, cuando exclude_txn_from_change_streams
se establece en true
, son posibles dos situaciones:
- Si la opción de DDL
allow_txn_exclusion
se establece entrue
, las actualizaciones realizadas dentro de esta transacción no se registran en el flujo de cambios. - Si no configuras la opción de DDL
allow_txn_exclusion
o si está configurada comofalse
, las actualizaciones realizadas dentro de esta transacción se registran en el flujo de cambios.
Si no estableces la opción exclude_txn_from_change_streams
o si está establecida en false
, cualquier columna de supervisión de flujos de cambios modificada por transacciones capturará 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 la solución que recomendamos para la mayoría de las aplicaciones de transmisiones de cambios. Google también proporciona plantillas de Dataflow para casos de uso comunes.
Directamente, con la API de Spanner Esto sacrifica 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 cambios directamente a temas de Kafka.
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 los flujos de cambios a un tipo de réplica o región específicos dentro de una configuración de instancia multirregional o una configuración regional personalizada con regiones de solo lectura opcionales. 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, este genera automáticamente nuevos registros de cambios de datos en un único conjunto de datos PCollection
sin límites, listos para su procesamiento posterior por transformaciones subsiguientes en la canalización de Dataflow.
Dataflow usa funciones de ventanas para dividir las colecciones no delimitadas en componentes lógicos o ventanas. Como resultado, Dataflow proporciona transmisión casi en tiempo real cuando se leen flujos de cambios.
Google proporciona plantillas que te permiten compilar rápidamente canalizaciones 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 a un bucket de Cloud Storage.
Para obtener una descripción general más detallada de cómo funcionan juntos los flujos de cambios y Dataflow, 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 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 devuelven, consulta Particiones, registros y consultas de transmisiones de cambios.
Usa el conector de Kafka
El conector de Kafka genera directamente registros de transmisiones de cambios en un tema de Kafka. Abstrae los detalles de las consultas de flujos de cambios con 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 Compila 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 transmisiones de cambios.
Permisos
Los flujos de cambios usan lo siguiente:
Crear, actualizar o descartar flujos de cambios requiere
spanner.databases.updateDdl
.Para leer los datos de una transmisión de cambios, se requiere
spanner.databases.select
.
Si usas el conector SpannerIO, el propietario del trabajo de Dataflow que lee los datos del flujo de cambios requiere permisos de IAM adicionales, ya sea en la base de datos de la aplicación o en una base de datos de metadatos independiente. Consulta Crea una base de datos de metadatos.
¿Qué sigue?
Aprende la sintaxis del DDL para crear y administrar transmisiones 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 a fondo los detalles de los flujos de cambios, incluidos más detalles sobre la arquitectura de los flujos de cambios, cómo consultar los flujos de cambios con la API y cómo interpretar los registros que se devuelven.
Obtén más información para usar el conector de Kafka para procesar datos de flujos de cambios.