Schreibvorgänge in Cloud Bigtable

Überblick

Auf dieser Seite werden die Typen von Schreibanfragen aufgeführt, die Sie an Cloud Bigtable senden können. Außerdem wird beschrieben, wann Sie diese verwenden sollten und wann nicht.

Mit den Daten-APIs und Clientbibliotheken von Cloud Bigtable können Sie programmgesteuert Daten in Ihre Tabellen schreiben. Cloud Bigtable sendet für jeden Schreibvorgang eine Antwort oder Bestätigung zurück.

Jede Clientbibliothek bietet die Möglichkeit, die folgenden Schreibanfragetypen zu senden:

  • Einfache Schreibvorgänge
  • Erhöhungen und Ergänzungen
  • Bedingte Schreibvorgänge
  • Batchschreibvorgänge

Cloud Bigtable-Clientbibliotheken haben eine integrierte intelligente Wiederholungsfunktion für einfache Schreibvorgänge und Batchschreibvorgänge. Sie kommen also problemlos mit vorübergehenden Ausfällen zurecht. Wenn Ihre Anwendung beispielsweise versucht, Daten zu schreiben, und ein vorübergehender Ausfall oder ein Netzwerkproblem auftritt, wird der Versuch automatisch wiederholt, bis der Schreibvorgang durchgeführt wurde oder das Zeitlimit für Anfragen erreicht ist. Diese Ausfallsicherheit funktioniert sowohl bei Single-Cluster- als auch bei Multi-Cluster-Instanzen mit Single-Cluster- oder Multi-Cluster-Routing.

Für Batch- und Streaming-Schreibvorgänge können Sie den Dataflow-Connector für Cloud Bigtable verwenden.

Beispiele für jeden Schreibvorgangstypen sind für jede Cloud Bigtable-Clientbibliothek verfügbar.

Schreibvorgangstypen und ihre Verwendung

Alle Schreibanfragen umfassen die folgenden grundlegenden Komponenten:

  • Den Namen der Tabelle, in die Daten geschrieben werden sollen.
  • Eine Anwendungsprofil-ID, die Cloud Bigtable mitteilt, wie der Traffic weitergeleitet werden soll.
  • Eine oder mehrere Mutationen. Eine Mutation besteht aus vier Elementen:
    • Name der Spaltenfamilie
    • Spaltenqualifizierer
    • Zeitstempel
    • Wert, den Sie in die Datenbank schreiben

Der Zeitstempel einer Mutation hat einen Standardwert für das aktuelle Datum und die Uhrzeit. Alle Mutationen in einer einzelnen Schreibanfrage haben nur denselben Zeitstempel, wenn Sie sie nicht überschreiben. Sie können den Zeitstempel aller Mutationen in einer Schreibanfrage gleich oder unterschiedlich festlegen.

Einfache Schreibvorgänge

Sie können eine einzelne Zeile in Cloud Bigtable mit einer MutateRow-Anfrage schreiben, die den Tabellennamen, die ID des zu verwendenden Anwendungsprofils, einen Zeilenschlüssel und bis zu 100.000 Mutationen für diese Zeile enthält. Ein einzeiliger Schreibvorgang ist atomar. Verwenden Sie diesen Schreibvorgangstyp, wenn Sie mehrere Mutationen an einer einzelnen Zeile vornehmen.

Codebeispiele zum Senden einfacher Schreibanfragen finden Sie unter Einfachen Schreibvorgang ausführen.

Wann einfache Schreibvorgänge nicht verwendet werden sollen

Für die folgenden Anwendungsfälle sind einfache Schreibvorgänge nicht die beste Möglichkeit, um Daten zu schreiben:

  • Sie schreiben einen Datenbatch mit zusammenhängenden Zeilenschlüsseln. In diesem Fall sollten Sie Batchschreibvorgänge anstelle von aufeinanderfolgenden einfachen Schreibvorgängen verwenden, da ein zusammenhängender Batch in einem einzelnen Back-End-Aufruf angewendet werden kann.

  • Sie möchten einen hohen Durchsatz (Zeilen pro Sekunde oder Byte pro Sekunde) und benötigen keine niedrige Latenz. In diesem Fall sind Batchschreibvorgänge schneller.

Erhöhungen und Ergänzungen

Wenn Sie einen vorhandenen Wert durch Daten ergänzen oder einen vorhandenen numerischen Wert erhöhen möchten, senden Sie eine ReadModifyWriteRow-Anfrage Diese enthält den Tabellennamen, die ID des zu verwendenden Anwendungsprofils, einen Zeilenschlüssel und eine Reihe von Regeln, die beim Schreiben der Daten verwendet werden sollen. Jede Regel enthält den Namen der Spaltenfamilie, den Spaltenqualifizierer und entweder einen ergänzten oder erhöhten Wert.

Regeln werden der Reihe nach angewendet. Wenn Ihre Anfrage beispielsweise eine Anfrage zum Erhöhen des Werts für eine Spalte um zwei enthält und eine spätere Regel in derselben Anfrage dieselbe Spalte um 1 erhöht, wird die Spalte in diesem einzelnen atomaren Schreibvorgang um 3 erhöht. Die spätere Regel überschreibt nicht die frühere Regel.

Ein Wert kann nur erhöht werden, wenn er als 64-Bit-Big-Endian-Ganzzahl codiert ist. Cloud Bigtable behandelt eine Erhöhung auf einen leeren oder nicht vorhandenen Wert wie einen Wert, der null ist. ReadModifyWriteRow-Anfragen sind atomar. Sie werden nicht wiederholt, wenn sie aus irgendeinem Grund fehlschlagen.

Codebeispiele zum Anhängen eines Werts in einer Zelle finden Sie unter Vorhandenen Wert erhöhen.

Wann Erhöhungen und Ergänzungen nicht verwendet werden sollen

Sie sollten in den folgenden Fällen keine ReadModifyWriteRow-Anfragen senden:

  • Sie verwenden ein Anwendungsprofil mit Multi-Cluster-Routing.

  • Sie verwenden mehrere Single-Cluster-App-Profile und senden Schreibvorgänge, die mit Daten in Konflikt stehen können, die in derselben Zeile und Spalte in anderen Clustern in der Instanz geschrieben wurden. Beim Single-Cluster-Routing wird eine Schreibanfrage an einen einzelnen Cluster gesendet und anschließend repliziert.

  • Sie nutzen die intelligente Wiederholungsfunktion, die von den Clientbibliotheken bereitgestellt wird. Erhöhungen und Ergänzungen sind nicht abrufbar.

  • Sie schreiben große Datenmengen und müssen die Schreibvorgänge schnell beenden. Eine Anfrage, die eine Zeile liest und dann ändert, ist langsamer als eine einfache Schreibanfrage. Dieser Schreibvorgangstyp ist daher bei umfangreichen Projekten oft nicht der beste Ansatz. Wenn Sie beispielsweise etwas in Millionenhöhe zählen möchten, wie Seitenaufrufe, sollten Sie eher jede Ansicht als einfachen Schreibvorgang aufzeichnen, anstatt einen Wert zu erhöhen. Anschließend können Sie die Daten mithilfe eines Dataflow-Jobs aggregieren.

Bedingte Schreibvorgänge

Wenn Sie eine Zeile auf eine Bedingung prüfen und dann je nach Ergebnis Daten in diese Zeile schreiben möchten, senden Sie eine CheckAndMutateRow-Anfrage. Dieser Anfragetyp umfasst einen Zeilenschlüssel und einen Zeilenfilter. Ein Zeilenfilter besteht aus einer Reihe von Regeln, mit denen Sie den Wert vorhandener Daten prüfen. Danach werden Mutationen nur dann bestimmten Spalten in der Zeile zugewiesen, wenn bestimmte Bedingungen erfüllt sind, die vom Filter überprüft wurden. Das Überprüfen und anschließende Schreiben wird als einzelne atomare Aktion abgeschlossen.

Eine Filteranfrage muss einen oder beide Mutationstypen enthalten:

  • "Wahre" Mutationen oder die Mutationen, die angewendet werden müssen, wenn der Filter einen Wert zurückgibt
  • "Falsche" Mutationen, die angewendet werden, wenn der Filter keine Ergebnisse liefert

Sie können bis zu 100.000 Mutationen jedes Typs (wahr und falsch) in einem einzigen Schreibvorgang bereitstellen und Sie müssen mindestens einen davon senden. Cloud Bigtable sendet eine Antwort, wenn alle Mutationen abgeschlossen sind.

Codebeispiele zum Senden von bedingten Schreibvorgängen finden Sie unter Wert bedingt schreiben.

Wann bedingte Schreibvorgänge nicht verwendet werden sollen

Für den folgenden Anwendungsfall können Sie keine bedingten Schreibvorgänge verwenden:

  • Sie verwenden ein Anwendungsprofil mit Multi-Cluster-Routing.

  • Sie verwenden mehrere Single-Cluster-App-Profile und senden Schreibvorgänge, die mit Daten in Konflikt stehen können, die in derselben Zeile und Spalte in anderen Clustern in der Instanz geschrieben wurden. Beim Single-Cluster-Routing wird eine Schreibanfrage an einen einzelnen Cluster gesendet und anschließend repliziert.

Batchschreibvorgänge

Mit einer MutateRows-Anfrage können Sie mit einem Aufruf mehr als eine Zeile schreiben. MutateRows-Anfragen enthalten einen Satz von bis zu 100.000 Einträgen, die jeweils atomar angewendet werden. Jeder Eintrag besteht aus einem Zeilenschlüssel und mindestens einer Mutation, die auf die Zeile angewendet werden soll. Eine Batchschreibanfrage kann bis zu 100.000 Mutationen enthalten, die auf alle Einträge verteilt sind. Ein Batchschreibvorgang könnte beispielsweise eine der folgenden Varianten enthalten:

  • 100.000 Einträge mit 1 Mutation in jedem Eintrag
  • 1 Eintrag mit 100.000 Mutationen
  • 1.000 Einträge mit jeweils 100 Mutationen

Jeder Eintrag in einer MutateRows-Anfrage ist atomar, die Anfrage insgesamt jedoch nicht. Cloud Bigtable sendet eine Antwort, wenn alle Einträge geschrieben wurden.

Codebeispiele zum Senden von Batch-Schreibvorgängen finden Sie unter Batchschreibvorgänge ausführen.

Wann keine Batchschreibvorgänge verwendet werden sollen

  • Sie schreiben Bulk-Daten in Zeilen, die nicht nahe beieinander liegen. Cloud Bigtable speichert Daten lexikografisch nach Zeilenschlüssel, dem binären Äquivalent der alphabetischen Reihenfolge. Aus diesem Grund werden unterschiedliche Zeilenschlüssel in einer Anfrage von Cloud Bigtable nacheinander und nicht parallel verarbeitet. Sowohl der Durchsatz als auch die Latenz werden hoch sein. Verwenden Sie MutateRows, wenn die Zeilenschlüssel ähnlich sind und Cloud Bigtable Zeilen schreibt, die nahe beieinander liegen, um diese hohe Latenz zu vermeiden. Verwenden Sie MutateRow oder einfache Schreibvorgänge für Zeilen, die nicht nah beieinander liegen.

  • Sie fordern mehrere Mutationen in derselben Zeile an. In diesem Fall ist die Leistung besser, wenn Sie alle Mutationen in einer einzelnen einfachen Schreibanfrage ausführen. Dies liegt daran, dass bei einem einfachen Schreibvorgang alle Änderungen in einer einzigen atomaren Aktion durchgeführt werden, während beim Batchschreibvorgang Mutationen in dieselbe Zeile serialisiert werden, was Latenz verursacht.

Konsistenz bei Verwendung einer Replikation

Wie lange es dauert, bis die von Ihnen geschriebenen Daten für Lesevorgänge zur Verfügung stehen, hängt von mehreren Faktoren ab, einschließlich der Anzahl der Cluster in Ihrer Instanz und des Routing-Typs, den Ihr Anwendungsprofil verwendet. Mit einer Single-Cluster-Instanz können die Daten sofort gelesen werden. Wenn eine Instanz jedoch mehr als einen Cluster hat, d. h. die Replikation verwendet, ist Cloud Bigtable letztendlich konsistent. Sie können die Read-Your-Writes-Konsistenz erreichen, indem Sie Anfragen an denselben Cluster weiterleiten.

Sie können ein Konsistenztoken erstellen und verwenden, nachdem Sie Schreibanfragen gesendet haben. Das Token prüft, ob die Replikation konsistent ist. In der Regel erstellen Sie ein Konsistenztoken entweder nach dem Senden eines Batches von Schreibvorgängen oder nach einem bestimmten Intervall, z. B. nach einer Stunde. Anschließend können Sie das zu verwendende Token durch einen anderen Prozess übergeben, z. B. ein Modul, das eine Leseanfrage stellt. Dabei wird mithilfe des Tokens überprüft, ob alle Daten repliziert wurden, bevor versucht wird, sie zu lesen.

Wenn Sie ein Token direkt nach dem Erstellen verwenden, kann es einige Minuten dauern, bis die Konsistenz bei der ersten Verwendung überprüft wurde. Diese Verzögerung liegt daran, dass jeder Cluster jeden anderen Cluster überprüft, um sicherzustellen, dass keine Daten mehr eingehen. Nach der erstmaligen Verwendung oder wenn Sie einige Minuten auf die erstmalige Verwendung des Tokens warten, ist das Token bei jeder Verwendung sofort erfolgreich.

Weitere Informationen