Visão geral do fluxo de alterações

Um fluxo de alterações monitora e transmite as mudanças de dados de um banco de dados do Spanner (inserções, atualizações e exclusões) quase em tempo real.

Esta página oferece uma visão geral dos fluxos de alterações do Spanner: o que eles fazem e como funcionam. Para saber como criar e gerenciar fluxo de alterações no banco de dados e conectá-los a outros serviços, siga os links em Próximas etapas.

Finalidade dos fluxo de alterações

Os fluxos de alterações oferecem uma maneira flexível e escalonável de transmitir mudanças de dados para outros serviços. Os casos de uso comuns incluem:

  • Replicação de mudanças de dados do Spanner em um data warehouse, como BigQuery, para análise.

  • Acionamento da lógica do aplicativo com base em mudanças de dados enviadas a uma fila de mensagens, como o Pub/Sub.

  • Armazenamento de mudanças de dados no Cloud Storage para fins de conformidade ou arquivamento.

Configuração do fluxo de alterações

O Spanner trata os fluxo de alterações como objetos de esquema, assim como tabelas e índices. Assim, você cria, modifica e exclui fluxos de alterações usando instruções DDL, e pode visualizar os fluxos de alterações de um banco de dados da mesma forma que outros objetos de esquema gerenciados por DDL.

É possível configurar um fluxo de alterações para monitorar mudanças de dados em um banco de dados inteiro ou limitar o escopo a tabelas e colunas específicas. Um banco de dados pode ter vários fluxo de alterações, e uma tabela ou coluna específica pode ter vários fluxos monitorando-a, dentro dos limites.

Opcionalmente, é possível configurar um fluxo de alterações com o seguinte:

A emissão da DDL que cria um fluxo de alterações inicia uma operação de longa duração. Quando ela é concluída, o novo fluxo de alterações começa imediatamente a monitorar as tabelas e colunas atribuídas a ele.

Monitoramento implícito de tabelas e colunas

Os fluxos de alterações que monitoram uma tabela inteira monitoram implicitamente todas as colunas dessa tabela, mesmo quando a definição da tabela é atualizada. Por exemplo, quando você adiciona novas colunas a essa tabela, o fluxo de alterações começa automaticamente a monitorar essas novas colunas, sem exigir nenhuma modificação na configuração do fluxo de alterações. Da mesma forma, o fluxo de alterações para automaticamente de monitorar as colunas que são descartadas dessa tabela.

Fluxo de alterações de banco de dados inteiro funcionam da mesma maneira. Eles monitoram implicitamente todas as colunas em todas as tabelas, monitorando automaticamente todas as tabelas ou colunas adicionadas após a criação do fluxo de alterações e deixando de monitorar as tabelas ou colunas descartadas.

Monitoramento explícito de tabelas e colunas

Se você configurar um fluxo de alterações para monitorar apenas colunas específicas em uma tabela e, mais tarde, adicionar colunas a essa tabela, o fluxo de alterações não começará a monitorar essas colunas, a menos que você reconfigure o fluxo de alterações para fazer isso.

O esquema do banco de dados trata os fluxo de alterações como objetos dependentes de colunas ou tabelas que eles monitoram explicitamente. Antes de descartar uma coluna ou tabela, é necessário removê-la manualmente da configuração de qualquer fluxo de alterações que a esteja monitorando explicitamente.

Tipos de mudanças de dados que os fluxo de alterações monitoram

As mudanças de dados que um fluxo de alterações monitora incluem todas as inserções, atualizações e exclusões feitas nas tabelas e colunas que ele monitora. Essas mudanças podem vir de:

Os fluxos de alterações só podem monitorar mudanças de dados em colunas e tabelas criadas pelo usuário. Eles não monitoram índices, visualizações, outros fluxo de alterações ou tabelas do sistema, como o esquema de informações ou tabelas de estatísticas. Os fluxos de alterações não monitoram colunas geradas, a menos que a coluna faça parte da chave primária. As colunas de chave primária são sempre rastreadas.

Além disso, os fluxo de alterações não monitoram mudanças de esquema ou mudanças de dados que resultam diretamente de mudanças de esquema, exceto backfills para valores padrão. Por exemplo, um fluxo de alterações que monitora um banco de dados inteiro não considera e registra uma exclusão de tabela como uma mudança de dados, mesmo que essa ação exclua todos os dados da tabela do banco de dados.

Como o Spanner grava e armazena fluxo de alterações

Sempre que o Spanner detecta uma mudança de dados em uma coluna sendo monitorada por um fluxo de alterações, ele grava um registro de mudança de dados no armazenamento interno. A gravação de mudança de dados e o registro de mudança de dados são gravados na mesma transação. O Spanner co-localiza essas duas gravações para que elas sejam processadas pelo mesmo servidor, minimizando o processamento de gravação. A transação é replicada nas réplicas do banco de dados, sujeitando-a a custos de armazenamento e replicação. Para mais informações, consulte Preços do Spanner.

Conteúdo de um registro de mudança de dados

Cada registro de mudança de dados gravado por um fluxo de alterações inclui as seguintes informações sobre a mudança de dados:

  • O nome da tabela afetada

  • Os nomes, valores e tipos de dados das chaves primárias que identificam a linha alterada

  • Os nomes e tipos de dados das colunas da linha alterada que foram capturadas com base na definição do fluxo de alterações.

  • Os valores antigos das colunas da linha. A disponibilidade dos valores antigos e o conteúdo que eles rastreiam, que podem ser apenas as colunas modificadas ou a linha rastreada inteira, dependem do tipo de captura de valor configurado pelo usuário.

  • Os novos valores das colunas da linha. A disponibilidade dos novos valores e o conteúdo que eles rastreiam dependem do tipo de captura de valor configurado pelo usuário.

  • O tipo de modificação (inserir, atualizar ou excluir)

  • O carimbo de data/hora de confirmação

  • O ID da transação

  • O número de sequência do registro

  • O tipo de captura de valor do registro de mudança de dados.

Para uma análise mais detalhada da estrutura dos registros de mudança de dados, consulte Registros de mudança de dados.

Retenção de dados

Um fluxo de alterações retém os registros de mudança de dados por um período entre um e trinta dias. É possível usar a DDL para especificar um limite de retenção de dados diferente do padrão de sete dias ao criar um fluxo de alterações ou ajustá-lo a qualquer momento no futuro. Reduzir o limite de retenção de dados de um fluxo de alterações fará com que todos os dados de mudança históricos mais antigos que o novo limite fiquem imediatamente e permanentemente indisponíveis para os leitores desse fluxo de alterações.

Esse período de armazenamento de dados apresenta uma compensação: um período de armazenamento mais longo acarreta maiores demandas de armazenamento no banco de dados do fluxo.

Tipo de captura de valor

A opção de configuração tipo de captura de valor de um fluxo de alterações controla a maneira como ele armazena os valores de uma linha alterada. É possível usar a DDL para especificar um dos seguintes tipos de captura de valor para um fluxo de alterações:

  • OLD_AND_NEW_VALUES: registra os valores antigos e novos das colunas modificadas de uma linha.

  • NEW_VALUES: registra apenas os novos valores das colunas sem chave, mas nenhum valor antigo.

  • NEW_ROW: registra todos os novos valores de colunas monitoradas, modificadas e não modificadas, sempre que qualquer uma dessas colunas mudar. Nenhum valor antigo é capturado.

  • NEW_ROW_AND_OLD_VALUES: registra todos os novos valores para colunas modificadas e não modificadas, e valores antigos para colunas modificadas.

Excluir exclusões com base no tempo de vida

No Spanner, o tempo de vida (TTL) permite definir políticas para excluir dados periodicamente das tabelas do Spanner. Por padrão, os fluxo de alterações incluem todas as exclusões com base em TTL. É possível usar exclude_ttl_deletes para definir o fluxo de alterações para excluir exclusões com base em TTL. Quando você define esse filtro para excluir exclusões com base em TTL, apenas as exclusões futuras com base em TTL são excluídas do fluxo de alterações.

O valor padrão desse filtro é false. Para excluir exclusões com base em TTL, defina o filtro como true. É possível adicionar o filtro ao criar um fluxo de alterações ou modificar um fluxo de alterações atual para incluir o filtro.

Tipo de modificação da tabela

Por padrão, os fluxo de alterações incluem todas as modificações de tabela, como inserções, atualizações e exclusões. É possível filtrar uma ou mais dessas modificações de tabela do escopo do fluxo de alterações usando as seguintes opções de filtro disponíveis:

  • exclude_insert: exclui todas as modificações de tabela INSERT
  • exclude_update: exclui todas as modificações de tabela UPDATE
  • exclude_delete: exclui todas as modificações de tabela DELETE

O valor padrão desses filtros é false. Para excluir um tipo específico de modificação de tabela, defina o filtro como true. É possível definir um ou mais filtros ao mesmo tempo.

É possível adicionar um filtro para um tipo de modificação de tabela ao criar um fluxo de alterações ou modificar o filtro para um tipo de modificação de tabela para um fluxo de alterações atual.

Exclusão de registros no nível da transação

Por padrão, um fluxo de alterações monitora todas as transações de gravação no banco de dados porque a opção DDL allow_txn_exclusion está definida como false. É possível definir a opção allow_txn_exclusion como true para permitir que o fluxo de alterações ignore registros de transações de gravação especificadas. Se você não definir essa opção como true, todas as transações de gravação serão monitoradas, mesmo que você use o parâmetro exclude_txn_from_change_streams na transação de gravação.

É possível ativar essa opção ao criar um fluxo de alterações ou modificar um fluxo de alterações atual.

Excluir transação de gravação de fluxo de alterações

Para excluir uma transação de gravação de fluxo de alterações, é necessário definir o parâmetro exclude_txn_from_change_streams como true. Esse parâmetro faz parte dos TransactionOptions e BatchWriteRequest métodos. O valor padrão desse parâmetro é false. É possível definir esse parâmetro com a API RPC, a API REST ou usando as bibliotecas de cliente. Para mais informações, consulte Especificar uma transação de gravação a ser excluída de fluxos de alterações.

Não é possível definir esse parâmetro como true para transações somente leitura. Se você fizer isso, a API vai retornar um erro de argumento inválido.

Para fluxo de alterações que monitoram colunas modificadas por transações, quando exclude_txn_from_change_streams está definido como true, dois cenários são possíveis:

  • Se a opção DDL allow_txn_exclusion estiver definida como true, as atualizações feitas nessa transação não serão registradas no fluxo de alterações.
  • Se você não definir a opção DDL allow_txn_exclusion ou se ela estiver definida como false, as atualizações feitas nessa transação serão registradas no fluxo de alterações.

Se você não definir a opção exclude_txn_from_change_streams ou se ela estiver definida como false, então todos os fluxo de alterações que monitoram colunas modificadas por transações vão capturar as atualizações feitas dentro dessa transação.

Como ler fluxo de alterações

O Spanner oferece várias maneiras de ler os dados de um fluxo de alterações:

  • Diretamente, usando a API Spanner.

  • Pelo Dataflow, usando o conector Apache Beam SpannerIO. O Google também oferece modelos do Dataflow para casos de uso comuns.

  • Usando o conector Kafka baseado em Debezium para fluxo de alterações do Spanner. Esse conector transmite registros de mudanças diretamente para tópicos do Kafka.

  • Usando o Datastream para transmitir as mudanças diretamente para o BigQuery, tabelas do BigLake Iceberg ou Cloud Storage.

É possível fornecer isolamento parcial para leituras fluxo de alterações usando leituras direcionadas. As leituras direcionadas podem ajudar a minimizar o impacto nas cargas de trabalho transacionais no banco de dados. É possível usar a API Spanner para encaminhar leituras de fluxos de alterações para um tipo ou região de réplica específico em uma configuração de instância multirregional ou uma configuração regional personalizada com regiões somente leitura opcionais. Para mais informações, consulte Leituras direcionadas.

Como usar a API

É possível escrever código para usar a API Spanner para ler registros de fluxo de alterações diretamente. Esse método oferece a menor latência de leitura possível e a maior flexibilidade de código. No entanto, o uso direto da API exige que você gerencie várias tarefas no código:

  • Acompanhe os tokens de partição retornados e os estados deles.
  • Divida grandes janelas de tempo em janelas menores e não sobrepostas.
  • Leia continuamente das partições e acompanhe os estados delas.
  • Gerencie confirmações ou pontos de verificação para repetição eficiente e recuperação de erros.

Para mais informações sobre como consultar fluxo de alterações e interpretar os registros retornados, consulte Partições, registros e consultas de fluxos de alterações.

Como usar o Dataflow

Use o conector Apache Beam SpannerIO para criar pipelines do Dataflow que leem fluxo de alterações. Depois de configurar o conector com detalhes sobre um fluxo de alterações específico, ele gera automaticamente novos registros de mudança de dados em um conjunto de dados PCollection único e ilimitado, pronto para processamento adicional por transformações subsequentes no pipeline do Dataflow.

O Dataflow usa funções de janela para dividir coleções ilimitadas em componentes lógicos ou janelas. Como resultado, o Dataflow oferece streaming quase em tempo real ao ler fluxo de alterações.

O Google oferece modelos que permitem criar rapidamente pipelines do Dataflow para casos de uso comuns de fluxo de alterações, incluindo o envio de todas as mudanças de dados de um fluxo para um conjunto de dados do BigQuery ou a cópia delas para um bucket do Cloud Storage.

Para uma visão geral mais detalhada de como os fluxo de alterações e o Dataflow funcionam juntos, consulte Criar conexões de fluxo de alterações com o Dataflow.

Como usar o conector Kafka

O conector Kafka gera diretamente registros de fluxo de alterações em um tópico do Kafka. Ele abstrai os detalhes da consulta de fluxo de alterações usando a API Spanner.

Para saber mais sobre como fluxo de alterações e o conector Kafka funcionam juntos, consulte Criar conexões de fluxo de alterações com o conector Kafka.

Como usar o Datastream

Use o Datastream, um serviço de captura de dados alterados (CDC) e replicação sem servidor e fácil de usar disponível em Google Cloud. O Datastream oferece suporte a fluxo de alterações do Spanner e permite ler e transmitir os dados de mudanças para vários destinos.

Para saber mais sobre como o Datastream oferece suporte ao Spanner para leitura e transmissão de dados de mudanças, consulte Spanner como uma origem.

Limites

Há vários limites nos fluxo de alterações, incluindo o número máximo de fluxo de alterações que um banco de dados pode ter e o número máximo de fluxos que podem monitorar uma única coluna. Para conferir uma lista completa, consulte Limites de fluxo de alterações.

Permissões

Os fluxos de alterações usam o seguinte:

  • A criação, atualização ou descarte de fluxo de alterações exige spanner.databases.updateDdl.

  • A leitura dos dados de um fluxo de alterações exige spanner.databases.select.

Se você estiver usando o conector SpannerIO, o proprietário do job do Dataflow que lê dados de fluxo de alterações vai precisar de outras permissões do Identity and Access Management (IAM), no banco de dados do aplicativo ou em um banco de dados de metadados separado. Consulte Criar um banco de dados de metadados.

A seguir