Änderungsstreams

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

Diese Seite bietet 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 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:

  • Sie replizieren Spanner-Datenänderungen zu Analysezwecken in ein Data Warehouse wie BigQuery.

  • Auslösen von Anwendungslogik anhand von Datenänderungen, die an eine Nachrichtenwarteschlange wie Pub/Sub gesendet wurden

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

Streamkonfiguration ändern

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

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

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

Durch das Ausstellen der DDL, die einen Änderungsstream erstellt, wird ein lang andauernder Vorgang gestartet. Nach Abschluss des Vorgangs beginnt der neue Änderungsstream sofort damit, die ihm zugewiesenen Tabellen und Spalten zu beobachten.

Tabellen und Spalten implizit beobachten

Änderungsstreams, die eine ganze Tabelle beobachten, beobachten implizit alle Spalten in dieser Tabelle, selbst wenn diese Tabellendefinition aktualisiert wird. Wenn Sie dieser Tabelle beispielsweise neue Spalten hinzufügen, beginnt der Änderungsstream automatisch damit, diese neuen Spalten zu beobachten, ohne dass eine Änderung an der Konfiguration des Änderungsstreams erforderlich ist. Ebenso beendet der Änderungsstream automatisch die Überwachung von Spalten, die aus dieser Tabelle gelöscht wurden.

Ä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 der Erstellung des Änderungsstreams hinzugefügt wurden. Alle gelöschten Tabellen oder Spalten werden nicht mehr beobachtet.

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

Im Schema der Datenbank werden Änderungsstreams als abhängige Objekte von 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 eines Änderungsstreams entfernen, der sie explizit überwacht.

Arten von Datenänderungen, die den Stream beeinflussen – Wiedergabe

Die Datenänderungen, die ein Änderungsstream beobachtet, umfassen alle Einfügungen, Aktualisierungen und Löschungen in den Tabellen und Spalten, die beobachtet werden. Diese Änderungen können folgende Ursachen haben:

Ä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 Statistiktabellen. Änderungsstreams beobachten keine generierten Spalten, es sei denn, die Spalte ist Teil des Primärschlüssels. Primärschlüsselspalten werden immer erfasst.

Außerdem 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, auch wenn 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 Spanner einen Datenänderungseintrag in den internen Speicher. Dies erfolgt synchron mit dieser Datenänderung innerhalb derselben Transaktion. Spanner ordnet diese beiden Schreibvorgänge an einem gemeinsamen Server zu, sodass sie vom selben Server verarbeitet werden und die Schreibverarbeitung minimiert wird.

Inhalt eines Datenänderungseintrags

Jeder von einem Änderungsstream geschriebene Datenänderungseintrag 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 anhand der Änderungsstreamdefinition erfasst wurden.

  • Die alten Werte der Zeilenspalten. Die Verfügbarkeit der alten Werte und des von ihnen verfolgten Inhalts, bei denen es sich entweder nur um die geänderten Spalten oder die gesamte verfolgte Zeile handeln kann, hängt vom vom Nutzer konfigurierten Werterfassungstyp ab.

  • Die neuen Werte der Zeilenspalten. Die Verfügbarkeit der neuen Werte und der damit erfassten Inhalte hängen vom vom Nutzer konfigurierten Werterfassungstyp ab.

  • Art der Änderung (Einfügen, Aktualisieren oder Löschen)

  • Commit-Zeitstempel

  • Transaktions-ID

  • Die Sequenznummer des Eintrags

  • Der Werterfassungstyp des Datenänderungseintrags.

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

Datenaufbewahrung

Ein Änderungsstream speichert seine Datensätze zu Datenänderungen für einen Zeitraum zwischen einem und sieben Tagen. Mit DDL können Sie beim ersten Erstellen eines Änderungsstreams ein anderes Datenaufbewahrungslimit als das Standardlimit von einem Tag angeben oder es jederzeit anpassen. Wenn Sie das Datenaufbewahrungslimit eines Änderungsstreams verringern, werden alle bisherigen Änderungsdaten sofort älter als das neue Limit und sind für die Leser dieses Änderungsstreams dauerhaft nicht verfügbar.

Diese Aufbewahrungsdauer für Daten stellt einen Kompromiss dar. Eine längere Aufbewahrungsdauer führt zu einem höheren Speicherbedarf für die Datenbank des Streams.

Werterfassungstyp

Die Konfigurationsoption für den 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 beobachteter Spalten, sowohl geändert als auch unverändert, 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 basierend auf der Gültigkeitsdauer ausschließen

In Spanner können Sie unter Gültigkeitsdauer (TTL) Richtlinien festlegen, um Daten regelmäßig aus Spanner-Tabellen zu löschen. Standardmäßig enthalten Änderungsstreams alle TTL-basierten Löschvorgänge. Mit exclude_ttl_deletes können Sie Ihren Änderungsstream so einstellen, 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öschungen aus dem Änderungsstream ausgeschlossen.

Der Standardwert für diesen Filter ist false. Wenn Sie TTL-basierte Löschvorgänge ausschließen möchten, setzen Sie den Filter auf true. Sie können entweder den Filter beim Erstellen eines Änderungsstreams hinzufügen oder einen vorhandenen Änderungsstream so ändern, dass er den Filter enthält.

Tabellenänderungstyp

Änderungsstreams enthalten standardmäßig alle Tabellenänderungen, z. B. Einfügungen, Aktualisierungen und Löschungen. Mit den folgenden verfügbaren 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 einen Filter für einen Tabellenänderungstyp für einen vorhandenen Änderungsstream.

Ä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 häufige Anwendungsfälle.

  • Direkt über die Spanner API. Dabei werden die Abstraktion und Funktionen von Dataflow-Pipelines für maximale Geschwindigkeit und Flexibilität vernachlässigt.

  • Durch Verwendung des Debezium-basierten Kafka-Connectors für Spanner-Änderungsstreams. Dieser Connector streamt Änderungseinträge direkt in Kafka-Themen.

Sie können mit gerichteten Lesevorgängen eine teilweise Isolierung für Lesevorgänge von Änderungsstreams bereitstellen. Mit gerichteten Lesevorgängen können Sie die Auswirkungen auf Transaktionsarbeitslasten in Ihrer Datenbank minimieren. Mit der Spanner API können Sie Lesevorgänge für Änderungsstreams 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 Geleitete 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 Datenänderungseinträge in ein einzelnes, unbegrenztes PCollection-Dataset aus, das zur weiteren Verarbeitung durch nachfolgende Transformationen in der Dataflow-Pipeline bereit ist.

Dataflow verwendet Windowing-Funktionen, um unbegrenzte Sammlungen in logische Komponenten oder Fenster aufzuteilen. Dadurch bietet Dataflow Streaming nahezu in Echtzeit mit einer Latenz von ungefähr sechs Sekunden beim Lesen aus Änderungsstreams.

Google bietet Vorlagen, mit denen Sie schnell Dataflow-Pipelines für gängige Anwendungsfälle für Änderungsstreams erstellen können. So können Sie beispielsweise alle Datenänderungen eines Streams an ein BigQuery-Dataset senden oder sie in einen Cloud Storage-Bucket kopieren.

Eine ausführlichere Übersicht über das Zusammenspiel von Änderungsstreams und Dataflow finden Sie unter Verbindungsstreams 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 Einträge eines Änderungsstreams direkt zu lesen. So können Sie Datensätze zu Datenänderungen auf dieselbe Weise lesen wie der SpannerIO-Connector. Dabei wird die bereitgestellte Abstraktion im Gegenzug für möglichst geringe Latenzen beim Lesen von Änderungsstreamdaten eingespart.

Weitere Informationen finden Sie unter Änderungsstreams für Abfragen. Weitere Informationen zum Abfragen von Änderungsstreams und Interpretieren der zurückgegebenen Einträge finden Sie unter Stream-Partitionen, Einträge und Abfragen ändern.

Kafka-Connector verwenden

Der Kafka-Connector gibt Änderungsstreameinträge direkt in ein Kafka-Thema aus. Die Details zum Abfragen von Änderungsstreams mithilfe der Spanner API werden abstrahiert.

Weitere Informationen zum Zusammenspiel von Änderungsstreams und dem Kafka-Connector finden Sie unter Änderungsstreamsverbindungen mit dem Kafka-Connector erstellen.

Limits

Es gibt mehrere Limits für Änderungsstreams, z. B. die maximale Anzahl von Änderungsstreams einer Datenbank und die maximale 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:

  • Für das 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 Metadatendatenbank. Weitere Informationen finden Sie unter Metadatendatenbank erstellen.

Nächste Schritte