Ein Änderungsstream beobachtet und streamt Datenänderungen in einer Spanner Datenbank – Einfügungen, Aktualisierungen und Löschungen – nahezu in Echtzeit.
Auf dieser Seite finden Sie einen allgemeinen Überblick über Spanner-Änderungsstreams: ihre Funktionen und ihre Funktionsweise. Informationen zum Erstellen und Verwalten von Änderungsstreams in Ihrer Datenbank und zum Verbinden mit anderen Diensten finden Sie unter Nächste Schritte.
Zweck von Änderungsstreams
Änderungsstreams bieten eine flexible und skalierbare Möglichkeit, Datenänderungen an andere Dienste zu streamen. Zu den häufigsten Anwendungsfällen gehören:
Spanner-Datenänderungen für Analysen in ein Data Warehouse wie BigQuery replizieren
Anwendungslogik basierend auf Datenänderungen auslösen, die an eine Nachrichten warteschlange wie Pub/Sub gesendet werden
Datenänderungen in Cloud Storage speichern, um Compliance-Anforderungen zu erfüllen oder sie zu archivieren
Änderungsstream konfigurieren
In Spanner werden Änderungsstreams wie Tabellen und Indexe als Schemaobjekte behandelt. Daher werden Änderungsstreams mit DDL-Anweisungen erstellt, geändert und gelöscht . Sie können die Änderungsstreams einer Datenbank wie andere DDL-verwaltete Schemaobjekteansehen.
Sie können einen Änderungsstream so konfigurieren, dass er Datenänderungen in einer gesamten Datenbank beobachtet, oder seinen Bereich auf bestimmte Tabellen und Spalten beschränken. Eine Datenbank kann mehrere Änderungsstreams haben und eine bestimmte Tabelle oder Spalte kann innerhalb bestimmter Grenzen von mehreren Streams beobachtet werden.
Optional können Sie einen Änderungsstream mit den folgenden Optionen konfigurieren:
- Geben Sie die Datenaufbewahrungsdauer an, um die Standardaufbewahrungsdauer von sieben Tagen zu überschreiben.
- Geben Sie den Typ der Werterfassung an, um den
Standardtyp
OLD_AND_NEW_VALUESzu überschreiben. - Wenden Sie einen TTL-basierten Löschfilter an, um TTL-basierte Löschungen aus Ihren Änderungsstreams herauszufiltern.
- Wenden Sie einen Filter für Tabellenänderungen an, um alle
INSERT,UPDATEoderDELETETabellenänderungen auszuschließen. - Aktivieren Sie den Ausschluss von Datensätzen auf Transaktionsebene um bestimmte Transaktionen aus Ihren Änderungsstreams auszuschließen.
Wenn Sie die DDL-Anweisung ausführen, mit der ein Änderungsstream erstellt wird, wird ein Vorgang mit langer Ausführungszeit gestartet. Nach Abschluss des Vorgangs beginnt der neue Änderungsstream sofort, die ihm zugewiesenen Tabellen und Spalten zu beobachten.
Tabellen und Spalten implizit beobachten
Änderungsstreams, die eine gesamte Tabelle beobachten, beobachten implizit alle Spalten in dieser Tabelle, auch wenn die Tabellendefinition aktualisiert wird. Wenn Sie beispielsweise neue Spalten zu dieser Tabelle hinzufügen, beginnt der Änderungsstream automatisch, diese neuen Spalten zu beobachten, ohne dass die Konfiguration des Änderungsstreams geändert werden muss. Ebenso beendet der Änderungsstream automatisch die Beobachtung von Spalten, die aus dieser Tabelle entfernt werden.
Änderungsstreams für die gesamte Datenbank funktionieren auf dieselbe Weise. Sie beobachten implizit jede Spalte in jeder Tabelle, beobachten automatisch alle Tabellen oder Spalten, die nach der Erstellung des Änderungsstreams hinzugefügt wurden, und beenden die Beobachtung aller Tabellen oder Spalten, die entfernt wurden.
Tabellen und Spalten explizit beobachten
Wenn Sie einen Änderungsstream so konfigurieren, dass er nur bestimmte Spalten in einer Tabelle beobachtet, und Sie später Spalten zu dieser Tabelle hinzufügen, beginnt der Änderungsstream erst dann, diese Spalten zu beobachten, wenn Sie ihn entsprechend neu konfigurieren.
Im Schema der Datenbank werden Änderungsstreams als abhängige Objekte aller Spalten oder Tabellen behandelt, die sie explizit beobachten. Bevor Sie eine solche Spalte oder Tabelle entfernen können, müssen Sie sie manuell aus der Konfiguration aller Änderungsstreams entfernen, die sie explizit beobachten.
Arten von Datenänderungen, die von Änderungsstreams beobachtet werden
Zu den Datenänderungen, die von einem Änderungsstream beobachtet werden, gehören alle Einfügungen, Aktualisierungen und Löschungen, die an den Tabellen und Spalten vorgenommen werden, die er beobachtet. Diese Änderungen können aus folgenden Quellen stammen:
Kaskadierende Löschungen in verschachtelten untergeordneten Tabellen
Löschungen, die auf Regeln für die Gültigkeitsdauer basieren
Änderungsstreams können Datenänderungen nur in von Nutzern erstellten Spalten und Tabellen beobachten. Sie beobachten keine Indexe, Ansichten, andere Änderungsstreams oder Systemtabellen wie das Informationsschema oder Statistiktabelle. Änderungsstreams beobachten keine generierten Spalten, es sei denn, die Spalte ist Teil des Primärschlüssels. Primärschlüsselspalten werden immer verfolgt.
Außerdem beobachten Änderungsstreams keine Schemaänderungen oder Daten änderungen, die direkt aus Schemaänderungen resultieren, mit Ausnahme von Backfills für Standardwerte. Ein Änderungsstream, der eine gesamte Datenbank beobachtet, betrachtet und erfasst beispielsweise das Löschen einer Tabelle nicht als Datenänderung, obwohl durch diese Aktion alle Daten dieser Tabelle aus der Datenbank gelöscht werden.
So schreibt und speichert Spanner Änderungsstreams
Jedes Mal, wenn Spanner eine Datenänderung in einer Spalte erkennt, die von einem Änderungsstream beobachtet wird , schreibt Spanner einen Datensatz für Datenänderungen in den internen Speicher. Der Schreibvorgang für die Datenänderung und der Datensatz für die Datenänderung werden in derselben Transaktion geschrieben. Spanner führt beide Schreibvorgänge am selben Ort aus, sodass sie vom selben Server verarbeitet werden und die Schreibverarbeitung minimiert wird. Die Transaktion wird dann in den Replikaten der Datenbank repliziert, wodurch Speicher- und Replikationskosten entstehen. Weitere Informationen finden Sie unter Spanner-Preise.
Inhalt eines Datensatzes für Datenänderungen
Jeder Datensatz für Datenänderungen, der von einem Änderungsstream geschrieben wird, enthält die folgenden Informationen zur Datenänderung:
Der Name der betroffenen Tabelle
Die Namen, Werte und Datentypen der Primärschlüssel, die die geänderte Zeile identifizieren
Die Namen und Datentypen der Spalten der geänderten Zeile, die basierend auf der Definition des Änderungsstreams erfasst wurden.
Die alten Werte der Spalten der Zeile. Die Verfügbarkeit der alten Werte und der Inhalt, den sie verfolgen, hängt vom vom Nutzer konfigurierten Typ der Werterfassung ab. Es können entweder nur die geänderten Spalten oder die gesamte verfolgte Zeile sein.
Die neuen Werte der Spalten der Zeile. Die Verfügbarkeit der neuen Werte und der Inhalt, den sie verfolgen, hängt vom vom Nutzer konfigurierten Typ der Werterfassung ab.
Der Änderungstyp (Einfügung, Aktualisierung oder Löschung)
Der Commit-Zeitstempel
Die Transaktions-ID
Die Datensatzsequenznummer
Der Typ der Werterfassung des Datensatzes für Datenänderungen.
Eine detailliertere Beschreibung der Struktur von Datensätzen für Datenänderungen finden Sie unter Datensätze für Datenänderungen.
Datenaufbewahrung
Ein Änderungsstream behält seine Datensätze für Datenänderungen für einen Zeitraum von ein bis dreißig Tagen bei. Sie können mit DDL ein anderes Limit für die Datenaufbewahrung als die Standardeinstellung von sieben Tagen angeben, wenn Sie einen Änderungsstream erstellen, oder es jederzeit anpassen. Beachten Sie, dass die Verringerung des Limits für die Datenaufbewahrung eines Änderungsstreams dazu führt, dass alle älteren Verlaufsdaten, die älter als das neue Limit sind, für die Leser dieses Änderungsstreams sofort und dauerhaft nicht mehr verfügbar sind.
Diese Aufbewahrungsdauer stellt einen Kompromiss dar. Eine längere Aufbewahrungsdauer führt zu höheren Speicheranforderungen für die Datenbank des Streams.
Typ der Werterfassung
Mit der Konfigurationsoption Typ der Werterfassung eines Änderungsstreams wird festgelegt, wie die Werte einer geänderten Zeile gespeichert werden. Sie können mit DDL einen der folgenden Typen der Werterfassung für einen Änderungsstream angeben:
OLD_AND_NEW_VALUES: Erfasst sowohl alte als auch neue Werte der geänderten Spalten einer Zeile.NEW_VALUES: Erfasst nur die neuen Werte der Nicht-Schlüsselspalten, aber keine alten Werte.NEW_ROW: Erfasst alle neuen Werte der beobachteten Spalten, sowohl geänderte als auch nicht geänderte, wenn sich eine dieser Spalten ändert. Es werden keine alten Werte erfasst.NEW_ROW_AND_OLD_VALUES: Erfasst alle neuen Werte für geänderte und nicht geänderte Spalten sowie alte Werte für geänderte Spalten.
TTL-basierte Löschungen ausschließen
Mit der Gültigkeitsdauer (Time-to-Live, TTL) können Sie in Spanner
Richtlinien festlegen, um Daten regelmäßig aus Spanner-Tabellen zu löschen.
Standardmäßig enthalten Änderungsstreams alle TTL-basierten Löschungen. Mit exclude_ttl_deletes können Sie festlegen, dass TTL-basierte Löschungen aus Ihrem Änderungsstream ausgeschlossen werden.
Wenn Sie diesen Filter so einstellen, dass TTL-basierte Löschungen ausgeschlossen werden, werden nur zukünftige TTL-basierte Löschungen aus Ihrem Änderungsstream ausgeschlossen.
Der Standardwert für diesen Filter ist false. Wenn Sie TTL-basierte Löschungen ausschließen möchten, setzen Sie den Filter auf true. Sie können den Filter entweder
hinzufügen, wenn Sie einen Änderungsstream erstellen
oder
einen vorhandenen Änderungsstream so ändern, dass er den Filter enthält.
Typ der Tabellenänderung
Standardmäßig enthalten Änderungsstreams alle Tabellenänderungen wie Einfügungen, Aktualisierungen und Löschungen. Mit den folgenden verfügbaren Filteroptionen können Sie eine oder mehrere dieser Tabellenänderungen aus dem Bereich Ihres Änderungsstreams herausfiltern:
exclude_insert: AlleINSERT-Tabellenänderungen ausschließenexclude_update: AlleUPDATE-Tabellenänderungen ausschließenexclude_delete: AlleDELETE-Tabellenänderungen ausschließen
Der Standardwert für diese Filter ist false. Wenn Sie einen bestimmten Typ von Tabellenänderung ausschließen möchten, setzen Sie den Filter auf true. Sie können einen oder mehrere Filter gleichzeitig festlegen.
Sie können einen Filter für einen Typ der Tabellenänderung hinzufügen wenn Sie einen Änderungsstream erstellen, oder den Filter für einen Typ der Tabellenänderung ändern für einen vorhandenen Änderungsstream.
Ausschluss von Datensätzen auf Transaktionsebene
Standardmäßig beobachtet ein Änderungsstream alle Schreibtransaktionen in der Datenbank, da die DDL-Option allow_txn_exclusion auf false gesetzt ist. Sie können die Option allow_txn_exclusion auf true setzen, damit Ihr Änderungsstream Datensätze aus bestimmten Schreibtransaktionen ignoriert. Wenn Sie diese Option nicht auf true setzen, werden alle Schreibtransaktionen beobachtet, auch wenn Sie den Parameter exclude_txn_from_change_streams in Ihrer Schreibtransaktion verwenden.
Sie können diese Option entweder aktivieren, wenn Sie einen Änderungsstream erstellen oder einen vorhandenen Änderungsstream ändern.
Schreibtransaktion aus Änderungsstreams ausschließen
Wenn Sie eine Schreibtransaktion aus Änderungsstreams ausschließen möchten, müssen Sie den Parameter exclude_txn_from_change_streams auf true setzen. Dieser Parameter ist
Teil der
TransactionOptions und
BatchWriteRequest
Methoden. Der Standardwert für diesen Parameter ist false. Sie können diesen Parameter mit der RPC API, der REST API oder den Clientbibliotheken festlegen. Weitere Informationen finden Sie unter Schreibtransaktion angeben, die aus Änderungsstreams ausgeschlossen werden soll.
Sie können diesen Parameter nicht auf true für schreibgeschützte Transaktionen setzen. In diesem Fall gibt die API einen Fehler für ein ungültiges Argument zurück.
Bei Änderungsstreams, die Spalten beobachten, die durch Transaktionen geändert wurden, sind zwei Szenarien möglich, wenn exclude_txn_from_change_streams auf true gesetzt ist:
- Wenn die DDL-Option
allow_txn_exclusionauftruegesetzt ist, werden die in dieser Transaktion vorgenommenen Aktualisierungen nicht im Änderungsstream erfasst. - Wenn Sie die DDL-Option
allow_txn_exclusionnicht festlegen oder sie auffalsegesetzt ist, werden die in dieser Transaktion vorgenommenen Aktualisierungen im Änderungsstream erfasst.
Wenn Sie die Option exclude_txn_from_change_streams nicht festlegen oder sie auf false gesetzt ist, erfassen alle Änderungsstreams, die Spalten beobachten, die durch Transaktionen geändert wurden, die in dieser Transaktion vorgenommenen Aktualisierungen.
Änderungsstreams lesen
Spanner bietet mehrere Möglichkeiten, die Daten eines Änderungsstreams zu lesen:
Direkt über die Spanner API.
Über Dataflow mit dem Apache Beam SpannerIO-Connector. Google bietet auch Dataflow-Vorlagen für gängige Anwendungsfälle.
Über den Debezium-basierten Kafka-Connector für Spanner-Änderungsstreams. Dieser Connector streamt Änderungsdatensätze direkt in Kafka-Themen.
Mit Datastream können Sie Ihre Änderungen direkt in BigQuery, BigLake Iceberg-Tabellen oder Cloud Storage streamen.
Sie können eine teilweise Isolation für Lesevorgänge von Änderungsstreams erzielen, indem Sie gezielte Lesevorgänge verwenden. Gezielte Lesevorgänge können dazu beitragen, die Auswirkungen auf Transaktionsarbeitslasten in Ihrer Datenbank zu minimieren. Mit der Spanner API können Sie Lesevorgänge von Änderungsstreams an einen bestimmten Replikattyp oder eine bestimmte Region in einer multiregionalen Instanzkonfiguration oder einer benutzerdefinierten regionalen Konfiguration mit optionalen schreibgeschützten Regionen weiterleiten. Weitere Informationen finden Sie unter Gezielte Lesevorgänge.
Verwendung der API
Sie können Code schreiben, um die Spanner API zu verwenden, um Datensätze von Änderungsstreams direkt zu lesen. Diese Methode bietet die niedrigste Leselatenz und die höchste Codeflexibilität. Wenn Sie die API direkt verwenden, müssen Sie jedoch mehrere Aufgaben in Ihrem Code verwalten:
- Zurückgegebene Partitionstokens und ihre Status verfolgen.
- Große Zeitfenster in kleinere, nicht überlappende Fenster unterteilen.
- Kontinuierlich aus Partitionen lesen und ihre Status verfolgen.
- Commits oder Checkpoints für effiziente Wiederholungen und Fehlerbehebung verwalten.
Weitere Informationen zum Abfragen von Änderungsstreams und zum Interpretieren der zurückgegebenen Datensätze finden Sie unter Änderungsstream-Partitionen, -Datensätze und -Abfragen.
Dataflow verwenden
Verwenden Sie den Apache Beam SpannerIO-Connector
, um Dataflow-Pipelines zu erstellen, die aus Änderungsstreams lesen. Nachdem
Sie den Connector mit Details
zu einem bestimmten Änderungsstream konfiguriert haben, gibt er automatisch neue Daten
änderungsdatensätze in einem einzelnen, unbegrenzten
PCollection
Dataset aus, das für die weitere Verarbeitung durch nachfolgende Transformationen in der
Dataflow-Pipeline bereit ist.
Dataflow verwendet Fensterfunktionen, um unbegrenzte Sammlungen in logische Komponenten oder Fenster zu unterteilen. Dadurch bietet Dataflow nahezu Echtzeit-Streaming beim Lesen aus Änderungsstreams.
Google bietet Vorlagen, mit denen Sie schnell Dataflow-Pipelines für gängige Anwendungsfälle von Änderungsstreams erstellen können, z. B. um alle Datenänderungen eines Streams an ein BigQuery Dataset zu senden oder sie in einen Cloud Storage-Bucket zu kopieren.
Eine detailliertere Übersicht über die Zusammenarbeit von Änderungsstreams und Dataflow finden Sie unter Verbindungen von Änderungsstreams mit Dataflow erstellen.
Kafka-Connector verwenden
Der Kafka-Connector gibt Datensätze von Änderungsstreams direkt in ein Kafka-Thema aus. Er abstrahiert die Details der Abfrage von Änderungsstreams mit der Spanner API.
Weitere Informationen zur Zusammenarbeit von Änderungsstreams und dem Kafka-Connector finden Sie unter Verbindungen von Änderungsstreams mit dem Kafka-Connector erstellen.
Datastream verwenden
Verwenden Sie Datastream, einen serverlosen, nutzerfreundlichen Change Data Capture- (CDC) und Replikationsdienst, der in Google Cloudverfügbar ist. Datastream unterstützt Spanner-Änderungsstreams und ermöglicht es Ihnen, Ihre Änderungsdaten zu lesen und an verschiedene Ziele zu streamen.
Weitere Informationen zur Unterstützung von Spanner durch Datastream beim Lesen und Streamen von Änderungsdaten finden Sie unter Spanner als Quelle.
Limits
Für Änderungsstreams gelten mehrere Limits, darunter die maximale Anzahl von Änderungsstreams, die eine Datenbank haben kann, und die maximale Anzahl von Streams, die eine einzelne Spalte beobachten können. Eine vollständige Liste finden Sie unter Limits für Änderungsstreams.
Berechtigungen
Für Änderungsstreams gelten folgende Berechtigungen:
Zum Erstellen, Aktualisieren oder Löschen von Änderungsstreams ist
spanner.databases.updateDdlerforderlich.Zum Lesen der Daten eines Änderungsstreams ist
spanner.databases.selecterforderlich.
Wenn Sie den SpannerIO-Connector verwenden, sind für den Inhaber des Dataflow-Jobs, der Daten von Änderungsstreams liest, zusätzliche IAM-Berechtigungen (Identity and Access Management) für Ihre Anwendungsdatenbank oder eine separate Metadatenbank erforderlich. Weitere Informationen finden Sie unter Metadatenbank erstellen.
Nächste Schritte
Informationen zur DDL-Syntax zum Erstellen und Verwalten von Änderungsstreams.
Änderungsstreams und Vorlagen verwenden, um Änderungen von Spanner nach BigQuery oder Cloud Storage zu replizieren.
Weitere Informationen zum Erstellen von Dataflow-Pipelines zum Verarbeiten von Daten aus Änderungsstreams.
Weitere Informationen zu Änderungsstreams, einschließlich Details zu Architektur von Änderungsstreams, zum Abfragen von Änderungsstreams mit der API und zum Interpretieren der zurückgegebenen Datensätze.
Weitere Informationen zur Verwendung des Kafka-Connectors zum Verarbeiten von Daten aus Änderungsstreams.