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ças 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 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:
Replicar mudanças de dados do Spanner em um data warehouse, como o BigQuery, para análise.
Acionamento da lógica do aplicativo com base em mudanças de dados enviadas para uma fila de mensagens, como o Pub/Sub.
Armazenar mudanças de dados no Cloud Storage para fins de conformidade ou arquivamento.
Configuração de fluxo de alterações
O Spanner trata fluxo de alterações como objetos de esquema, assim como tabelas e índices. Assim, você cria, modifica e exclui fluxos de mudanças usando instruções DDL, e pode ver os fluxos de mudanças de um banco de dados assim como 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.
É possível configurar um fluxo de mudanças com o seguinte:
- Especifique o período de retenção de dados para substituir o período padrão de um dia.
- Especifique o tipo de captura de valor para substituir o
tipo de captura de valor padrão
OLD_AND_NEW_VALUES
. - Aplique um filtro de exclusões com base em TTL para remover as exclusões com base em TTL dos seus fluxo de alterações.
- Aplique um filtro de modificações na tabela para excluir todas as modificações de tabela
INSERT
,UPDATE
ouDELETE
. - Ative a exclusão de registros no nível da transação para excluir determinadas transações dos seus fluxo de alterações.
A emissão da DDL que cria um fluxo de alterações inicia uma operação de longa duração. Quando ele for concluído, o novo streaming de alterações começará imediatamente a monitorar as tabelas e colunas atribuídas a ele.
Assistir tabelas e colunas implicitamente
Os fluxos de mudanças 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 a essa tabela, o fluxo de mudanças começa a monitorar automaticamente essas novas colunas, sem exigir nenhuma modificação na configuração do fluxo. Da mesma forma, o fluxo de alterações para de monitorar automaticamente as colunas removidas dessa tabela.
Fluxo de alterações de banco de dados inteiro funcionam da mesma forma. Eles monitoram implicitamente todas as colunas em todas as tabelas, monitorando automaticamente qualquer tabela ou coluna adicionada após a criação do fluxo de alterações e deixando de monitorar qualquer tabela ou coluna excluída.
Monitorar explicitamente tabelas e colunas
Se você configurar um fluxo de mudanças para monitorar apenas colunas específicas em uma tabela e depois adicionar mais colunas a ela, o fluxo não vai começar a monitorar essas colunas, a menos que você o reconfigure para 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 excluir uma coluna ou tabela desse tipo, remova manualmente da configuração de qualquer fluxo de mudanças que 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 monitoradas. Essas mudanças podem vir de:
Exclusões em cascata em tabelas filhas intercaladas
Exclusões resultantes de regras de time to live
Os fluxos de alterações só podem monitorar mudanças 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 mudanças não monitoram colunas geradas, a menos que elas façam 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 alterações de esquema nem mudanças de dados que resultam diretamente delas, exceto backfills para valores padrão. Por exemplo, um fluxo de alterações que monitora um banco de dados inteiro não considera nem registra a exclusão de uma 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 monitorada por um fluxo de alterações, ele grava um registro de mudança de dados no armazenamento interno. A gravação da mudança de dados e o registro de mudança de dados são gravados na mesma transação. O Spanner colocaliza essas duas gravações para que 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 os 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:
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 podem ser apenas as colunas modificadas ou a linha inteira 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 do conteúdo que eles rastreiam depende do tipo de captura de valor configurado pelo usuário.
O tipo de modificação (inserir, atualizar ou excluir)
O carimbo de data/hora do commit
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 de tempo entre um e 30 dias. É possível usar a DDL para especificar um limite de retenção de dados diferente do padrão de um dia ao criar inicialmente um fluxo de alterações ou ajustar esse limite a qualquer momento no futuro. Reduzir o limite de retenção de dados de um fluxo de alterações vai tornar todos os dados históricos de alterações mais antigos que o novo limite imediatamente e permanentemente indisponíveis para os leitores desse fluxo.
Esse período de armazenamento de dados apresenta uma compensação: quanto maior o período, maior a demanda 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 mudanças controla a maneira como ele armazena os valores de uma linha alterada. É possível usar DDL para especificar um dos seguintes tipos de captura de valor para um fluxo de mudanças:
OLD_AND_NEW_VALUES
: registra os valores antigos e novos das colunas modificadas de uma linha.NEW_VALUES
: captura apenas os novos valores das colunas sem chave, mas não os valores antigos.NEW_ROW
: captura todos os valores novos das colunas monitoradas, modificadas e não modificadas, sempre que uma dessas colunas muda. Nenhum valor antigo é registrado.NEW_ROW_AND_OLD_VALUES
: captura todos os novos valores das colunas modificadas e não modificadas, além dos valores antigos das colunas modificadas.
Excluir exclusões 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 baseadas em TTL. Use exclude_ttl_deletes
para definir seu fluxo de alterações e excluir as exclusões baseadas 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 no TTL, defina o filtro como true
. Você pode
adicionar o filtro ao criar um fluxo de mudanças
ou
modificar um fluxo de mudanças 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 mudanças usando as seguintes opções de filtro disponíveis:
exclude_insert
: exclui todas as modificações da tabelaINSERT
exclude_update
: exclui todas as modificações da tabelaUPDATE
exclude_delete
: exclui todas as modificações da tabelaDELETE
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 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
. Defina a opção allow_txn_exclusion
como true
para 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 dos fluxo de alterações
Para excluir uma transação de gravação dos fluxo de alterações, defina o parâmetro
exclude_txn_from_change_streams
como true
. Esse parâmetro faz parte dos métodos TransactionOptions
e BatchWriteRequest
. 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 dos streams 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 colunas de monitoramento de fluxo de alterações modificadas por transações, quando exclude_txn_from_change_streams
é definido como true
, dois cenários são possíveis:
- Se a opção DDL
allow_txn_exclusion
estiver definida comotrue
, 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 comofalse
, as atualizações feitas nessa transação serão registradas no fluxo de mudanças.
Se você não definir a opção exclude_txn_from_change_streams
ou se ela estiver definida como
false
, todas as colunas de monitoramento de fluxo de alterações modificadas por transações
capturarão as atualizações feitas nessa transação.
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 SpannerIO do Apache Beam. Essa é a solução recomendada para a maioria dos aplicativos de fluxo de alterações. 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 leituras de fluxos de mudanças 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 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 determinado fluxo de alterações, ele gera automaticamente novos registros de
alteração de dados em um único conjunto de dados
PCollection
sem limites, pronto para processamento posterior 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 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 fluxos 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 a API
Como alternativa ao uso do Dataflow para criar pipelines de fluxo 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 mudança de dados da mesma forma que o conector SpannerIO, oferecendo as menores latências possíveis ao ler dados de fluxo de alterações em vez de oferecer a flexibilidade do Dataflow.
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 do Kafka
O conector do Kafka gera diretamente registros de stream de mudanças 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 funcionam juntos, consulte Criar conexões de fluxo de alterações com o conector do Kafka.
Limites
Há vários limites para 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 mudanças.
Permissões
Os fluxos de mudanças usam o seguinte:
Para criar, atualizar ou descartar fluxo de alterações, é necessário ter a permissão
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 mais permissões do IAM, seja 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
Saiba mais sobre a sintaxe da DDL para criar e gerenciar fluxos de alterações.
Use fluxo de alterações e modelos para replicar mudanças do Spanner para o BigQuery ou para o Cloud Storage.
Saiba mais sobre como criar pipelines do Dataflow para processar dados de fluxos de alterações.
Saiba mais sobre os detalhes dos fluxos de alterações, incluindo mais informações sobre a arquitetura do fluxo de alterações, como consultar fluxos de alterações usando a API e interpretar os registros retornados.
Saiba mais sobre como usar o conector do Kafka para processar dados de fluxo de alterações.