Un flusso di modifiche monitora e trasmette in streaming le modifiche ai dati di un database Spanner, ovvero inserimenti, aggiornamenti ed eliminazioni, quasi in tempo reale.
Questa pagina offre una panoramica di alto livello degli stream delle modifiche di Spanner: cosa fanno e come funzionano. Per scoprire come creare e gestire modifiche in tempo reale nel database e collegarli ad altri servizi, segui i link in Passaggi successivi.
Scopo dei modifiche in tempo reale
Gli stream di modifiche forniscono un modo flessibile e scalabile per trasmettere in streaming le modifiche ai dati ad altri servizi. I casi d'uso comuni includono:
Replica le modifiche ai dati Spanner in un data warehouse, ad esempio BigQuery, per l'analisi.
Attivazione della logica dell'applicazione in base alle modifiche ai dati inviate a una coda di messaggi, ad esempio Pub/Sub.
Memorizzazione delle modifiche ai dati in Cloud Storage, per scopi di conformità o archiviazione.
Configurazione del flusso di modifiche
Spanner tratta modifiche in tempo reale come oggetti schema, in modo simile a tabelle e indici. Pertanto, puoi creare, modificare ed eliminare i flussi di modifiche utilizzando le istruzioni DDL e puoi visualizzare i flussi di modifiche di un database proprio come altri oggetti schema gestiti da DDL.
Puoi configurare un flusso di modifiche per monitorare le modifiche ai dati in un intero database o limitarne l'ambito a tabelle e colonne specifiche. Un database può avere più modifiche in tempo reale e una determinata tabella o colonna può avere più flussi che la monitorano, entro i limiti.
Se vuoi, puoi configurare un flusso di modifiche con quanto segue:
- Specifica il periodo di conservazione dei dati per ignorare il periodo di conservazione predefinito di un giorno.
- Specifica il tipo di acquisizione valore per sostituire il tipo di acquisizione valore predefinito
OLD_AND_NEW_VALUES
. - Applica un filtro di eliminazione basato sul TTL per escludere le eliminazioni basate sul TTL dai modifiche in tempo reale.
- Applica un filtro alle modifiche alla tabella per escludere tutte le modifiche alla tabella
INSERT
,UPDATE
oDELETE
. - Attiva l'esclusione dei record a livello di transazione per escludere determinate transazioni dai tuoi modifiche in tempo reale.
L'emissione del DDL che crea uno stream di modifiche avvia un'operazione a lunga esecuzione. Al termine, il nuovo flusso di modifiche inizia immediatamente a monitorare le tabelle e le colonne assegnate.
Monitoraggio implicito di tabelle e colonne
Gli stream di modifiche che monitorano un'intera tabella monitorano implicitamente tutte le colonne della tabella, anche quando la definizione della tabella viene aggiornata. Ad esempio, quando aggiungi nuove colonne a questa tabella, lo stream di modifiche inizia automaticamente a monitorare queste nuove colonne, senza richiedere alcuna modifica alla configurazione dello stream di modifiche. Analogamente, lo stream delle modifiche smette automaticamente di monitorare le colonne eliminate dalla tabella.
Modifiche in tempo reale dell'intero database funzionano allo stesso modo. Osservano implicitamente ogni colonna di ogni tabella, osservando automaticamente qualsiasi tabella o colonna aggiunta dopo la creazione dello stream di modifiche e smettendo di osservare qualsiasi tabella o colonna eliminata.
Monitoraggio esplicito di tabelle e colonne
Se configuri un flusso di modifiche in modo che osservi solo determinate colonne di una tabella e in seguito aggiungi colonne a quella tabella, il flusso di modifiche non inizierà a osservare queste colonne a meno che tu non lo riconfiguri.
Lo schema del database considera modifiche in tempo reale come oggetti dipendenti di qualsiasi colonna o tabella che monitorano esplicitamente. Prima di poter eliminare una colonna o una tabella di questo tipo, devi rimuoverla manualmente dalla configurazione di qualsiasi flusso di modifiche che la monitora esplicitamente.
Tipi di modifiche ai dati monitorate dai modifiche in tempo reale
Le modifiche ai dati monitorate da un flusso di modifiche includono tutti gli inserimenti, gli aggiornamenti e le eliminazioni apportati alle tabelle e alle colonne monitorate. Queste modifiche possono provenire da:
Eliminazioni a cascata nelle tabelle secondarie con interfoliazione
Eliminazioni risultanti dalle regole Time to live
Gli stream di modifiche possono monitorare le modifiche ai dati solo nelle colonne e nelle tabelle create dagli utenti. Non monitorano indici, viste, altri modifiche in tempo reale o tabelle di sistema come lo schema informativo o le tabelle delle statistiche. I flussi di modifiche non monitorano le colonne generate, a meno che non facciano parte della chiave primaria. Le colonne della chiave primaria vengono sempre monitorate.
Inoltre, le modifiche in tempo reale non monitorano le modifiche allo schema o qualsiasi modifica ai dati che derivano direttamente dalle modifiche allo schema, ad eccezione dei backfill per i valori predefiniti. Ad esempio, un flusso di modifiche che monitora un intero database non considera e non registra l'eliminazione di una tabella come modifica dei dati, anche se questa azione elimina tutti i dati della tabella dal database.
Come Spanner scrive e archivia i modifiche in tempo reale
Ogni volta che Spanner rileva una modifica dei dati in una colonna monitorata da un flusso di modifiche, scrive un record di modifica dei dati nel suo spazio di archiviazione interno. La scrittura della modifica dei dati e il record della modifica dei dati vengono scritti all'interno della stessa transazione. Spanner colloca entrambi questi write in modo che vengano elaborati dallo stesso server, riducendo al minimo l'elaborazione dei write. La transazione viene poi replicata nelle repliche del database, il che comporta costi di archiviazione e replicazione. Per ulteriori informazioni, consulta la pagina Prezzi di Spanner.
Contenuti di un record di modifica dei dati
Ogni record di modifica dei dati scritto da un flusso di modifiche include le seguenti informazioni sulla modifica dei dati:
Il nome della tabella interessata
I nomi, i valori e i tipi di dati delle chiavi primarie che identificano la riga modificata
I nomi e i tipi di dati delle colonne della riga modificata che sono stati acquisiti in base alla definizione dello stream di modifiche.
I valori precedenti delle colonne della riga. La disponibilità dei valori precedenti e dei contenuti che monitorano, che possono essere solo le colonne modificate o l'intera riga monitorata, dipende dal tipo di acquisizione dei valori configurato dall'utente.
I nuovi valori delle colonne della riga. La disponibilità dei nuovi valori e dei contenuti che monitorano dipende dal tipo di acquisizione del valore configurato dall'utente.
Il tipo di modifica (inserimento, aggiornamento o eliminazione)
Il timestamp del commit
ID transazione
Il numero di sequenza del record
Il tipo di acquisizione del valore del record di modifica dei dati.
Per un'analisi più approfondita della struttura dei record di modifica dei dati, vedi Record di modifica dei dati.
Conservazione dei dati
Un flusso di modifiche conserva i record delle modifiche ai dati per un periodo di tempo compreso tra uno e trenta giorni. Puoi utilizzare DDL per specificare un limite di conservazione dei dati diverso da quello predefinito di un giorno quando crei inizialmente uno stream di modifiche o per modificarlo in un secondo momento. Tieni presente che la riduzione del limite di conservazione dei dati di un flusso di modifiche renderà tutti i dati delle modifiche storiche precedenti al nuovo limite immediatamente e definitivamente non disponibili per i lettori del flusso di modifiche.
Questo periodo di conservazione dei dati presenta un compromesso: un periodo di conservazione più lungo comporta maggiori esigenze di spazio di archiviazione nel database dello stream.
Tipo di acquisizione valore
L'opzione di configurazione Tipo di acquisizione dei valori di uno stream di modifiche controlla il modo in cui vengono memorizzati i valori di una riga modificata. Puoi utilizzare DDL per specificare uno dei seguenti tipi di acquisizione dei valori per uno stream di modifiche:
OLD_AND_NEW_VALUES
: acquisisce i valori precedenti e nuovi delle colonne modificate di una riga.NEW_VALUES
: acquisisce solo i nuovi valori delle colonne non chiave, ma non i valori precedenti.NEW_ROW
: acquisisce tutti i nuovi valori delle colonne monitorate, sia modificati che non modificati, ogni volta che una di queste colonne cambia. Non vengono acquisiti valori precedenti.NEW_ROW_AND_OLD_VALUES
: acquisisce tutti i nuovi valori per le colonne modificate e non modificate, nonché i valori precedenti per le colonne modificate.
Escludi eliminazioni basate sulla durata (TTL)
In Spanner, la durata (TTL) ti consente di
impostare criteri per eliminare periodicamente i dati dalle tabelle Spanner.
Per impostazione predefinita, i modifiche in tempo reale includono tutte le eliminazioni basate sul TTL. Puoi utilizzare
exclude_ttl_deletes
per impostare il flusso di modifiche in modo da escludere le eliminazioni basate sul TTL.
Quando imposti questo filtro per escludere le eliminazioni basate sul TTL, solo le eliminazioni basate sul TTL future
vengono escluse dal flusso delle modifiche.
Il valore predefinito di questo filtro è false
. Per escludere le eliminazioni basate sul TTL,
imposta il filtro su true
. Puoi
aggiungere il filtro quando crei uno stream di modifiche
oppure
modificare uno stream di modifiche esistente per includere il filtro.
Tipo di modifica della tabella
Per impostazione predefinita, i modifiche in tempo reale includono tutte le modifiche alla tabella, come inserimenti, aggiornamenti ed eliminazioni. Puoi filtrare una o più di queste modifiche alla tabella dall'ambito del flusso di modifiche utilizzando le seguenti opzioni di filtro disponibili:
exclude_insert
: escludi tutte le modifiche alla tabellaINSERT
exclude_update
: escludi tutte le modifiche alla tabellaUPDATE
exclude_delete
: escludi tutte le modifiche alla tabellaDELETE
Il valore predefinito di questi filtri è false
. Per escludere un tipo specifico di
modifica della tabella, imposta il filtro su true
. Puoi impostare uno o più filtri contemporaneamente.
Puoi aggiungere un filtro per un tipo di modifica della tabella quando crei uno stream di modifiche o modificare il filtro per un tipo di modifica della tabella per uno stream di modifiche esistente.
Esclusione dei record a livello di transazione
Per impostazione predefinita, uno stream di modifiche monitora tutte le transazioni di scrittura nel database
perché l'opzione DDL allow_txn_exclusion
è impostata su false
. Puoi impostare l'opzione
allow_txn_exclusion
su true
per consentire al flusso di modifiche di
ignorare i record delle transazioni di scrittura specificate. Se non imposti questa opzione su true
, tutte le transazioni di scrittura vengono monitorate, anche se utilizzi il parametro exclude_txn_from_change_streams
nella transazione di scrittura.
Puoi attivare questa opzione quando crei uno stream di modifiche o modificare uno stream di modifiche esistente.
Escludere la transazione di scrittura dai modifiche in tempo reale
Per escludere una transazione di scrittura dai modifiche in tempo reale, devi impostare il parametro
exclude_txn_from_change_streams
su true
. Questo parametro fa parte dei metodi TransactionOptions
e BatchWriteRequest
. Il valore predefinito di questo parametro è false
. Puoi impostare questo
parametro con l'API RPC, l'API REST o utilizzando le librerie client. Per maggiori
informazioni, consulta la pagina Specificare una transazione di scrittura da escludere dagli stream di modifiche.
Non puoi impostare questo parametro su true
per le transazioni di sola lettura. In questo caso, l'API restituisce un errore di argomento non valido.
Per le colonne di monitoraggio degli modifiche in tempo reale modificate dalle transazioni, quando
exclude_txn_from_change_streams
è impostato su true
, sono possibili due scenari:
- Se l'opzione DDL
allow_txn_exclusion
è impostata sutrue
, gli aggiornamenti apportati all'interno di questa transazione non vengono registrati nel flusso di modifiche. - Se non imposti l'opzione DDL
allow_txn_exclusion
o se è impostata sufalse
, gli aggiornamenti apportati all'interno di questa transazione vengono registrati nel flusso di modifiche.
Se non imposti l'opzione exclude_txn_from_change_streams
o se è impostata su
false
, tutti i modifiche in tempo reale che monitorano le colonne modificate dalle transazioni
acquisiscono gli aggiornamenti apportati all'interno di quella transazione.
Lettura dei modifiche in tempo reale
Spanner offre diversi modi per leggere i dati di uno stream delle modifiche:
Tramite Dataflow, utilizzando il connettore Apache Beam SpannerIO. Questa è la soluzione consigliata per la maggior parte delle applicazioni di stream delle modifiche. Google fornisce anche modelli Dataflow per i casi d'uso comuni.
Direttamente, utilizzando l'API Spanner. In questo modo si rinuncia all'astrazione e alle funzionalità delle pipeline Dataflow per ottenere la massima velocità e flessibilità.
Utilizzando il connettore Kafka basato su Debezium per le modifiche in tempo reale di Spanner. Questo connettore trasmette i record di modifica direttamente negli argomenti Kafka.
Puoi fornire un isolamento parziale per le letture modifiche in tempo reale utilizzando le letture dirette. Le letture dirette possono contribuire a ridurre al minimo l'impatto sui carichi di lavoro transazionali nel tuo database. Puoi utilizzare l'API Spanner per instradare le letture degli stream di modifiche a un tipo di replica o a una regione specifici all'interno di una configurazione di istanza multiregionale o di una configurazione regionale personalizzata con regioni di sola lettura facoltative. Per ulteriori informazioni, consulta letture guidate.
Utilizzo di Dataflow
Utilizza il connettore Apache Beam SpannerIO
per creare pipeline Dataflow che leggono dai modifiche in tempo reale. Dopo aver configurato il connettore con i dettagli di un particolare flusso di modifiche, questo genera automaticamente nuovi record di modifica dei dati in un unico set di dati PCollection
senza limiti, pronto per l'ulteriore elaborazione da parte delle trasformazioni successive nella pipeline Dataflow.
Dataflow utilizza le funzioni di finestratura per dividere le raccolte senza limiti in componenti logici o finestre. Di conseguenza, Dataflow fornisce lo streaming quasi in tempo reale durante la lettura damodifiche in tempo realehe.
Google fornisce modelli che consentono di creare rapidamente pipeline Dataflow per casi d'uso comuni di flussi di modifiche, incluso l'invio di tutte le modifiche ai dati di un flusso a un set di dati BigQuery o la loro copia in un bucket Cloud Storage.
Per una panoramica più dettagliata di come funzionano insieme i modifiche in tempo reale e Dataflow, consulta Creare connessioni di modifiche in tempo reale con Dataflow.
Utilizzo dell'API
In alternativa all'utilizzo di Dataflow per creare pipeline di stream delle modifiche, puoi scrivere codice che utilizza l'API Spanner per leggere direttamente i record di uno stream delle modifiche. In questo modo puoi leggere i record di modifica dei dati nello stesso modo in cui lo fa il connettore SpannerIO, fornendo le latenze più basse possibili durante la lettura dei dati dello stream di modifiche anziché la flessibilità di Dataflow.
Per scoprire di più, consulta Eseguire query sui flussi di modifiche. Per una discussione più dettagliata su come eseguire query suimodifiche in tempo realee e interpretare i record restituiti, vedi Partizioni, record e query dei flussi di modifiche.
Utilizzo del connettore Kafka
Il connettore Kafka restituisce direttamente i record dello stream di modifiche in un argomento Kafka. Astrae i dettagli delle query dei modifiche in tempo reale utilizzando l'API Spanner.
Per scoprire di più su come funzionano insieme i modifiche in tempo reale e il connettore Kafka, consulta Creare connessioni di modifiche in tempo reale con il connettore Kafka.
Limiti
Esistono diversi limiti per modifiche in tempo reale, tra cui il numero massimo di modifiche in tempo reale che un database può avere e il numero massimo di flussi che possono monitorare una singola colonna. Per un elenco completo, consulta Limiti dello stream di modifiche.
Autorizzazioni
Change Streams utilizza quanto segue:
La creazione, l'aggiornamento o l'eliminazione di modifiche in tempo reale richiede
spanner.databases.updateDdl
.La lettura dei dati di uno stream di modifiche richiede
spanner.databases.select
.
Se utilizzi il connettore SpannerIO, il proprietario del job Dataflow che legge i dati dello stream delle modifiche richiede autorizzazioni IAM aggiuntive, nel database dell'applicazione o in un database di metadati separato. Consulta Creare un database di metadati.
Passaggi successivi
Scopri la sintassi DDL per creare e gestire i flussi di modifiche.
Utilizza modifiche in tempo reale e i modelli per replicare le modifiche da Spanner a BigQuery o a Cloud Storage.
Scopri di più sulla creazione di pipeline Dataflow per elaborare i dati del flusso di modifiche.
Esplora ulteriormente i dettagli degli stream di modifiche, inclusi maggiori dettagli sull'architettura degli stream di modifiche, su come eseguire query sugli modifiche in tempo reale utilizzando l'API e su come interpretare i record restituiti.
Scopri di più sull'utilizzo del connettore Kafka per elaborare i dati delle modifiche in tempo reale.