Zeitstempelgrenzen

Einleitung

Wenn Sie Daten in Spanner entweder in einer schreibgeschützten Transaktion oder in einem einzelnen Leseaufruf lesen, können Sie eine Zeitstempelgrenze festlegen. Diese teilt Spanner mit, wie ein Zeitstempel zum Lesen der Daten ausgewählt werden soll.

Warum sollten Sie eine Zeitstempelgrenze festlegen? Wenn Ihre Datenbank geografisch verteilt ist (d. h. Sie Ihre Spanner-Instanz mit einer Konfiguration für multiregionale Instanzen erstellt haben) und Ihre Anwendung beim Lesen von Daten eine gewisse Veralterung toleriert, können Sie Latenzvorteile durch die Ausführung eines veralteten Lesevorgangs anstelle eines starken Lesevorgangs erhalten. (Weitere Informationen zu diesen Lesetypen finden Sie unter Lesevorgänge.)

Arten von Zeitstempelgrenzen

Es gibt folgende Arten von Zeitstempelgrenzen:

  • Stark (Standard): liest die aktuellen Daten
  • Begrenzte Veralterung: liest eine Version der Daten, die nur bis zu einer bestimmten Grenze veraltet sind
  • Exakte Veralterung: liest die Version der Daten mit einem bestimmten Zeitstempel, beispielsweise zu einem Zeitpunkt in der Vergangenheit, wobei Sie auch einen Zeitstempel zu einem zukünftigen Zeitpunkt festlegen können (Wenn Sie einen Zeitstempel in der Zukunft angeben, wartet Spanner auf diesen Zeitstempel, bevor der Lesevorgang ausgeführt wird.)

Hinweise:

  • Obwohl Lesevorgänge mit diesen Modi von Zeitstempelgrenzen nicht Teil einer Lese- und Schreibtransaktion sind, können sie das Warten auf einen Commit gleichzeitiger Lese- und Schreibtransaktionen blockieren. Begrenzt veraltete Lesevorgänge versuchen, einen Zeitstempel auszuwählen, mit dem dieses Blockieren verhindert wird, allerdings ist es möglich, dass sie trotzdem blockieren.

  • Veraltete Lesevorgänge (beispielsweise unter Verwendung der begrenzten oder exakten Veralterung) haben den maximalen Leistungsvorteil bei den längsten Veralterungsintervallen. Verwenden Sie eine Mindestveralterung von 10 Sekunden, damit Sie einen Vorteil erhalten können.

  • Spanner verfolgt den earliest_version_time einer Datenbank, der den frühesten Zeitpunkt angibt, zu dem frühere Versionen von Daten gelesen werden können. Sie können keine Zeitstempel vor dem frühesten Versionszeitpunkt lesen.

Die Typen von Spanner-Zeitstempelgrenzen werden unten ausführlicher erläutert.

Überzeugende

Spanner bietet einen Grenztyp für starke Lesevorgänge. Starke Lesevorgänge erkennen garantiert die Auswirkungen aller Transaktionen, die vor Start des Lesevorgangs durchgeführt wurden. Außerdem sind alle Zeilen, die von einem einzigen Lesevorgang ausgegeben wurden, miteinander konsistent. Wenn ein Teil des Lesevorgangs eine Transaktion erkennt, erkennen alle Teile des Lesevorgangs die Transaktion.

Starke Lesevorgänge sind nicht wiederholbar: Zwei aufeinanderfolgende starke schreibgeschützte Transaktionen können inkonsistente Ergebnisse zurückgeben, wenn Schreibvorgänge gleichzeitig ausgeführt werden. Wenn Lesevorgang-übergreifende Konsistenz erforderlich ist, sollten die Lesevorgänge innerhalb derselben Transaktion oder zu einem genauen Zeitstempel ausgeführt werden.

Begrenzte Veralterung

Spanner bietet einen Grenztyp für begrenzte Veralterung. Modi der begrenzten Veralterung ermöglichen es Spanner, den Lesezeitstempel auszuwählen, vorbehaltlich einer vom Nutzer bereitgestellten Veralterungsgrenze. Spanner wählt den neuesten Zeitstempel innerhalb der Veralterungsgrenze aus, der die Ausführung der Lesevorgänge am nächstgelegenen Replikat ohne Blockierung ermöglicht.

Alle ausgegebenen Zeilen sind miteinander konsistent – wenn ein Teil des Lesevorgangs eine Transaktion erkennt, erkennen alle Teile des Lesevorgangs die Transaktion. Begrenzt veraltete Lesevorgänge sind nicht wiederholbar: Zwei veraltete Lesevorgänge können, selbst wenn sie die gleiche Skalierung verwenden, zu unterschiedlichen Zeitstempeln ausgeführt werden und somit inkonsistente Ergebnisse zurückgeben.

Begrenzt veraltete Lesevorgänge sind in der Regel etwas langsamer als vergleichbare exakt veraltete Lesevorgänge.

Exakte Veralterung

Spanner bietet einen Grenztyp für exakte Veralterung. Diese Zeitstempelgrenzen führen Lesevorgänge mit einem vom Nutzer angegebenen Zeitstempel aus. Bei Lesevorgängen mit einem Zeitstempel wird garantiert, dass ein konsistentes Präfix der globalen Transaktionshistorie angezeigt wird. Sie beobachten Änderungen, die von allen Transaktionen mit einem Commit-Zeitstempel durchgeführt werden, der kleiner oder gleich dem Lesezeitstempel ist, und erkennen keine Änderungen, die von Transaktionen mit einem größeren Commit-Zeitstempel ausgeführt werden. Sie blockieren, bis alle in Konflikt stehenden Transaktionen abgeschlossen sind, denen Commit-Zeitstempel zugewiesen werden können, die kleiner oder gleich dem Lesezeitstempel sind.

Der Zeitstempel kann entweder als absoluter Spanner-Commit-Zeitstempel oder als Veralterung relativ zur aktuellen Zeit ausgedrückt werden.

Diese Modi benötigen keine "Verhandlungsphase", um einen Zeitstempel auszuwählen. Folglich sind sie etwas schneller als äquivalente begrenzt veraltete Gleichzeitigkeitsmodi. Andererseits liefern begrenzt veraltete Lesevorgänge in der Regel neuere Ergebnisse.

Maximale Zeitstempelveralterung

Spanner bereinigt kontinuierlich gelöschte und überschriebene Daten im Hintergrund, um Speicherplatz freizugeben. Dieser Vorgang wird als Version GC bezeichnet. Version GC nimmt Versionen zurück, die nach dem version_retention_period einer Datenbank abgelaufen sind. Der Standardwert ist 1 Stunde, kann aber bis zu 1 Woche konfiguriert werden. Diese Einschränkung gilt auch für laufende Lesevorgänge und/oder SQL-Abfragen, deren Zeitstempel während der Ausführung zu alt werden. Für Lesevorgänge und SQL-Abfragen mit zu alten Zeitstempeln wird der Fehler FAILED_PRECONDITION ausgegeben. Die einzige Ausnahme ist Partition Lesen/Abfrage mit Partitionstokens, die die automatische Speicherbereinigung abgelaufener Daten verhindert, während die Sitzung aktiv bleibt.