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 de alto nível dos fluxos de mudança do Spanner: o que eles fazem e como funcionam. Para saber como criar e gerenciar fluxo de alterações no seu banco de dados e conectá-los a outros serviços, siga os links em O que vem por aí.

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:

  • Replique as mudanças de dados do Spanner para um data warehouse, como o BigQuery, para análises.

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

  • Armazenar alterações de dados no Cloud Storage para fins de conformidade ou arquivamento.

Mudar a configuração do fluxo

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 acessar os fluxos de alterações de um banco de dados, assim como outros objetos de esquema gerenciados por DDL.

É possível configurar um fluxo de mudanças para monitorar alterações 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 que a monitoram, dentro de limites.

Também é possível configurar um fluxo de mudanças para especificar um período de retenção de dados, um tipo de captura de valor, filtrar exclusões com base no TTL ou filtrar modificações de tabelas.

Emitir o DDL que cria um fluxo de mudanças inicia uma operação de longa duração. Quando ele for concluído, o novo fluxo de alterações vai começar a monitorar as tabelas e colunas atribuídas a ele.

Observar tabelas e colunas de forma implícita

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

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

Observar tabelas e colunas de forma explícita

Se você configurar um fluxo de mudanças para monitorar apenas colunas específicas em uma tabela e adicionar colunas a essa tabela posteriormente, o fluxo de mudanças não vai começar a monitorar essas colunas, a menos que você reconfigure esse fluxo de mudanças para fazer isso.

O esquema do banco de dados trata as fluxo de alterações como objetos dependentes de qualquer coluna ou tabela que elas monitoram explicitamente. Antes de excluir qualquer coluna ou tabela, remova-a manualmente da configuração de qualquer fluxo de mudanças que a monitora explicitamente.

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

As alterações 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 mudanças só podem monitorar alterações de dados em colunas e tabelas criadas pelo usuário. Elas não monitoram índices, visualizações, outras fluxo de alterações ou tabelas do sistema, como o esquema de informações ou tabelas de estatísticas. As transmissões de mudança não observam 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 alterações de dados que resultem diretamente de mudanças de esquema, exceto preenchimentos de 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 que está sendo monitorada por um fluxo de alterações, ele grava um registro de alteração de dados no armazenamento interno. A gravação de alteração de dados e o registro de alteração de dados são gravados na mesma transação. O Spanner colocaliza as 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, sujeita a custos de armazenamento e replicação. Para mais informações, consulte Preços do Spanner.

Conteúdo de um registro de alteração de dados

Cada registro de alteração de dados gravado por um fluxo de alterações inclui as seguintes informações sobre a alteração 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 capturados com base na definição do fluxo de mudanças.

  • Os valores antigos das colunas da linha. A disponibilidade dos valores antigos e do conteúdo que eles rastreiam, que pode ser apenas as colunas modificadas ou toda a linha rastreada, depende 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 da sequência do registro

  • O tipo de captura de valor do registro de alteração de dados.

Para saber mais sobre a 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 alteração de dados por um período de um a sete dias. É possível usar DDL para especificar um limite de retenção de dados diferente do padrão de um dia 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 vai fazer com que todos os dados de alterações históricas mais antigos do que o novo limite fiquem imediatamente e permanentemente indisponíveis para os leitores desse fluxo.

Esse período de armazenamento de dados apresenta um trade-off: um período de retenção mais longo tem maiores demandas de armazenamento no banco de dados do stream.

Tipo de captura de valor

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

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

  • NEW_VALUES: captura apenas os novos valores das colunas que não são chave, mas não os valores antigos.

  • NEW_ROW: captura todos os novos valores das colunas observadas, modificadas e não modificadas, sempre que qualquer uma delas mudar. Nenhum valor antigo é capturado.

  • NEW_ROW_AND_OLD_VALUES: captura todos os novos valores de colunas modificadas e não modificadas, além dos valores antigos de colunas modificadas.

Excluir com base no time to live

No Spanner, o time to live (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 no TTL. Use exclude_ttl_deletes para definir o fluxo de alterações para excluir exclusões com base no 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 mudanças.

O valor padrão desse filtro é false. Para excluir exclusões com base no 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 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 no escopo da sua transmissão de mudanças usando as seguintes opções de filtro:

  • exclude_insert: exclui todas as modificações da tabela INSERT
  • exclude_update: exclui todas as modificações da tabela UPDATE
  • exclude_delete: exclui todas as modificações da 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 mudanças ou modificar o filtro para um tipo de modificação de tabela em um fluxo de mudanças existente.

Como ler fluxo de alterações

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

  • Pelo Dataflow, usando o conector Apache Beam SpannerIO. Essa é a solução recomendada para a maioria dos aplicativos de fluxo de mudanças. O Google também oferece modelos do Dataflow para casos de uso comuns.

  • Diretamente, usando a API Spanner. Isso troca a abstração e os recursos dos pipelines do Dataflow por velocidade e flexibilidade máximas.

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

É 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 seu banco de dados. É possível usar a API Spanner para encaminhar as leituras de fluxos de mudança para um tipo ou região de réplica específica em uma configuração de instância multirregional ou uma configuração regional personalizada com regiões opcionais somente leitura. Para mais informações, consulte Leituras direcionadas.

Como usar o Dataflow

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

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

O Google fornece modelos que permitem criar rapidamente pipelines do Dataflow para casos de uso comuns de fluxos de alterações, incluindo o envio de todas as alterações 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 a API

Como alternativa ao uso do Dataflow para criar pipelines de fluxos de alterações, você pode escrever um código que use a API Spanner para ler os registros de um fluxo de alterações diretamente. Isso permite ler registros de alterações de dados da mesma forma que o conector SpannerIO, trocando a abstração que ele oferece por latências mais baixas ao ler dados de fluxo de mudanças.

Para saber mais, consulte Consultar streams de alterações. Para uma discussão mais detalhada 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 conector Kafka

O conector do Kafka gera registros de mudança de fluxo diretamente 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 do Kafka trabalham juntos, consulte Criar conexões de fluxo de alterações com o conector do Kafka.

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 do fluxo de mudanças.

Permissões

As transmissões de mudança usam:

  • A criação, atualização ou exclusão 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 do fluxo de alterações vai precisar de permissões adicionais do 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