Änderungsstreams – Übersicht

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

Diese Seite bietet einen allgemeinen Überblick über Spanner-Änderungsstreams: ihre Funktionsweise und Funktionsweise. Informationen zum Erstellen und Verwalten von Änderungsstreams in Ihrer Datenbank und zum Verbinden mit anderen Diensten finden Sie unter den Links unter Weitere Informationen.

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:

  • Replizieren von Spanner-Datenänderungen in ein Data Warehouse wie BigQuery zur Analyse

  • Zum Auslösen der Anwendungslogik basierend auf Datenänderungen, die an eine Nachrichtenwarteschlange wie Pub/Sub gesendet wurden.

  • Datenänderungen zu Compliance- oder Archivierungszwecken in Cloud Storage speichern

Streamkonfiguration ändern

Spanner behandelt Änderungsstreams als Schemaobjekte, ähnlich wie Tabellen und Indexe. Daher erstellen, ändern und löschen Sie Änderungsstreams mithilfe von DDL-Anweisungen. Außerdem können Sie die Änderungsstreams einer Datenbank wie andere DDL-verwaltete Schemaobjekte ansehen.

Sie können einen Änderungsstream konfigurieren, um Datenänderungen in einer gesamten Datenbank zu beobachten oder seinen Bereich auf bestimmte Tabellen und Spalten zu beschränken. Eine Datenbank kann mehrere Änderungsstreams haben und eine bestimmte Tabelle oder Spalte kann mehrere Streams haben, die sie innerhalb der Limits beobachten.

Sie können auch einen Änderungsstream konfigurieren, um eine Datenaufbewahrungsdauer, einen Werterfassungstyp, TTL-basierte Löschvorgänge filtern oder einen Filter für Tabellenänderungen anzugeben.

Durch das Ausstellen der DDL, die einen Änderungsstream erstellt, wird ein lang andauernder Vorgang gestartet. Sobald er abgeschlossen ist, beginnt der neue Änderungsstream sofort mit der Überwachung der ihm zugewiesenen Tabellen und Spalten.

Tabellen und Spalten implizit beobachten

Änderungsstreams, die eine ganze Tabelle beobachten, überwachen implizit alle Spalten in dieser Tabelle, auch wenn die Tabellendefinition aktualisiert wird. Wenn Sie beispielsweise dieser Tabelle neue Spalten hinzufügen, beginnt der Änderungsstream automatisch mit der Überwachung dieser neuen Spalten, ohne dass Änderungen an der Konfiguration dieses Änderungsstreams erforderlich sind. Ebenso beendet der Änderungsstream automatisch die Überwachung aller Spalten, die aus dieser Tabelle gelöscht wurden.

Änderungsstreams der gesamten Datenbank funktionieren auf die gleiche Weise. Sie beobachten implizit jede Spalte in jeder Tabelle und beobachten automatisch alle Tabellen oder Spalten, die nach dem Erstellen des Änderungsstreams hinzugefügt wurden. Alle gelöschten Tabellen oder Spalten werden nicht mehr überwacht.

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 zu dieser Tabelle hinzufügen, beginnt der Änderungsstream nur dann, diese Spalten zu beobachten, wenn Sie den Änderungsstream entsprechend neu konfigurieren.

Das Schema der Datenbank behandelt Änderungsstreams als abhängige Objekte aller Spalten oder Tabellen, die sie explizit beobachten. Bevor Sie eine solche Spalte oder Tabelle löschen können, müssen Sie sie manuell aus der Konfiguration eines Änderungsstreams entfernen, der sie explizit überwacht.

Arten von Datenänderungen, die sich auf die Wiedergabe von Streams auswirken

Die von einem Änderungsstream beobachteten Datenänderungen umfassen alle Einfügungen, Aktualisierungen und Löschungen, die an den beobachteten Tabellen und Spalten vorgenommen wurden. Diese Änderungen können folgende Ursachen haben:

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

Darüber hinaus beobachten Änderungsstreams keine Schemaänderungen oder Datenänderungen, die direkt aus Schemaänderungen resultieren. Beispielsweise würde ein Änderungsstream, der eine ganze Datenbank überwacht, das Löschen einer Tabelle nicht als Datenänderung behandeln, obwohl durch diese Aktion alle Daten dieser Tabelle aus der Datenbank entfernt 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änderungseintrag in den internen Speicher. Dies geschieht synchron mit dieser Datenänderung innerhalb derselben Transaktion. Spanner bringt beide Schreibvorgänge zusammen, sodass sie vom selben Server verarbeitet werden, was die Schreibverarbeitung minimiert.

Inhalt eines Datenänderungseintrags

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 basierend auf der Definition des Änderungsstreams erfasst wurden.

  • Die alten Werte der Spalten der Zeile. Die Verfügbarkeit der alten Werte und der von ihnen verfolgten Inhalte – entweder nur die geänderten Spalten oder die gesamte erfasste Zeile – hängt vom vom Nutzer konfigurierten Werterfassungstyp ab.

  • Die neuen Werte der Spalten der Zeile. Die Verfügbarkeit der neuen Werte und die von ihnen erfassten Inhalte hängen vom vom Nutzer konfigurierten Werterfassungstyp ab.

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

  • Der Commit-Zeitstempel

  • Die Transaktions-ID

  • Sequenznummer des Eintrags

  • Der Werterfassungstyp des Datenänderungseintrags.

Weitere Informationen zur Struktur von Datensätzen für Datenänderungen finden Sie unter Datensätze zu Datenänderungen.

Datenaufbewahrung

Ein Änderungsstream bewahrt seine Datensätze für Datenänderungen für einen Zeitraum zwischen einem und sieben Tagen auf. Mit DDL können Sie beim erstmaligen Erstellen eines Änderungsstreams ein anderes Limit für die Datenaufbewahrung als die Standardeinstellung von einem Tag festlegen oder es jederzeit anpassen. Wenn Sie das Aufbewahrungslimit eines Änderungsstreams reduzieren, sind alle bisherigen Änderungsdaten sofort älter als das neue Limit und sind für die Leser dieses Änderungsstreams dauerhaft nicht mehr verfügbar.

Diese Aufbewahrungsdauer für Daten ist mit Kompromissen verbunden. Eine längere Aufbewahrungsdauer führt zu größeren Speicheranforderungen für die Datenbank des Streams.

Werterfassungstyp

Die Konfigurationsoption Werterfassungstyp eines Änderungsstreams steuert, wie die Werte einer geänderten Zeile gespeichert werden. Mit DDL können Sie einen der folgenden Werterfassungstypen 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 von beobachteten Spalten, sowohl geänderte als auch unverändert, immer dann, 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öschvorgänge für die Zeit bis zur Gültigkeitsdauer ausschließen

In Spanner können Sie mit der Gültigkeitsdauer (TTL) Richtlinien festlegen, um Daten regelmäßig aus Spanner-Tabellen zu löschen. Standardmäßig umfassen Änderungsstreams alle TTL-basierten Löschvorgänge. Sie können exclude_ttl_deletes verwenden, um Ihren Änderungsstream so festzulegen, dass TTL-basierte Löschvorgänge ausgeschlossen werden. Wenn Sie diesen Filter so festlegen, dass TTL-basierte Löschvorgänge ausgeschlossen werden, werden nur zukünftige TTL-basierte Löschvorgänge aus dem Ä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 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 Filteroptionen können Sie eine oder mehrere dieser Tabellenänderungen aus dem Bereich des Änderungsstreams filtern:

  • 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 eine bestimmte Art 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 Tabellenänderungstyp hinzufügen, wenn Sie einen Änderungsstream erstellen, 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 unsere empfohlene Lösung für die meisten Change-Stream-Anwendungen. Google bietet auch Dataflow-Vorlagen für gängige Anwendungsfälle.

  • Direkt mithilfe der Spanner API. Dadurch werden die Abstraktion und die Funktionen von Dataflow-Pipelines verloren, was für maximale Geschwindigkeit und Flexibilität sorgt.

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

Mit gerichteten Lesevorgängen können Sie für Änderungsstreams Lesevorgänge teilweise isolieren. Mit gerichteten Lesevorgängen können Sie die Auswirkungen auf Transaktionsarbeitslasten in Ihrer Datenbank minimieren. Mit der Spanner API können Sie Änderungsstreams-Lesevorgänge an einen bestimmten Replikattyp oder eine bestimmte Region innerhalb einer multiregionalen Instanzkonfiguration oder einer benutzerdefinierten regionalen Konfiguration mit optionalen schreibgeschützten Regionen weiterleiten. Weitere Informationen finden Sie unter gerichtete Lesevorgänge.

Dataflow verwenden

Verwenden Sie den Apache Beam SpannerIO-Connector, um Dataflow-Pipelines zu erstellen, die Änderungsstreams lesen. Nachdem Sie den Connector mit Details zu einem bestimmten Änderungsstream konfiguriert haben, gibt er neue Datensätze für Datenänderungen automatisch in ein einzelnes, unbegrenztes PCollection-Dataset aus, das von nachfolgenden Transformationen in der Dataflow-Pipeline weiter verarbeitet werden kann.

Dataflow verwendet Windowing-Funktionen, um unbegrenzte Sammlungen in logische Komponenten oder Fenster zu unterteilen. Daher bietet Dataflow Streaming bei Lesen aus Änderungsstreams nahezu in Echtzeit.

Google bietet Vorlagen, mit denen Sie Dataflow-Pipelines für gängige Anwendungsfälle von Änderungsstreams schnell erstellen können, einschließlich des Sendens aller Datenänderungen eines Streams an ein BigQuery-Dataset oder des Kopierens in einen Cloud Storage-Bucket.

Eine ausführlichere Übersicht über das Zusammenspiel von Änderungsstreams und Dataflow finden Sie unter Verbindungen zu Ä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. Auf diese Weise können Sie Datenänderungseinträge auf die gleiche Weise lesen wie der Spanner-Connector. Dabei wird die Abstraktion, die er bietet, im Austausch gegen geringstmögliche Latenzen beim Lesen von Änderungsstreamdaten vermieden.

Weitere Informationen finden Sie unter Änderungsstreams für Abfragen. Weitere Informationen zum Abfragen von Änderungsstreams und zum Interpretieren der zurückgegebenen Datensätze finden Sie unter Partitionen, Datensätze und Abfragen von Änderungsstreams.

Kafka-Connector verwenden

Der Kafka-Connector gibt Änderungsstreameinträge direkt an ein Kafka-Thema aus. Sie abstrahiert die Details von Abfragen von Änderungsstreams mit der Spanner API.

Weitere Informationen zum Zusammenspiel von Änderungsstreams und dem Kafka-Connector finden Sie unter Verbindung mit dem Kafka-Connector für Änderungsstreams erstellen.

Limits

Es gibt mehrere Limits für Änderungsstreams, einschließlich der maximalen Anzahl von Änderungsstreams, die eine Datenbank haben kann, und der maximalen Anzahl von Streams, die eine einzelne Spalte beobachten können. Eine vollständige Liste finden Sie unter Streamlimits ändern.

Berechtigungen

Für Ä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 für Ihre Anwendungsdatenbank oder eine separate Metadatendatenbank (siehe Metadatendatenbank erstellen).

Nächste Schritte