Zeitstempelgrenzen

Einleitung

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

Warum sollten Sie eine Zeitstempelgrenze festlegen? Wenn Ihre Datenbank geografisch verteilt ist (also Sie haben die Spanner-Instanz mit einer multiregionalen Instanz erstellt Konfiguration) und Ihre Anwendung kann beim Lesen von Daten eine gewisse Veralterung tolerieren. erhalten Sie Latenzvorteile, wenn Sie einen veralteten Lesevorgang statt eines gut lesbar sein. (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 auf diesen Zeitstempel, bevor der Lesevorgang bereitgestellt 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 Datenversionen gelesen werden können. Sie können keine Zeitstempel vor dem Zeitstempel der ältesten Version lesen.

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

Stark

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. Mit Modi der begrenzten Veralterung kann Spanner den Lesezeitstempel auswählen, wobei vom Nutzer bereitgestellte Veralterungsgrenzen vorbehalten sind. Spanner wählt den neuesten Zeitstempel innerhalb der Begrenzung 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 ein absoluter Spanner-Commit oder als eine zur aktuellen Zeit relative Veralterung 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 löscht gelöschte und überschriebene Daten kontinuierlich im Rahmen einer automatischen Speicherbereinigung im Hintergrund ausgeführt, 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.