Zeitstempelgrenzen

Einführung

Wenn Sie Daten in Spanner in einer schreibgeschützten Transaktion oder einem einzelnen Leseaufruf lesen, können Sie eine Zeitstempelgrenze festlegen. Dadurch wird Spanner mitgeteilt, 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 haben Ihre Spanner-Instanz mit einer multiregionalen Instanzkonfiguration erstellt) 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 die earliest_version_time einer Datenbank, die den frühesten Zeitpunkt angibt, zu dem vergangene Versionen von Daten gelesen werden können. Sie können keine Zeitstempel vor dem frühesten Versionszeitpunkt lesen.

Die Spanner-Grenztypen für Zeitstempel 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 für begrenzte Veralterung ermöglichen es Spanner, den Lesezeitstempel vorbehaltlich einer vom Nutzer angegebenen Veralterung auszuwählen. Spanner wählt den neuesten Zeitstempel innerhalb der Grenze für die Veralterung aus, der die Ausführung der Lesevorgänge am nächstgelegenen verfügbaren 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 zurückzugewinnen. 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.