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: was sie tun und wie sie funktionieren. 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 erstellen, ändern und löschen Sie Änderungs streams mit DDL-Anweisungen. Sie können die Änderungsstreams einer Datenbank wie andere DDL-verwaltete Schema objekte ansehen.
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 von mehreren Streams beobachtet werden, sofern die Limits nicht überschritten 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. Alle Tabellen oder Spalten, die nach der Erstellung des Änderungsstreams hinzugefügt werden, werden automatisch beobachtet. Tabellen oder Spalten, die entfernt werden, werden nicht mehr beobachtet.
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 zur 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 keine Tabellenlöschung als Datenänderung, obwohl durch diese Aktion alle Daten dieser Tabelle aus der Datenbank gelöscht werden.
Wie Spanner Änderungsstreams schreibt und speichert
Jedes Mal, wenn Spanner eine Datenänderung in einer Spalte erkennt, die von einem Änderungsstream beobachtet wird, schreibt Spanner einen Datensatz zur Datenänderung in den internen Speicher. Der Schreibvorgang für die Datenänderung und der Datensatz zur 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 die Replikate der Datenbank repliziert, wodurch Speicher- und Replikationskosten entstehen. Weitere Informationen finden Sie unter Spanner-Preise.
Inhalt eines Datensatzes zur Datenänderung
Jeder Datensatz zur Datenänderung, 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 Sequenznummer des Datensatzes
Der Typ der Werterfassung des Datensatzes zur Datenänderung.
Eine detailliertere Beschreibung der Struktur von Datensätzen zur Datenänderung finden Sie unter Datensätze zur Datenänderung.
Datenaufbewahrung
Ein Änderungsstream behält seine Datensätze zur Datenänderung für einen Zeitraum von einem bis 30 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. Wenn Sie das Limit für die Datenaufbewahrung eines Änderungsstreams verringern, sind alle älteren Verlaufsdaten sofort und dauerhaft für die Leser dieses Änderungsstreams nicht mehr verfügbar.
Diese Aufbewahrungsdauer für Daten ist ein Kompromiss. Eine längere Aufbewahrungsdauer erfordert mehr Speicherplatz in der 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 unverä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 unveränderte Spalten sowie alte Werte für geänderte Spalten.
TTL-basierte Löschungen ausschließen
In Spanner können Sie mit der Gültigkeitsdauer (Time-to-Live, TTL)
Richtlinien festlegen, mit denen Daten regelmäßig aus Spanner-Tabellen gelöscht werden.
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 von Tabellenänderung hinzufügen wenn Sie einen Änderungsstream erstellen, oder den Filter für einen Typ von 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 wegen eines ungültigen Arguments 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, werden alle Aktualisierungen, die in dieser Transaktion vorgenommen wurden, von allen Änderungsstreams erfasst, die Spalten beobachten, die durch Transaktionen geändert wurden.
Änderungsstreams lesen
Spanner bietet mehrere Möglichkeiten, die Daten eines Änderungsstreams zu lesen:
Über Dataflow mit dem Apache Beam SpannerIO-Connector. Dies ist unsere empfohlene Lösung für die meisten Änderungsstream-Anwendungen. Google bietet auch Dataflow-Vorlagen für gängige Anwendungsfälle.
Direkt mit der Spanner API. Dabei werden die Abstraktion und die Funktionen von Dataflow-Pipelines für maximale Geschwindigkeit und Flexibilität aufgegeben.
Ü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 mit gezielten Lesevorgängen bereitstellen. Gezielte Lesevorgänge können dazu beitragen, die Auswirkungen auf transaktionale Arbeitslasten 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.
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 Datensätze zur Daten
änderung 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. Daher 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.
API verwenden
Alternativ zur Verwendung von Dataflow zum Erstellen von Änderungsstream-Pipelines können Sie auch Code schreiben, der die Spanner API verwendet, um die Datensätze eines Änderungsstreams direkt zu lesen. So können Sie Datensätze zur Datenänderung auf dieselbe Weise lesen wie mit dem SpannerIO-Connector. Dabei werden die Latenzen beim Lesen von Änderungsstream-Daten so gering wie möglich gehalten, anstatt die Flexibilität von Dataflow zu bieten.
Weitere Informationen finden Sie unter Änderungsstreams abfragen. Eine detailliertere Erläuterung zum Abfragen von Änderungsstreams und zum Interpretieren der zurückgegebenen Datensätze finden Sie unter Änderungsstream-Partitionen, -Datensätze und -Abfragen.
Kafka-Connector verwenden
Der Kafka-Connector gibt Änderungsstream-Datensätze 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, Änderungsdaten zu lesen und in 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, benötigt der Inhaber des Dataflow-Jobs, der Änderungsstream-Daten liest, zusätzliche IAM-Berechtigungen (Identity and Access Management), entweder für Ihre Anwendungsdatenbank oder für eine separate Metadatenbank. Weitere Informationen finden Sie unter Metadatenbank erstellen.
Nächste Schritte
DDL-Syntax zum Erstellen und Verwalten von Änderungsstreams
Änderungsstreams und Vorlagen verwenden, um Änderungen von Spanner nach BigQuery oder nach Cloud Storage zu replizieren.
Weitere Informationen zum Erstellen von Dataflow-Pipelines zum Verarbeiten von Änderungsstream-Daten
Weitere Informationen zu Änderungsstreams, einschließlich weiterer Details zur Architektur von Änderungsstreams, zum Abfragen von Änderungsstreams mit der API und zum Interpretieren der zurückgegebenen Datensätze
Erfahren Sie mehr über die Verwendung des Kafka-Connectors zum Verarbeiten von Änderungsstream-Daten.