Ein Änderungsstream beobachtet und streamt Datenänderungen – Einfügungen, Aktualisierungen und Löschungen – einer Spanner-Datenbank nahezu in Echtzeit.
Auf dieser Seite finden Sie einen allgemeinen Überblick über Spanner-Änderungsstreams: was sie tun und wie sie funktionieren. Unter Nächste Schritte finden Sie Links, über die Sie erfahren, wie Sie Änderungsstreams in Ihrer Datenbank erstellen und verwalten und mit anderen Diensten verbinden.
Zweck von Änderungsstreams
Änderungsstreams bieten eine flexible, 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 Nachrichtenwarteschlange wie Pub/Sub gesendet werden.
Speichern von Datenänderungen in Cloud Storage zu Compliance- oder Archivierungszwecken.
Streamkonfiguration ändern
In Spanner werden Änderungsstreams wie Schemaobjekte behandelt, ähnlich wie Tabellen und Indexe. Daher erstellen, ändern und löschen Sie Änderungsstreams mit DDL-Anweisungen und können die Änderungsstreams einer Datenbank wie andere DDL-verwaltete Schemaobjekte aufrufen.
Sie können einen Änderungsstream so konfigurieren, dass er Datenänderungen in einer gesamten Datenbank überwacht, oder seinen Umfang auf bestimmte Tabellen und Spalten beschränken. Eine Datenbank kann mehrere Änderungsstreams haben und für eine bestimmte Tabelle oder Spalte können mehrere Streams eingerichtet sein, die sie beobachten – innerhalb der Grenzwerte.
Optional können Sie einen Änderungsstream mit den folgenden Optionen konfigurieren:
- Geben Sie den Datenaufbewahrungszeitraum an, um den standardmäßigen Aufbewahrungszeitraum von einem Tag zu überschreiben.
- Geben Sie den Werterfassungstyp an, um den Standardwert
OLD_AND_NEW_VALUES
zu überschreiben. - TTL-basierte Löschvorgänge aus Ihren Änderungsstreams herausfiltern: Wenden Sie einen Filter für TTL-basierte Löschvorgänge an.
- Filter für Tabellenänderungen anwenden, um alle
INSERT
-,UPDATE
- oderDELETE
-Tabellenänderungen auszuschließen. - Ausschluss von Datensätzen auf Transaktionsebene aktivieren: Damit können Sie bestimmte Transaktionen aus Ihren Änderungsstreams ausschließen.
Wenn Sie die DDL ausgeben, mit der ein Änderungsstream erstellt wird, wird ein Vorgang mit langer Ausführungszeit gestartet. Nach Abschluss beginnt der neue Änderungsstream sofort mit der Überwachung der ihm zugewiesenen Tabellen und Spalten.
Tabellen und Spalten implizit beobachten
Bei Änderungsstreams, die eine gesamte Tabelle überwachen, werden implizit alle Spalten in dieser Tabelle überwacht, auch wenn die Tabellendefinition aktualisiert wird. Wenn Sie beispielsweise neue Spalten in diese Tabelle einfügen, werden diese automatisch vom Änderungsstream überwacht, ohne dass die Konfiguration des Änderungsstreams geändert werden muss. Ebenso wird der Änderungsstream automatisch beendet, wenn Spalten aus der Tabelle entfernt werden.
Ganzdatenbank-Änderungsstreams 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 werden, und beenden die Beobachtung aller gelöschten Tabellen oder Spalten.
Tabellen und Spalten explizit beobachten
Wenn Sie einen Änderungsstream so konfigurieren, dass nur bestimmte Spalten in einer Tabelle überwacht werden, und Sie später Spalten in diese Tabelle einfügen, werden diese Spalten erst dann vom Änderungsstream überwacht, wenn Sie den Änderungsstream entsprechend neu konfigurieren.
Im Schema der Datenbank werden Änderungsstreams als abhängige Objekte aller Spalten oder Tabellen behandelt, die explizit überwacht werden. Bevor Sie eine solche Spalte oder Tabelle löschen 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
Die Datenänderungen, die von einem Änderungsstream überwacht werden, umfassen alle Einfügungen, Aktualisierungen und Löschungen, die an den Tabellen und Spalten vorgenommen werden, die er überwacht. Diese Änderungen können folgende Ursachen haben:
Kaskadierende Löschvorgänge für verschachtelte untergeordnete Tabellen
Löschungen aufgrund von TTL-Regeln
Mit Änderungsstreams können Datenänderungen nur in von Nutzern erstellten Spalten und Tabellen beobachtet werden. Sie beobachten keine Indexe, Ansichten, anderen Änderungsstreams oder Systemtabellen wie das Informationsschema oder Statistiktabelle. Bei Änderungsstreams werden generierte Spalten nur berücksichtigt, wenn die Spalte Teil des Primärschlüssels ist. Primärschlüsselspalten werden immer erfasst.
Außerdem werden bei Änderungsstreams keine Schemaänderungen oder Datenänderungen, die direkt aus Schemaänderungen resultieren, beobachtet. Ausgenommen sind Backfills für Standardwerte. Wenn ein Änderungsstream beispielsweise eine gesamte Datenbank überwacht, wird das Löschen einer Tabelle nicht als Datenänderung betrachtet und aufgezeichnet, obwohl durch diese Aktion alle Daten dieser Tabelle aus der Datenbank gelöscht werden.
So werden Änderungsstreams in Spanner geschrieben und gespeichert
Jedes Mal, wenn Spanner eine Datenänderung in einer Spalte erkennt, die von einem Änderungsstream überwacht wird, wird ein Datensatz zu Datenänderungen in seinem internen Speicher geschrieben. Der Datenänderungsschreibvorgang und der Datenänderungsdatensatz werden in derselben Transaktion geschrieben. In Spanner werden beide Schreibvorgänge am selben Ort ausgeführt, sodass sie vom selben Server verarbeitet werden und die Verarbeitung von Schreibvorgängen minimiert wird. Die Transaktion wird dann auf die Replikate der Datenbank repliziert, wodurch Speicherkosten und Replikationskosten anfallen. Weitere Informationen finden Sie unter Spanner-Preise.
Inhalt eines Datenänderungsdatensatzes
Jeder Datensatz zu 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 Inhalte, die damit erfasst werden, hängt vom Typ der Wertfassung ab, der vom Nutzer konfiguriert wurde. Dabei kann es sich entweder nur um die geänderten Spalten oder um die gesamte erfasste Zeile handeln.
Die neuen Werte der Spalten der Zeile. Die Verfügbarkeit der neuen Werte und der Inhalte, die damit erfasst werden, hängt vom vom Nutzer konfigurierten Typ der Wertfassung ab.
Der Änderungstyp (Einfügen, Aktualisieren oder Löschen)
Der Commit-Zeitstempel
Transaktions-ID
Die Sequenznummer des Datensatzes
Der Werterfassungstyp des Datensatzes für Datenänderungen.
Weitere Informationen zur Struktur von Datensatzänderungen finden Sie unter Datensatzänderungen.
Datenaufbewahrung
In einem Änderungsstream werden die Datensatzänderungen für einen Zeitraum zwischen einem und dreißig Tagen aufbewahrt. Mit DDL können Sie beim Erstellen eines Änderungsstreams ein anderes als das standardmäßige Aufbewahrungslimit von einem Tag festlegen oder es später anpassen. Wenn Sie das Datenaufbewahrungslimit eines Änderungsstreams verringern, sind alle Verlaufsänderungsdaten, die älter als das neue Limit sind, sofort und dauerhaft für die Leser dieses Änderungsstreams nicht mehr verfügbar.
Dieser Aufbewahrungszeitraum für Daten ist ein Kompromiss. Ein längerer Aufbewahrungszeitraum erfordert mehr Speicherplatz in der Datenbank des Streams.
Werterfassungstyp
Mit der Konfigurationsoption value capture type (Typ der Werterfassung) eines Änderungsstreams wird festgelegt, wie die Werte einer geänderten Zeile gespeichert werden. Mit DDL können Sie einen der folgenden Typen für die Erfassung von Werten 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.
Löschungen aufgrund der Gültigkeitsdauer ausschließen
Mit der Gültigkeitsdauer (time-to-live, TTL) in Spanner können Sie Richtlinien festlegen, mit denen Daten regelmäßig aus Spanner-Tabellen gelöscht werden.
Standardmäßig enthalten Änderungsstreams alle TTL-basierten Löschvorgänge. Mit exclude_ttl_deletes
können Sie festlegen, dass TTL-basierte Löschvorgänge aus Ihrem Änderungsstream ausgeschlossen werden.
Wenn Sie diesen Filter so einstellen, dass TTL-basierte Löschvorgänge ausgeschlossen werden, werden nur zukünftige TTL-basierte Löschvorgänge aus Ihrem Änderungsstream ausgeschlossen.
Der Standardwert für diesen Filter ist false
. Wenn Sie TTL-basierte Löschvorgänge ausschließen möchten, legen Sie den Filter auf true
fest. Sie können den Filter entweder beim Erstellen eines Änderungsstreams hinzufügen oder einen vorhandenen Änderungsstream so ändern, dass er den Filter enthält.
Tabellenänderungstyp
Standardmäßig enthalten Änderungsstreams alle Tabellenänderungen, z. B. Einfügungen, Aktualisierungen und Löschungen. Sie können eine oder mehrere dieser Tabellenänderungen mit den folgenden verfügbaren Filteroptionen 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, legen Sie den Filter auf true
fest. Sie können einen oder mehrere Filter gleichzeitig festlegen.
Sie können einen Filter für einen Tabellenänderungstyp hinzufügen, wenn Sie einen Änderungsstream erstellen, oder den Filter für einen Tabellenänderungstyp ändern, wenn Sie einen vorhandenen Änderungsstream verwenden.
Ausschluss von Datensätzen auf Transaktionsebene
Standardmäßig werden mit einem Änderungsstream alle Schreibtransaktionen in der Datenbank überwacht, da die DDL-Option allow_txn_exclusion
auf false
festgelegt ist. Sie können die Option allow_txn_exclusion
auf true
setzen, damit in Ihrem Änderungsstream Datensätze aus bestimmten Schreibtransaktionen ignoriert werden. Wenn Sie diese Option nicht auf true
festlegen, werden alle Schreibtransaktionen überwacht, auch wenn Sie den Parameter exclude_txn_from_change_streams
in Ihrer Schreibtransaktion verwenden.
Sie können diese Option entweder beim Erstellen eines Änderungsstreams aktivieren 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 Methoden TransactionOptions
und BatchWriteRequest
. Der Standardwert für diesen Parameter ist false
. Sie können diesen Parameter mit der RPC API, der REST API oder über die Clientbibliotheken festlegen. Weitere Informationen finden Sie unter Schreibtransaktion angeben, die aus Änderungsstreams ausgeschlossen werden soll.
Sie können diesen Parameter für schreibgeschützte Transaktionen nicht auf true
festlegen. In diesem Fall gibt die API einen Fehler wegen eines ungültigen Arguments zurück.
Wenn exclude_txn_from_change_streams
für Änderungsstreams, die von Transaktionen geänderte Spalten überwachen, auf true
festgelegt ist, sind zwei Szenarien möglich:
- Wenn die DDL-Option
allow_txn_exclusion
auftrue
gesetzt ist, werden die in dieser Transaktion vorgenommenen Aktualisierungen nicht im Änderungsstream aufgezeichnet. - Wenn Sie die DDL-Option
allow_txn_exclusion
nicht festlegen oder sie auffalse
gesetzt ist, werden die in dieser Transaktion vorgenommenen Aktualisierungen im Änderungsstream aufgezeichnet.
Wenn Sie die Option exclude_txn_from_change_streams
nicht festlegen oder sie auf false
gesetzt ist, werden in allen Änderungsstreams, die Spalten überwachen, die durch Transaktionen geändert wurden, die in dieser Transaktion vorgenommenen Aktualisierungen erfasst.
Änderungsstreams lesen
Spanner bietet mehrere Möglichkeiten zum Lesen der Daten eines Änderungsstreams:
Über Dataflow mit dem Apache Beam SpannerIO-Connector. Dies ist unsere empfohlene Lösung für die meisten Change Stream-Anwendungen. Google bietet auch Dataflow-Vorlagen für gängige Anwendungsfälle.
Direkt über die Spanner API. Dabei werden die Abstraktion und die Funktionen von Dataflow-Pipelines für maximale Geschwindigkeit und Flexibilität geopfert.
Mit dem Debezium-basierten Kafka-Connector für Spanner-Änderungsstreams. Mit diesem Connector werden Änderungsdatensätze direkt in Kafka-Themen gestreamt.
Sie können eine teilweise Isolation für Lesevorgänge von Änderungsstreams mithilfe von gerichteten Lesevorgängen bereitstellen. Mit gezielten Lesezugriffen können Sie die Auswirkungen auf transaktionale Arbeitslasten in Ihrer Datenbank minimieren. Mit der Spanner API können Sie Lesevorgänge für Ä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 Direktes Lesen.
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, werden automatisch neue Datensatzänderungen in ein einzelnes, unbegrenztes PCollection
-Dataset ausgegeben, das für die weitere Verarbeitung durch nachfolgende Transformationen in der Dataflow-Pipeline bereit ist.
Dataflow verwendet Windowing-Funktionen, um unbegrenzte Sammlungen in logische Komponenten oder Fenster zu unterteilen. Daher bietet Dataflow nahezu in Echtzeit Streaming beim Lesen aus Änderungsstreams.
Google stellt Vorlagen zur Verfügung, mit denen Sie schnell Dataflow-Pipelines für gängige Anwendungsfälle für Änderungsstreams erstellen können, z. B. zum Senden aller Datenänderungen eines Streams an ein BigQuery-Dataset oder zum Kopieren der Änderungen in einen Cloud Storage-Bucket.
Eine detailliertere Übersicht über die Zusammenarbeit von Änderungsstreams und Dataflow finden Sie unter Verbindungen von Änderungsstreams mit Dataflow erstellen.
API verwenden
Als Alternative zur Verwendung von Dataflow zum Erstellen von Änderungsstream-Pipelines können Sie stattdessen Code schreiben, der die Spanner API verwendet, um die Datensätze eines Änderungsstreams direkt zu lesen. So können Sie Datensatzänderungen auf dieselbe Weise lesen wie mit dem SpannerIO-Connector. Dies ermöglicht die niedrigstmöglichen Latenzen beim Lesen von Änderungsstreamdaten, anstatt die Flexibilität von Dataflow zu nutzen.
Weitere Informationen finden Sie unter Änderungsstreams abfragen. Eine ausführlichere Beschreibung dazu, wie Sie Änderungsstreams abfragen und die zurückgegebenen Datensätze interpretieren, 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. Sie abstrahiert die Details zum Abfragen von Änderungsstreams mit der Spanner API.
Weitere Informationen zur Funktionsweise von Änderungsstreams und dem Kafka-Connector finden Sie unter Verbindungen von Änderungsstreams mit dem Kafka-Connector erstellen.
Limits
Für Änderungsstreams gelten mehrere Einschränkungen, 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 Grenzwerte für Änderungsstreams.
Berechtigungen
Bei Änderungsstreams wird Folgendes verwendet:
Zum Erstellen, Aktualisieren oder Löschen von Änderungsstreams ist
spanner.databases.updateDdl
erforderlich.Zum Lesen der Daten eines Änderungsstreams ist
spanner.databases.select
erforderlich.
Wenn Sie den SpannerIO-Connector verwenden, benötigt der Inhaber des Dataflow-Jobs, der Änderungsstreamdaten liest, zusätzliche IAM-Berechtigungen, entweder für Ihre Anwendungsdatenbank oder für eine separate Metadatenbank. Weitere Informationen finden Sie unter Metadatenbank erstellen.
Nächste Schritte
Mit Änderungsstreams und Vorlagen können Sie Änderungen von Spanner in BigQuery oder in Cloud Storage replizieren.
Weitere Informationen zum Erstellen von Dataflow-Pipelines zum Verarbeiten von Änderungsstreamdaten
Weitere Informationen zu Änderungsstreams, einschließlich Details zur Änderungsstream-Architektur, zum Abfragen von Änderungsstreams über die API und zum Interpretieren der zurückgegebenen Datensätze.
Weitere Informationen zum Verarbeiten von Änderungsstreamdaten mit dem Kafka-Connector