Cloud Spanner: TrueTime und externe Konsistenz

TrueTime ist eine hochverfügbare, verteilte Uhr, die Anwendungen auf allen Google-Servern bereitgestellt wird1. TrueTime ermöglicht es Anwendungen, monoton steigende Zeitstempel zu generieren: Eine Anwendung kann einen Zeitstempel T berechnen, der garantiert größer ist als jeder Zeitstempel T', wenn die Generierung von T' abgeschlossen war, bevor die Generierung von T begann. Diese Garantie gilt für alle Server und Zeitstempel.

Diese Funktion von TrueTime wird von Cloud Spanner verwendet, um Transaktionen Zeitstempel zuzuweisen. Konkret wird jeder Transaktion ein Zeitstempel zugewiesen, der den Zeitpunkt widerspiegelt, zu dem Cloud Spanner sie als erfolgt betrachtet. Da Cloud Spanner die versionsübergreifende Nebenläufigkeitserkennung (Multi-Version Concurrency Control, MVCC) verwendet, können Cloud Spanner-Clients dank der Reihenfolgegarantie für Zeitstempel konsistente Lesevorgänge über eine ganze Datenbank hinweg ausführen (sogar über mehrere Cloud-Regionen hinweg), ohne Schreibvorgänge zu blockieren.

Externe Konsistenz

Wenn die Isolationsebene nicht angegeben ist oder Sie die Isolationsebene als serialisierbare Isolation festlegen, bietet Cloud Spanner Clients die strengsten Garantien bezüglich der Nebenläufigkeitserkennung für Transaktionen. Dies wird als externe Konsistenz2 bezeichnet. Unter externer Konsistenz verhält sich das System so, als würden alle Transaktionen sequenziell ausgeführt, obwohl Cloud Spanner sie tatsächlich auf mehreren Servern (und möglicherweise in mehreren Rechenzentren) ausführt, um eine höhere Leistung und Verfügbarkeit zu erzielen. Wenn eine Transaktion vor Ausführungsbeginn einer anderen Transaktion abgeschlossen ist, sorgt das System außerdem dafür, dass Clients niemals einen Zustand sehen können, der nur die Auswirkungen der zweiten Transaktion, nicht aber die der ersten widerspiegelt. Intuitiv betrachtet ist Cloud Spanner semantisch nicht von einer Datenbank auf einem einzelnen Computer zu unterscheiden. Trotz dieser starken Garantien ermöglicht Cloud Spanner Anwendungen eine vergleichbare Leistung wie Datenbanken mit schwächeren Garantien (im Gegenzug für eine höhere Leistung). In Cloud Spanner dürfen Schreibvorgänge standardmäßig fortgesetzt werden, ohne dass sie durch schreibgeschützte Transaktionen blockiert werden, jedoch ohne die Anomalien, die bei der Isolation wiederholbarer Lesevorgänge auftreten können.

Andererseits sorgt die Isolation wiederholbarer Lesevorgänge dafür, dass alle Lesevorgänge innerhalb einer Transaktion einen konsistenten Snapshot der Datenbank sehen, wie er zu Beginn der Transaktion vorlag. Dieser Ansatz ist in Szenarien mit hoher Nebenläufigkeit von Lese-/Schreibvorgängen vorteilhaft, in denen zahlreiche Transaktionen Daten lesen, die von anderen Transaktionen geändert werden könnten. Weitere Informationen finden Sie unter Isolation wiederholbarer Lesevorgänge.

Externe Konsistenz vereinfacht die Anwendungsentwicklung erheblich. Angenommen, Sie haben in Cloud Spanner eine Banking-Anwendung erstellt und einer Ihrer Kunden hat zu Beginn 50 € auf seinem Girokonto und 50 € auf seinem Sparkonto. Ihre Anwendung startet dann einen Workflow, in dem sie zuerst den Commit einer Transaktion T1 zur Einzahlung von 200 € auf das Sparkonto durchführt und anschließend eine zweite Transaktion T2 zur Abbuchung von 150 € vom Girokonto ausführt. Nehmen wir weiter an, dass am Ende des Tages negative Salden auf einem Konto automatisch von anderen Konten gedeckt werden und dass ein Kunde eine Strafgebühr zahlen muss, wenn der Gesamtsaldo aller seiner Konten zu irgendeinem Zeitpunkt während dieses Tages negativ ist. Dank externer Konsistenz ist es für alle Leser der Datenbank klar erkennbar, dass die Einzahlung T1 vor der Abbuchung T2 erfolgt ist, da der Commit von T2 nach Abschluss von T1 beginnt. Anders ausgedrückt sorgt externe Konsistenz dafür, dass niemand jemals einen Zustand sieht, bei dem T2 vor T1 auftritt. Das heißt, die Abbuchung wird niemals zu einer Strafgebühr aufgrund unzureichender Deckung führen.

Eine herkömmliche Datenbank mit Speicherung einzelner Versionen und strikter Zwei-Phasen-Sperrung bietet externe Konsistenz. Leider ruft ein solches System jedes Mal, wenn Ihre Anwendung die aktuellen Daten lesen möchte (auch „starker Lesevorgang“ genannt), eine Lesesperre für die Daten ab, wodurch Schreibvorgänge für die gelesenen Daten blockiert werden.

Zeitstempel und MVCC

Damit Lesevorgänge ausgeführt werden können, ohne Schreibvorgänge zu blockieren, speichern Cloud Spanner und viele andere Datenbanksysteme mehrere unveränderliche Versionen der Daten (oft als versionsübergreifende Nebenläufigkeitserkennung bezeichnet). Ein Schreibvorgang erstellt eine neue unveränderliche Version, deren Zeitstempel dem Zeitstempel der Schreibtransaktion entspricht. Ein „Snapshot-Lesevorgang“ bei einem Zeitstempel gibt den Wert der neuesten Version vor diesem Zeitstempel zurück und muss Schreibvorgänge nicht blockieren. Daher ist es wichtig, dass die den Versionen zugewiesenen Zeitstempel mit der Reihenfolge übereinstimmen, in der Transaktions-Commits tatsächlich durchgeführt werden. Wir nennen diese Eigenschaft „ordnungsgemäße Zeitstempel“, was der externen Konsistenz entspricht.

Warum ordnungsgemäße Zeitstempel wichtig sind, sehen Sie am Banking-Beispiel aus dem vorherigen Abschnitt. Ohne ordnungsgemäße Zeitstempel könnte T2 ein Zeitstempel zugewiesen werden, der vor dem für T1 zugewiesenen Zeitstempel liegt (wenn beispielsweise ein hypothetisches System lokale Uhren anstelle von TrueTime verwendet und die Uhr des Servers, der T2 verarbeitet, leicht nachgeht). Ein Snapshot-Lesevorgang spiegelt dann möglicherweise die Abbuchung von T2 wider, nicht aber die Einzahlung von T1, obwohl der Kunde den Abschluss der Einzahlung vor Beginn der Abbuchung gesehen hat.

In einer Datenbank auf einem einzelnen Computer stellt das Zuweisen ordnungsgemäßer Zeitstempel kein Problem dar. Beispielsweise können Sie einfach Zeitstempel von einem globalen, monoton ansteigenden Zähler zuweisen. In einem weit verteilten System wie Cloud Spanner, in dem Server auf der ganzen Welt Zeitstempel zuweisen müssen, ist es viel schwieriger, dies effizient zu erreichen.

Cloud Spanner stützt sich auf TrueTime, um monoton steigende Zeitstempel zu generieren. Cloud Spanner verwendet diese Zeitstempel auf zwei Arten. Erstens werden sie als ordnungsgemäße Zeitstempel für Schreibtransaktionen verwendet, ohne dass eine globale Kommunikation erforderlich ist. Zweitens werden sie als Zeitstempel für starke Lesevorgänge verwendet, wodurch diese in einer Kommunikationsrunde ausgeführt werden können. Dies gilt sogar für starke Lesevorgänge, die sich über mehrere Server erstrecken.

Häufig gestellte Fragen

Welche Konsistenzgarantien bietet Cloud Spanner?

Cloud Spanner bietet standardmäßig externe Konsistenz, die strengste Konsistenzeigenschaft für Transaktionsverarbeitungssysteme. Alle Transaktionen in Cloud Spanner, die Isolation zur Serialisierbarkeit verwenden, entsprechen dieser Konsistenzeigenschaft, nicht nur diejenigen innerhalb einer Partition. Weitere Informationen finden Sie unter Isolationsebenen – Übersicht.

Externe Konsistenz besagt, dass Cloud Spanner Transaktionen auf eine Weise ausführt, die von einem System mit serieller Transaktionsausführung nicht zu unterscheiden ist. Außerdem bedeutet dies, dass die serielle Reihenfolge mit der Reihenfolge übereinstimmt, in der Transaktions-Commits tatsächlich durchgeführt werden. Da die für Transaktionen generierten Zeitstempel der seriellen Reihenfolge entsprechen, gilt Folgendes: Wenn ein Client den Beginn des Commits einer Transaktion T2 sieht, nachdem eine andere Transaktion T1 abgeschlossen ist, wird T2 ein Zeitstempel zugewiesen, der nach dem Zeitstempel von T1 liegt.

Bietet Cloud Spanner Linearisierbarkeit?

Ja. Cloud Spanner bietet standardmäßig externe Konsistenz, eine stärkere Eigenschaft als Linearisierbarkeit, da Linearisierbarkeit nichts über das Verhalten von Transaktionen aussagt. Linearisierbarkeit ist eine Eigenschaft nebenläufiger Objekte, die atomare Lese- und Schreibvorgänge unterstützen. In einer Datenbank wäre ein „Objekt“ typischerweise eine einzelne Zeile oder sogar eine einzelne Zelle. Externe Konsistenz ist eine Eigenschaft von Transaktionsverarbeitungssystemen, bei denen Clients Transaktionen, die mehrere Lese- und Schreibvorgänge für beliebige Objekte enthalten, dynamisch synthetisieren. Linearisierbarkeit kann als Sonderfall der externen Konsistenz betrachtet werden, bei dem eine Transaktion nur einen einzigen Lese- oder Schreibvorgang für ein einziges Objekt enthalten darf.

Bietet Cloud Spanner Serialisierbarkeit?

Ja. Cloud Spanner bietet standardmäßig externe Konsistenz, eine striktere Eigenschaft als Serialisierbarkeit. Ein Transaktionsverarbeitungssystem ist serialisierbar, wenn es Transaktionen auf eine Weise ausführt, die von einem System mit serieller Transaktionsausführung nicht zu unterscheiden ist. Darüber hinaus bietet Cloud Spanner die Gewähr, dass die serielle Reihenfolge mit der Reihenfolge übereinstimmt, in der Transaktions-Commits tatsächlich durchgeführt werden.

Betrachten Sie noch einmal das zuvor verwendete Banking-Beispiel. In einem System mit Serialisierbarkeit, aber ohne externe Konsistenz, wäre die Änderung der Transaktionsreihenfolge zulässig, obwohl der Kunde T1 und dann erst T2 ausgeführt hat. Dies könnte dazu führen, dass für die Abbuchung aufgrund unzureichender Deckung eine Strafgebühr fällig wird.

Bietet Cloud Spanner strikte Konsistenz?

Ja. Cloud Spanner bietet externe Konsistenz, eine stärkere Eigenschaft als strikte Konsistenz. Der Standardmodus für Lesevorgänge in Cloud Spanner ist „strong“ (stark). Dadurch wird sichergestellt, dass die Auswirkungen aller Transaktionen berücksichtigt werden, deren Commit vor dem Start des jeweiligen Vorgangs erfolgt ist. Dabei ist unerheblich, welches Replikat den Lesevorgang empfängt.

Was ist der Unterschied zwischen strikter Konsistenz und externer Konsistenz?

Ein Replikationsprotokoll weist strikte Konsistenz auf, wenn die replizierten Objekte linearisierbar sind. Ähnlich wie Linearisierbarkeit ist strikte Konsistenz schwächer als externe Konsistenz, da sie keine Verhaltensweisen von Transaktionen erzwingt.

Bietet Cloud Spanner Eventual Consistency (verzögerte Konsistenz)?

Cloud Spanner bietet externe Konsistenz, eine wesentlich stärkere Eigenschaft als Eventual Consistency. Bei Eventual Consistency werden schwächere Garantien in Kauf genommen, um eine höhere Leistung zu erzielen. Eventual Consistency ist problematisch, da Leser die Datenbank in einem Zustand sehen können, der nie existiert hat. Ein Lesevorgang könnte beispielsweise einen Zustand wahrnehmen, in dem für Transaktion B ein Commit durchgeführt wurde, jedoch nicht für Transaktion A, obwohl A vor B stattgefunden hat.

In Cloud Spanner sind Lesevorgänge veralteter Daten möglich, die ähnliche Leistungsvorteile wie Eventual Consistency bieten, jedoch mit viel stärkeren Konsistenzgarantien. Ein Lesevorgang veralteter Daten gibt Daten von einem früheren Zeitstempel zurück, wodurch Schreibvorgänge nicht blockiert werden können, da frühere Versionen der Daten unveränderlich sind.

Weitere Informationen

Hinweise

  • 1J. C. Corbett, J. Dean, M. Epstein, A. Fikes, C. Frost, J. Furman, S. Ghemawat, A. Gubarev, C. Heiser, P. Hochschild, W. Hsieh, S. Kanthak, E. Kogan, H. Li, A. Lloyd, S. Melnik, D. Mwaura, D. Nagle, S. Quinlan, R. Rao, L. Rolig, Y. Saito, M. Szymaniak, C. Taylor, R. Wang und D. Woodford. Spanner: Google's Globally-Distributed Database. In: Tenth USENIX Symposium on Operating Systems Design and Implementation (OSDI 12), S. 261–264, Hollywood, CA, Okt. 2012.
  • 2Gifford, D. K. Information Storage in a Decentralized Computer System. Doktorarbeit, Stanford University, 1981.