Descripción general de los flujos de cambios

Un flujo de cambios monitoriza 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 los flujos de cambios de Spanner: qué hacen y cómo funcionan. Para saber cómo crear y gestionar flujos de cambios en tu base de datos y conectarlos con otros servicios, sigue los enlaces de la sección Pasos siguientes.

Finalidad de los flujos de cambios

Los flujos de cambios proporcionan una forma flexible y escalable de transmitir cambios de datos a otros servicios. Estos son algunos de los usos más habituales:

  • Replicar los cambios de datos de Spanner en un almacén de datos, como BigQuery, para realizar analíticas.

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

  • Almacenar los cambios de datos en Cloud Storage para cumplir los requisitos o con fines de archivo.

Cambiar la configuración de la emisión

Spanner trata los flujos de cambios como objetos de esquema, de forma muy parecida a las tablas y los índices. Por lo tanto, puedes crear, modificar y eliminar flujos de cambios mediante instrucciones DDL, y puedes ver los flujos de cambios de una base de datos igual que otros objetos de esquema gestionados por DDL.

Puedes configurar un flujo de cambios para monitorizar los cambios de datos en toda una base de datos o limitar su ámbito a tablas y columnas específicas. Una base de datos puede tener varios flujos de cambios, y una tabla o columna concretas pueden tener varios flujos que la monitoricen, dentro de unos límites.

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

Al emitir el DDL que crea un flujo de cambios, se inicia una operación de larga duración. Cuando se complete, el nuevo flujo de cambios empezará inmediatamente a monitorizar las tablas y las columnas que se le hayan asignado.

Monitorizar tablas y columnas de forma implícita

Los flujos de cambios que monitorizan una tabla completa monitorizan implícitamente todas las columnas de esa tabla, incluso cuando se actualiza la definición de la tabla. Por ejemplo, cuando añades columnas a esa tabla, el flujo de cambios empieza automáticamente a monitorizar esas columnas sin necesidad de modificar su configuración. Del mismo modo, el flujo de cambios deja de monitorizar automáticamente las columnas que se eliminan de esa tabla.

Los flujos de cambios de toda la base de datos funcionan de la misma forma. Implícitamente, monitorizan todas las columnas de todas las tablas, monitorizan automáticamente las tablas o columnas que se añadan después de crear el flujo de cambios y dejan de monitorizar las tablas o columnas que se eliminen.

Monitorizar tablas y columnas de forma explícita

Si configuras un flujo de cambios para que solo monitorice determinadas columnas de una tabla y, más adelante, añades columnas a esa tabla, el flujo de cambios no empezará a monitorizar esas columnas a menos que lo vuelvas a configurar para que lo haga.

El esquema de la base de datos trata los flujos de cambios como objetos dependientes de las columnas o tablas que monitorizan de forma explícita. Antes de poder eliminar una columna o una tabla de este tipo, debe quitarla manualmente de la configuración de cualquier flujo de cambios que la esté monitorizando explícitamente.

Tipos de cambios de datos que monitorizan los flujos de cambios

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

Los flujos de cambios solo pueden monitorizar los cambios de datos en las columnas y tablas creadas por los usuarios. No monitorizan í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 monitorizan las columnas generadas a menos que la columna forme parte de la clave principal. Las columnas de clave principal siempre se monitorizan.

Además, los flujos de cambios no monitorizan los cambios de esquema ni los cambios de datos que se producen directamente como resultado de los cambios de esquema, excepto los rellenados de valores predeterminados. Por ejemplo, un flujo de cambios que monitoriza una base de datos completa no considera ni registra la eliminación de una tabla como un cambio de datos, aunque esta acción elimine todos los datos de esa tabla de la base de datos.

Cómo escribe y almacena Spanner los flujos de cambios

Cada vez que Spanner detecta un cambio en los datos de una columna que está monitorizando un flujo de cambios, escribe un registro de cambio 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 escrituras en el mismo lugar para que las procese el mismo servidor, lo que minimiza el procesamiento de escritura. La transacción se replica en las réplicas de la base de datos, por lo que está sujeta a costes de almacenamiento y replicación. Para obtener más información, consulta los precios de Spanner.

Contenido de un registro de cambios de datos

Cada registro de cambio 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 principales que identifican la fila modificada

  • Los nombres y los tipos de datos de las columnas de la fila modificada que se han registrado en función de la definición del flujo de cambios.

  • Los valores antiguos de las columnas de la fila. La disponibilidad de los valores antiguos y del contenido que monitorizan, que pueden ser solo las columnas modificadas o toda la fila monitorizada, depende del tipo de captura de valor configurado por el usuario.

  • Los nuevos valores de las columnas de la fila. La disponibilidad de los nuevos valores y el contenido que registran dependen del tipo de captura de valor que haya configurado el usuario.

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

  • Marca de tiempo de confirmación

  • El ID de transacción

  • Número de secuencia del registro

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

Para obtener más información sobre la estructura de los registros de cambios de datos, consulta Registros de cambios de datos.

Conservación de datos

Un flujo de cambios conserva sus registros de cambios de datos durante un periodo de entre uno y treinta días. Puedes usar DDL para especificar un límite de conservación de datos distinto al predeterminado de un día al crear inicialmente un flujo de cambios o para ajustarlo en cualquier momento. Ten en cuenta que, si reduces el límite de conservación de datos de un flujo de cambios, todos los datos de cambios históricos anteriores al nuevo límite dejarán de estar disponibles de forma inmediata y permanente para los lectores de ese flujo de cambios.

Este periodo de conservación de datos supone un equilibrio, ya que un periodo más largo implica mayores requisitos 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 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: solo captura 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 monitorizadas, tanto los modificados como los no modificados, cada vez que cambia alguna de esas columnas. No se capturan valores antiguos.

  • NEW_ROW_AND_OLD_VALUES: registra todos los valores nuevos de las columnas modificadas y sin modificar, así como los valores antiguos de las columnas modificadas.

Excluir las eliminaciones basadas en el tiempo de vida

En Spanner, el tiempo de vida (TTL) te permite definir políticas para eliminar periódicamente datos de las tablas de Spanner. 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 forma que excluya las eliminaciones basadas en TTL. Si configuras este filtro para excluir las eliminaciones basadas en TTL, solo se excluirán de tu flujo de cambios las eliminaciones basadas en TTL que se produzcan en el futuro.

El valor predeterminado de este filtro es false. Para excluir las eliminaciones basadas en TTL, define el filtro como true. Puedes añadir el filtro al crear un flujo de cambios o modificar un flujo de cambios 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. Puede filtrar una o varias de estas modificaciones de la tabla del ámbito de su flujo de cambios mediante 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, define el filtro como true. Puedes definir uno o varios filtros al mismo tiempo.

Puede añadir un filtro para un tipo de modificación de tabla cuando cree un flujo de cambios o modificar el filtro de un tipo de modificación de tabla de un flujo de cambios que ya tenga.

Exclusión de registros a nivel de transacción

De forma predeterminada, un flujo de cambios monitoriza todas las transacciones de escritura de la base de datos, ya que la opción allow_txn_exclusion DDL está definida como false. Puedes definir la opción allow_txn_exclusion en true para que tu flujo de cambios ignore los registros de las transacciones de escritura especificadas. Si no defines esta opción como true, se monitorizarán todas las transacciones de escritura, aunque uses 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 que ya tengas.

Excluir transacciones de escritura de los flujos de cambios

Para excluir una transacción de escritura de los flujos de cambios, debes definir el parámetro exclude_txn_from_change_streams como true. Este parámetro forma parte de los métodos TransactionOptions y BatchWriteRequest. El valor predeterminado de este parámetro es false. Puede definir este parámetro con la API RPC, la API REST o las bibliotecas de cliente. Para obtener más información, consulta Especificar una transacción de escritura que se excluya de los flujos de cambios.

No puedes asignar el valor true a este parámetro en transacciones de solo lectura. Si lo haces, la API devolverá un error de argumento no válido.

En el caso de las columnas de monitorización de cambios modificadas por transacciones, cuando exclude_txn_from_change_streams se define como true, se pueden dar dos situaciones:

  • Si la opción DDL allow_txn_exclusion se define como true, las actualizaciones realizadas en esta transacción no se registran en el flujo de cambios.
  • Si no define la opción DDL allow_txn_exclusion o si se le asigna el valor false, las actualizaciones realizadas en esta transacción se registran en el flujo de cambios.

Si no define la opción exclude_txn_from_change_streams o si está definida como false, cualquier cambio en las columnas de monitorización de los flujos de cambios modificadas por las transacciones capturará las actualizaciones realizadas en esa transacción.

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 la solución que recomendamos para la mayoría de las aplicaciones de flujo de cambios. Google también proporciona plantillas de Dataflow para casos prácticos habituales.

  • Directamente, mediante la API de Spanner. De esta forma, se renuncia a la abstracción y las funciones de los flujos de procesamiento de Dataflow para obtener la máxima velocidad y flexibilidad.

  • Usando el conector de Kafka basado en Debezium para flujos de cambios de Spanner. Este conector transmite registros de cambios directamente a temas de Kafka.

Puede proporcionar aislamiento parcial para las lecturas de flujos de cambios mediante 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 dirigir las lecturas de 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 una o varias regiones de solo lectura opcionales. Para obtener más información, consulta lecturas dirigidas.

Usar Dataflow

Usa el conector SpannerIO de Apache Beam para crear flujos de procesamiento de Dataflow que lean de flujos de cambios. Después de configurar el conector con los detalles de un flujo de cambios concreto, este genera automáticamente nuevos registros de cambios de datos en un único conjunto de datos PCollection sin límites, listo para que las transformaciones posteriores del flujo de procesamiento de Dataflow lo procesen.

Dataflow usa funciones de ventana para dividir colecciones ilimitadas en componentes lógicos o ventanas. Por lo tanto, Dataflow proporciona streaming casi en tiempo real al leer de flujos de cambios.

Google proporciona plantillas que te permiten crear rápidamente flujos de procesamiento de Dataflow para casos prácticos habituales 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 más detallada de cómo funcionan conjuntamente los flujos de cambios y Dataflow, consulta el artículo Crear conexiones de flujos de cambios con Dataflow.

Usar la API

Como alternativa a usar Dataflow para crear canalizaciones de flujo de cambios, puede escribir código que use la API de Spanner para leer los registros de un flujo de cambios directamente. De esta forma, puedes leer registros de cambios de datos del mismo modo que lo hace el conector SpannerIO, ya que proporciona las latencias más bajas posibles al leer datos de la secuencia de cambios en lugar de ofrecer la flexibilidad de Dataflow.

Para obtener más información, consulta Consultar secuencias de cambios. Para obtener información más detallada sobre cómo consultar secuencias de cambios e interpretar los registros devueltos, consulta Particiones, registros y consultas de secuencias de cambios.

Usar el conector de Kafka

El conector de Kafka genera directamente registros de flujo 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 conjuntamente los flujos de cambios y el conector de Kafka, consulta Crear conexiones de flujos de cambios con el conector de Kafka.

Límites

Hay varios límites en los flujos de cambios, incluido el número máximo de flujos de cambios que puede tener una base de datos y el número máximo de flujos que pueden monitorizar una sola columna. Para ver una lista completa, consulta Límites de la secuencia de cambios.

Permisos

Los flujos de cambios usan lo siguiente:

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

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

Si usas el conector SpannerIO, el propietario del trabajo de Dataflow que lee los datos del flujo de cambios necesita permisos de gestión de identidades y accesos adicionales en tu base de datos de aplicaciones o en una base de datos de metadatos independiente. Consulta Crear una base de datos de metadatos.

Siguientes pasos