Änderungsstreams – Übersicht

Ein Änderungsstream überwacht und streamt die Datenänderungen einer Spanner-Datenbank – Einfügungen, Aktualisierungen und Löschungen – nahezu in Echtzeit.

Auf dieser Seite erhalten Sie einen allgemeinen Überblick über Spanner-Änderungsstreams: ihre Funktion und ihre Funktionsweise. Wie Sie Änderungsstreams in Ihrer Datenbank erstellen und verwalten und mit anderen Diensten verknüpfen, erfahren Sie unter Nächste Schritte.

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 einem Data Warehouse wie BigQuery replizieren

  • Auslösen der Anwendungslogik basierend auf Datenänderungen, die an eine Nachrichtenwarteschlange gesendet werden, z. B. Pub/Sub.

  • Speichern von Datenänderungen in Cloud Storage aus Compliance- oder Archivierungsgründen

Streamkonfiguration ändern

In Spanner werden Änderungsstreams als Schemaobjekte behandelt, ähnlich wie Tabellen und Indexe. Daher werden Änderungsstreams mit DDL-Anweisungen erstellt, geändert und gelöscht. Sie können die Änderungsstreams einer Datenbank genauso aufrufen wie andere DDL-verwaltete Schemaobjekte.

Sie können einen Änderungsstream so konfigurieren, dass Datenänderungen in einer gesamten Datenbank überwacht werden, oder seinen Umfang auf bestimmte Tabellen und Spalten beschränken. Eine Datenbank kann mehrere Änderungsstreams haben und eine bestimmte Tabelle oder Spalte kann innerhalb der Limits von mehreren Streams beobachtet werden.

Sie können einen Änderungsstream auch so konfigurieren, dass ein Datenerhaltszeitraum, ein Typ der Datenerfassung, TTL-basierte Löschungen gefiltert oder Tabellenänderungsfilter festgelegt wird.

Durch das Ausführen der DDL, mit der ein Änderungsstream erstellt wird, wird ein Vorgang mit langer Ausführungszeit gestartet. Nach Abschluss beginnt der neue Änderungsstream sofort, die zugewiesenen Tabellen und Spalten zu beobachten.

Implizit Tabellen und Spalten beobachten

Änderungsstreams, die eine ganze Tabelle beobachten, beobachten implizit alle Spalten in dieser Tabelle, auch wenn die Tabellendefinition aktualisiert wird. Wenn Sie dieser Tabelle beispielsweise neue Spalten hinzufügen, werden diese neuen Spalten automatisch vom Änderungsstream beobachtet, ohne dass die Konfiguration des Änderungsstreams geändert werden muss. Ebenso werden alle Spalten, die aus dieser Tabelle gelöscht werden, automatisch aus dem Änderungsstream entfernt.

Änderungsstreams für die gesamte Datenbank funktionieren auf die gleiche Weise. Sie beobachten implizit jede Spalte in jeder Tabelle und überwachen automatisch alle Tabellen oder Spalten, die nach dem Erstellen des Änderungsstreams hinzugefügt wurden. Tabellen oder Spalten, die gelöscht wurden, werden nicht mehr beobachtet.

Tabellen und Spalten explizit beobachten

Wenn Sie einen Änderungsstream so konfigurieren, dass nur bestimmte Spalten in einer Tabelle beobachtet werden, und dieser Tabelle später Spalten hinzufügen, werden diese Spalten erst dann vom Änderungsstream beobachtet, wenn Sie den Änderungsstream 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 löschen können, müssen Sie sie manuell aus der Konfiguration aller Änderungsstreams entfernen, die sie explizit beobachten.

Arten von Datenänderungen, die in Änderungsstreams überwacht werden

Zu den Datenänderungen, die von einem Änderungsstream überwacht werden, gehören alle Einfügungen, Aktualisierungen und Löschungen, die an den überwachten Tabellen und Spalten vorgenommen werden. Diese Änderungen können folgende Ursachen haben:

Änderungsstreams können nur Datenänderungen in von Nutzern erstellten Spalten und Tabellen beobachten. Sie überwachen keine Indexes, Ansichten, anderen Änderungsstreams oder Systemtabellen wie das Informationsschema oder Statistiktabellen. Für Änderungsstreams werden generierte Spalten nur beobachtet, wenn die Spalte Teil des Primärschlüssels ist. Primärschlüsselspalten werden immer erfasst.

Außerdem werden in Änderungsstreams keine Schemaänderungen oder Datenänderungen beobachtet, die direkt aus Schemaänderungen resultieren, mit Ausnahme von Backfills für Standardwerte. Ein Änderungsstream, der eine gesamte Datenbank überwacht, betrachtet und zeichnet das Löschen einer Tabelle beispielsweise nicht als Datenänderung auf, auch wenn 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 es einen Datenänderungsdatensatz in den internen Speicher. Das Schreiben der Datenänderung und der Datenänderungsdatensatz werden in derselben Transaktion geschrieben. Spanner platziert beide Schreibvorgänge an derselben Stelle, damit sie vom selben Server verarbeitet werden. Dadurch wird die Schreibverarbeitung minimiert. Die Transaktion wird dann über die Replikaten der Datenbank repliziert, wodurch Speicher- und Replikationskosten anfallen. Weitere Informationen finden Sie unter Spanner-Preise.

Inhalt eines Datenänderungsdatensatzes

Jeder Datenänderungseintrag, 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 gemäß der Definition des Änderungsstreams erfasst wurden.

  • Die alten Werte der Spalten der Zeile. Die Verfügbarkeit der alten Werte und der erfassten Inhalte, also entweder nur der geänderten Spalten oder der gesamten erfassten Zeile, hängt vom vom Nutzer konfigurierten Typ der Datenerfassung ab.

  • Die neuen Werte der Spalten der Zeile. Die Verfügbarkeit der neuen Werte und der Inhalte, die sie erfassen, hängt vom vom Nutzer konfigurierten Typ der Datenerhebung ab.

  • Der Änderungstyp (Einfügen, Aktualisieren oder Löschen)

  • Commit-Zeitstempel

  • Transaktions-ID

  • Die Sequenznummer des Datensatzes

  • Der Werterfassungstyp des Datenänderungssatzes.

Weitere Informationen zur Struktur von Datenänderungseinträgen finden Sie unter Datenänderungseinträge.

Datenaufbewahrung

In einem Änderungsstream werden Datenänderungssätze für einen Zeitraum zwischen einem und sieben Tagen aufbewahrt. Mit DDL können Sie beim Erstellen eines Änderungsstreams ein anderes Datenaufbewahrungslimit als den Standard von einem Tag angeben oder es jederzeit anpassen. Wenn Sie das Datenaufbewahrungslimit eines Änderungsstreams reduzieren, werden alle Verlaufsänderungsdaten, die älter als das neue Limit sind, sofort und dauerhaft für die Leser dieses Änderungsstreams nicht mehr verfügbar gemacht.

Dieser Datenaufbewahrungszeitraum ist ein Kompromiss: Ein längerer Aufbewahrungszeitraum bedeutet höhere Speicheranforderungen an die Datenbank des Streams.

Werterfassungstyp

Mit der Konfigurationsoption Werterfassungstyp 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: Es werden nur die neuen Werte der nicht-Schlüsselspalten erfasst, aber keine alten Werte.

  • NEW_ROW: Hier werden alle neuen Werte der beobachteten Spalten erfasst, sowohl geänderte als auch unveränderte, wenn sich eine dieser Spalten ändert. Es werden keine alten Werte erfasst.

  • NEW_ROW_AND_OLD_VALUES: Hier werden alle neuen Werte sowohl für geänderte als auch für unveränderte Spalten sowie alte Werte für geänderte Spalten erfasst.

Löschvorgänge aufgrund der Gültigkeitsdauer ausschließen

In Spanner können Sie mithilfe 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öschvorgänge. Mit exclude_ttl_deletes können Sie Ihren Änderungsstream so konfigurieren, dass TTL-basierte Löschvorgänge 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öschungen 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.

Art der Tabellenänderung

Standardmäßig enthalten Änderungsstreams alle Tabellenänderungen wie Einfügungen, Aktualisierungen und Löschungen. Mit den folgenden Filteroptionen können Sie eine oder mehrere dieser Tabellenänderungen aus dem Umfang Ihres Änderungsstreams herausfiltern:

  • exclude_insert: alle INSERT-Tabellenänderungen ausschließen
  • exclude_update: alle UPDATE-Tabellenänderungen ausschließen
  • exclude_delete: alle DELETE-Tabellenänderungen ausschließen

Der Standardwert für diese Filter ist false. Wenn Sie einen bestimmten Tabellenänderungstyp ausschließen möchten, legen Sie den Filter auf true fest. Sie können einen oder mehrere Filter gleichzeitig festlegen.

Sie können beim Erstellen eines Änderungsstreams einen Filter für einen Tabellenänderungstyp hinzufügen oder den Filter für einen Tabellenänderungstyp für einen vorhandenen Änderungsstream ändern.

Änderungsstreams lesen

Spanner bietet mehrere Möglichkeiten, die Daten eines Änderungsstreams zu lesen:

  • Über Dataflow mit dem Apache Beam SpannerIO-Connector Dies ist die von uns empfohlene Lösung für die meisten Change-Stream-Anwendungen. Google stellt auch Dataflow-Vorlagen für gängige Anwendungsfälle bereit.

  • Direkt über die Spanner API Dadurch werden die Abstraktion und die Funktionen von Dataflow-Pipelines gegen maximale Geschwindigkeit und Flexibilität eingetauscht.

  • Mit dem Debezium-basierten Kafka-Connector für Spanner-Änderungsstreams. Dieser Connector streamt Änderungsdatensätze direkt in Kafka-Themen.

Mithilfe von gezielten Lesezugriffen können Sie eine teilweise Isolation für Lesezugriffe auf Änderungsstreams 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 von Änderungsstreams an einen bestimmten Replikatyp oder eine bestimmte Region innerhalb einer multiregionalen Instanzkonfiguration oder einer benutzerdefinierten regionalen Konfiguration mit optionalen schreibgeschützten Regionen weiterleiten. Weitere Informationen finden Sie unter Direkte Lesevorgänge.

Dataflow verwenden

Verwenden Sie den Apache Beam SpannerIO-Connector, um Dataflow-Pipelines zu erstellen, die Daten aus Änderungsstreams lesen. Nachdem Sie den Connector mit Details zu einem bestimmten Änderungsstream konfiguriert haben, werden neue Datenänderungseinträge automatisch in einem einzelnen, unbegrenzten PCollection-Dataset ausgegeben, das für die weitere Verarbeitung durch nachfolgende Transformationen in der Dataflow-Pipeline bereit ist.

In Dataflow werden Windowing-Funktionen verwendet, um unbegrenzte Sammlungen in logische Komponenten oder Fenster zu unterteilen. Daher bietet Dataflow ein nahezu Echtzeit-Streaming, wenn aus Änderungsstreams gelesen wird.

Google stellt Vorlagen bereit, mit denen Sie schnell Dataflow-Pipelines für gängige Anwendungsfälle von Änderungsstreams erstellen können. Dazu gehört beispielsweise das Senden aller Datenänderungen eines Streams an ein BigQuery-Dataset oder das Kopieren in einen Cloud Storage-Bucket.

Eine detailliertere Übersicht dazu, wie Änderungsstreams und Dataflow zusammenarbeiten, finden Sie unter Verbindungen von Änderungsstreams mit Dataflow erstellen.

API verwenden

Anstatt Dataflow zum Erstellen von Änderungsstream-Pipelines zu verwenden, können Sie stattdessen Code schreiben, der die Spanner API verwendet, um die Datensätze eines Änderungsstreams direkt zu lesen. So können Sie Datenänderungssätze auf die gleiche Weise lesen wie mit dem SpannerIO-Connector. Sie verzichten dabei auf die Abstraktion, die der Connector bietet, und erhalten dafür die niedrigsten Latenzen beim Lesen von Änderungsstreamdaten.

Weitere Informationen finden Sie unter Änderungsstreams abfragen. Weitere Informationen 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-Eintragsdaten direkt in ein Kafka-Thema aus. Sie 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.

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

Für Änderungsstreams werden folgende Elemente verwendet:

  • Zum Erstellen, Aktualisieren oder Löschen von Änderungsstreams ist spanner.databases.updateDdl erforderlich.

  • Für das Lesen der Daten eines Änderungsstreams ist spanner.databases.select erforderlich.

Wenn Sie den SpannerIO-Connector verwenden, benötigt der Eigentümer des Dataflow-Jobs, der Änderungsstream-Daten liest, zusätzliche IAM-Berechtigungen, entweder für Ihre Anwendungsdatenbank oder für eine separate Metadatendatenbank. Weitere Informationen finden Sie unter Metadatendatenbank erstellen.

Nächste Schritte