Schema entwerfen

Auf dieser Seite wird beschrieben, wie Sie ein Schema für eine Tabelle in Cloud Bigtable erstellen. Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Überblick über Cloud Bigtable vertraut gemacht haben.

Allgemeine Konzepte

Der Entwurfsprozess für ein Schema von Cloud Bigtable unterscheidet sich deutlich vom Entwurfsprozess für ein Schema einer relationalen Datenbank. Beim Entwerfen Ihres Schemas für Cloud Bigtable sind folgende Konzepte von Bedeutung:

  • Jede Tabelle verfügt nur über einen Index, den Zeilenschlüssel. Es gibt keinen Sekundärindex.
  • Zeilen werden lexikografisch nach Zeilenschlüssel geordnet, vom kleinsten bis zum größten Bytestring. Zeilenschlüssel werden in Big-Endian-Bytereihenfolge sortiert. Dies wird manchmal auch als Netzwerk-Bytereihenfolge bezeichnet und ist das binäre Äquivalent der alphabetischen Reihenfolge. Das bedeutet, dass Ganzzahlen nicht automatisch numerisch sortiert werden. Beispiel: 3 > 20. Wenn Sie Ganzzahlen speichern und numerisch sortieren möchten, füllen Sie sie so auf, dass sie numerisch sortiert werden: 20 > 03. Dies gilt insbesondere für Zeitstempel, bei denen bereichsbasierte Abfragen erwünscht sind.
  • Spalten werden nach Spaltenfamilien gruppiert und in lexikografischer Reihenfolge innerhalb der Spaltenfamilie sortiert.
  • Alle Vorgänge sind auf Zeilenebene atomar. Wenn Sie zum Beispiel 2 Zeilen in einer Tabelle aktualisieren, ist es möglich, dass eine Zeile erfolgreich aktualisiert wird und die andere nicht. Beachten Sie deshalb die folgenden Richtlinien:
    • Schemas, die Atomarität zwischen Zeilen benötigen, sollten vermieden werden.
    • Grundsätzlich sollten sich alle Informationen zu einer Entität in einer einzelnen Zeile befinden. Wenn Sie in Ihrem Anwendungsfall jedoch keine atomaren Updates oder Lesevorgänge für eine Entität ausführen müssen, können Sie die Entität auf mehrere Zeilen aufteilen. Bei großen Datenmengen der Entität (mehrere Hundert MB) wird das Aufteilen auf mehrere Zeilen empfohlen.
  • Über die Zeilen der Tabelle hinweg sollten Lese- und Schreibvorgänge idealerweise gleichmäßig verteilt sein.
  • Verwandte Entitäten sollten in angrenzenden Zeilen gespeichert werden, um Lesevorgänge effizienter zu gestalten.
  • Die Tabellen in Cloud Bigtable sind "Sparse Tables". Das bedeutet z. B., dass leere Spalten keinen Speicherplatz beanspruchen. Daher ist es oft sinnvoll, viele Spalten zu erstellen, auch wenn die meisten Spalten in den meisten Zeilen leer sind.
  • Es ist besser, wenige große als viele kleine Tabellen zu haben. Cloud Bigtable erhielt seinen Namen, weil es mit sehr großen Tabellen am besten funktioniert. Es kann natürlich vorkommen, dass Sie eine separate Tabelle für einen völlig anderen Anwendungsfall brauchen, der ein völlig anderes Schema erfordert, aber Sie sollten keine separaten Tabellen für ähnliche Daten verwenden. Sie sollten beispielsweise keine neue Tabelle erstellen, weil ein neues Jahr begonnen hat oder Sie einen neuen Kunden haben.

Größenbeschränkungen

Bei Cloud Bigtable gibt es Größenbeschränkungen für die Daten, die Sie in Tabellen speichern. Beachten Sie diese Beschränkungen beim Entwerfen Ihres Schemas.

Da Cloud Bigtable Zeilen atomar liest, ist es besonders wichtig, die Gesamtmenge der in einer einzelnen Zeile gespeicherten Daten zu begrenzen. Als Best Practice empfiehlt es sich, nicht mehr als 10 MB in einer einzelnen Zelle und 100 MB in einer einzelnen Zeile zu speichern. Außerdem dürfen Sie die festen Grenzen der Datengröße innerhalb von Zellen und Zeilen nicht überschreiten.

Diese Größenbeschränkungen werden in binären Megabyte (MB) gemessen, wobei 1 MB 220 Byte entspricht. Diese Maßeinheit wird auch als Mebibyte (MiB) bezeichnet.

Zeilenschlüssel auswählen

Für die optimale Nutzung von Cloud Bigtable ist es wichtig, dass Sie Ihren Zeilenschlüssel sorgfältig zusammenstellen. Am effizientesten werden Abfragen in Cloud Bigtable für den Datenabruf mit dem Zeilenschlüssel, einem Zeilenpräfix oder einem Zeilenbereich ausgeführt. Andere Arten von Abfragen lösen einen Scan der gesamten Tabelle aus, was deutlich weniger effizient ist. Wenn Sie von vornherein den richtigen Zeilenschlüssel wählen, vermeiden Sie eine umständliche spätere Migration von Daten.

Klären Sie als Erstes, zu welchem Zweck Sie die zu speichernden Daten benötigen. Beispiel:

  • Nutzerinformationen: Brauchen Sie schnellen Zugang zu Informationen über die Verbindungen zwischen Nutzern (beispielsweise, ob Nutzer A Nutzer B folgt)?
  • Nutzergenerierte Inhalte: Wenn Sie Nutzern eine Auswahl aus einer größeren Menge nutzergenerierter Inhalte, z. B. Statusaktualisierungen, zeigen, wie entscheiden Sie, welche Statusaktualisierungen Sie einem bestimmten Nutzer anzeigen?
  • Zeitachsendaten: Benötigen Sie oft die letzten n Datensätze oder Datensätze, die in ein bestimmtes Zeitfenster fallen? Falls Sie Daten für verschiedene Ereignisse speichern, müssen Sie nach Art des Ereignisses filtern?

Wenn Sie in dieser Weise Ihre Anforderungen im Vorhinein klären, können Sie sichergehen, dass Ihr Zeilenschlüssel und der gesamte Entwurf Ihres Schemas genug Flexibilität für eine effiziente Datenabfrage bieten.

Arten von Zeilenschlüsseln

Im Folgenden finden Sie eine Beschreibung der am häufigsten verwendeten Arten von Zeilenschlüsseln sowie Hinweise dazu, wann Sie welchen Schlüssel verwenden sollten.

Als Faustregel gilt: Halten Sie den Zeilenschlüssel so lang wie nötig und so kurz wie möglich. Lange Zeilenschlüssel nehmen mehr Arbeits- und Festplattenspeicher in Anspruch und erhöhen die Antwortzeit des Cloud Bigtable-Servers.

Umgekehrte Domainnamen

Sollten Sie Daten über Entitäten speichern, die als Domainnamen dargestellt werden können, ist es sinnvoll, als Zeilenschlüssel einen umgekehrten Domainnamen zu verwenden (z. B. com.company.product). Dies ist besonders dann zu empfehlen, wenn die Daten in den einzelnen Zeilen sich häufiger mit denen in benachbarten Zeilen überschneiden. In diesem Fall kann Cloud Bigtable Ihre Daten besser komprimieren.

Diese Vorgehensweise funktioniert außerdem am besten, wenn Ihre Daten über viele verschiedene umgekehrte Domainnamen verteilt sind. Wenn Sie davon ausgehen, dass der Großteil Ihrer Daten in wenigen umgekehrten Domainnamen gespeichert werden muss, ziehen Sie andere Werte für Ihre Zeilenschlüssel in Betracht. Andernfalls überladen Sie möglicherweise eine Tabellenreihe, indem Sie die meisten Schreibvorgänge auf einen einzelnen Knoten in Ihrem Cluster schieben.

String-IDs

Wenn Sie Daten zu Entitäten speichern, die mit einem einfachen String identifiziert werden können (z. B. Nutzer-IDs), sollten Sie vielleicht die String-ID als Zeilenschlüssel oder als Teil des Zeilenschlüssels verwenden.

In der Vergangenheit wurde auf dieser Seite empfohlen, einen Hash der String-ID anstelle der tatsächlichen String-ID zu verwenden. Die Verwendung eines Hashs wird nicht mehr empfohlen. Wir haben festgestellt, dass gehashte Zeilenschlüssel die Fehlerbehebung mit Cloud Bigtable erheblich erschweren, weil sie effektiv ohne Aussagekraft sind. Wenn Ihr Zeilenschlüssel beispielsweise ein Hash der Nutzer-ID ist, ist es schwierig bis unmöglich, herauszufinden, welche Nutzer-ID an den Zeilenschlüssel gebunden ist.

Verwenden Sie für Nutzer lesbare Werte anstelle von gehashten Zeilenschlüsseln. Wenn Ihr Zeilenschlüssel mehrere Werte enthält, trennen Sie diese mit Trennzeichen. Dadurch ist es sehr viel einfacher, Probleme bei Cloud Bigtable mit dem Key Visualizer-Tool zu beheben.

Zeitstempel

Wenn Sie häufig Daten anhand der Zeit abrufen, zu der sie aufgezeichnet wurden, ist es sinnvoll, in Ihren Zeilenschlüssel einen Zeitstempel zu integrieren. Den Zeitstempel selbst als Zeilenschlüssel zu verwenden, wird nicht empfohlen, weil so die meisten Schreibvorgänge auf nur einen Knoten verschoben werden würden. Aus dem gleichen Grund sollten Sie es vermeiden, den Zeitstempel als Beginn des Zeilenschlüssels zu verwenden.

Ein Beispiel: Ihre Anwendung zeichnet einmal pro Sekunde für eine große Anzahl Maschinen leistungsbezogene Daten wie CPU- und Speicherauslastung auf. Ihr Zeilenschlüssel für diese Daten könnte aus einer Kombination einer Kennzeichnung für die Maschine und einem Zeitstempel für die Daten bestehen (z. B. machine_4223421#1425330757685).

Wenn Sie in der Regel die am kürzesten zurückliegenden Aufzeichnungen zuerst abrufen, können Sie einen umgekehrten Zeitstempel im Zeilenschlüssel verwenden. Dazu ziehen Sie den Zeitstempel vom Maximalwert Ihrer Programmiersprache für lange Ganzzahlen ab (java.lang.Long.MAX_VALUE in Java). Mit einem umgekehrten Zeitstempel werden die Aufzeichnungen von der letzten bis zur ersten geordnet.

Mehrere Werte in einem einzelnen Zeilenschlüssel

Da die einzige Möglichkeit für effiziente Abfragen in Cloud Bigtable der Zeilenschlüssel ist, kann es oft sinnvoll sein, mehrere IDs in Ihren Zeilenschlüssel einzubeziehen. Wenn Ihr Zeilenschlüssel mehrere Werte enthält, ist es besonders wichtig, ein klares Verständnis von der Verwendung der Daten zu haben.

Angenommen, Nutzer können mit Ihrer Anwendung Nachrichten posten und sich gegenseitig in Beiträgen erwähnen. Sie wollen einen effizienten Weg, alle Nutzer aufzulisten, die einen bestimmten Nutzer in einem Post getaggt haben. Eine Möglichkeit, dieses Ziel zu erreichen, besteht darin, einen Zeilenschlüssel zu verwenden, der den getaggten Nutzernamen enthält, gefolgt von dem taggenden Nutzernamen und mit einem Trennzeichen zwischen beiden (z. B. wmckinley#gwashington). Um herauszufinden, wer einen bestimmten Nutzernamen getaggt hat, oder um alle Beiträge zu sehen, die diesen Nutzernamen taggen, können Sie einfach den Bereich der Zeilen abrufen, deren Zeilenschlüssel mit diesem Nutzernamen beginnen.

Es ist wichtig, einen Zeilenschlüssel zu erstellen, mit dem ein genau definierter Zeilenbereich abgerufen werden kann. Andernfalls benötigt Ihre Abfrage einen Tabellenscan, der viel mehr Zeit als das Abrufen bestimmter Zeilen in Anspruch nimmt. Angenommen, Sie speichern leistungsbezogene Daten einmal pro Sekunde. Wenn Ihr Zeilenschlüssel aus einem Zeitstempel, gefolgt von der Maschinenkennzeichnung (z. B. 1425330757685#machine_4223421) besteht, gibt es keine effiziente Möglichkeit, Ihre Abfrage auf eine bestimmte Maschine zu beschränken. Sie können Ihre Abfrage nur anhand des Zeitstempels beschränken.

Präfixe für Zeilenschlüssel

Der erste Wert in einem Zeilenschlüssel mit mehreren Werten wird als Zeilenschlüsselpräfix bezeichnet. Mit sorgfältig ausgewählten Zeilenschlüsselpräfixen können Sie die Sortierung von Cloud Bigtable für das Speichern verwandter Daten in benachbarten Zeilen nutzen. Das Speichern zusammengehöriger Daten in angrenzenden Zeilen bietet Ihnen die Möglichkeit, auf verwandte Daten als Zeilenbereich zuzugreifen und keine ineffiziente Tabellensuche ausführen zu müssen.

Zeilenschlüsselpräfixe für Mehrinstanzenfähigkeit verwenden

Zeilenschlüsselpräfixe bieten eine skalierbare Lösung für einen Anwendungsfall mit erforderlicher Mehrinstanzenfähigkeit. In einem solchen Szenario werden ähnliche Daten mit dem gleichen Datenmodell für mehrere Clients gespeichert. Die Verwendung einer Tabelle für alle Mandanten ist die leistungsstärkste Methode für das Speichern und Zugreifen auf Daten mehrerer Mandanten.

Angenommen, Sie speichern und verfolgen den Bestellverlauf für eine Reihe von Unternehmen. Dabei können Sie Ihre eindeutige ID für jedes Unternehmen als Zeilenschlüsselpräfix nutzen. Alle Daten für einen Mandanten werden in zusammenhängenden Zeilen derselben Tabelle gespeichert. Mit dem Zeilenschlüsselpräfix können Sie eine Abfrage ausführen oder filtern. Wenn dann ein Unternehmen nicht mehr zu Ihren Kunden gehört und Sie die Bestellverlaufsdaten löschen müssen, die Sie für das Unternehmen gespeichert haben, können Sie dafür den Zeilenbereich löschen, für den der Zeilenschlüsselpräfix dieses Kunden verwendet wird.

Wenn Sie dagegen die Daten für ein Unternehmen in einer eigenen Tabelle speichern, besteht die Gefahr von Leistungs- und Skalierungsproblemen. Außerdem wird dann oft ungewollt die Grenze von Cloud Bigtable von 1.000 Tabellen pro Instanz überschritten. Nachdem eine Instanz dieses Limit erreicht hat, können Sie in Cloud Bigtable keine weiteren Tabellen in der Instanz erstellen.

Zu vermeidende Zeilenschlüssel

Manche Arten von Zeilenschlüsseln können Schwierigkeiten beim Abfragen Ihrer Daten verursachen oder die Leistung beeinträchtigen. In diesem Teil werden einige Arten von Zeilenschlüsseln beschrieben, deren Verwendung Sie in Cloud Bigtable vermeiden sollten.

Domainnamen

Vermeiden Sie standardmäßige, nicht umgekehrte Domainnamen als Zeilenschlüssel. Bei Verwendung von standardmäßigen Domainnamen wird die Abfrage aller Zeilen innerhalb eines Teils der Domain ineffizient (so würden in diesem Fall beispielsweise alle Zeilen mit Bezug zu company.com in separate Zeilenbereiche wie services.company.com, product.company.com usw. gelangen). Außerdem bewirkt die Verwendung von standardmäßigen Domainnamen, dass Zeilen so sortiert werden, dass aufeinander bezogene Daten nicht an einem Ort gespeichert werden. Dies kann zu einer weniger effizienten Komprimierung führen.

Sequenzielle numerische ID

Angenommen, Ihr System vergibt eine numerische ID an jeden Nutzer Ihrer Anwendung. Es mag in diesem Fall bequem erscheinen, die numerische ID der Nutzer als Zeilenschlüssel für Ihre Tabelle zu verwenden. Da neue Nutzer jedoch wahrscheinlich aktiver sind, verschiebt diese Herangehensweise den Großteil Ihres Traffics auf wenige Knoten.

Eine sicherere Herangehensweise wäre es, eine umgekehrte Version der numerischen ID der Nutzer zu verwenden. Dadurch verteilt sich der Traffic gleichmäßiger auf die Knoten Ihrer Tabelle in Cloud Bigtable.

Häufig aktualisierte IDs

Vermeiden Sie die Verwendung eines einzelnen Zeilenschlüssels zur Identifizierung eines Wertes, der sehr oft aktualisiert werden muss. Wenn Sie beispielsweise Daten zur Arbeitsspeichernutzung einmal pro Sekunde speichern, sollten Sie keinen einzelnen Zeilenschlüssel mit dem Namen memusage verwenden und ein wiederholtes Aktualisieren der Zeile vermeiden. Diese Art von Vorgang überlädt die Tabellenreihe, die die häufig verwendete Zeile speichert. Sie kann auch dazu führen, dass eine Zeile ihr Größenlimit überschreitet, weil die vorherigen Werte der Zelle für längere Zeit Speicherplatz beanspruchen.

Speichern Sie stattdessen einen Wert pro Zeile, indem Sie einen Zeilenschlüssel verwenden, der die Art des Messwerts, ein Trennzeichen und einen Zeitstempel beinhaltet. Um Speichernutzung im Zeitverlauf zu beobachten, können Sie beispielsweise Zeilenschlüssel ähnlich wie memusage#1423523569918 verwenden. Diese Strategie ist effizient, weil es in Cloud Bigtable nicht länger dauert, eine neue Zeile zu erstellen als eine neue Zelle. Zusätzlich können Sie durch diese Strategie schnell Daten aus einem speziellen Zeitraum lesen, indem Sie die passenden Start- und Endschlüssel berechnen.

Für Werte, die sich sehr häufig ändern, wie zum Beispiel ein Zähler, der sich hunderte Male pro Minute aktualisiert, ist es am besten, die Daten auf Anwendungsebene im Speicher zu lassen und periodisch neue Zeilen in Cloud Bigtable zu schreiben.

Hash-Werte

Wie oben erwähnt, wurde in einer früheren Version dieser Seite empfohlen, Hash-Werte in Zeilenschlüsseln zu verwenden. Wir empfehlen diese Vorgehensweise nicht mehr. Dabei entstehen Zeilenschlüssel, die effektiv keine Aussagekraft haben, was die Problembehebung bei Cloud Bigtable mit dem Key Visualizer-Tool erschwert.

Verwenden Sie für Nutzer lesbare Werte anstelle von Hash-Werten. Wenn Ihr Zeilenschlüssel mehrere Werte enthält, trennen Sie diese mit Trennzeichen.

Spaltenfamilien und Spaltenqualifizierer

In diesem Teil finden Sie eine Anleitung zur Behandlung von Spaltenfamilien und -qualifizierern in Ihrer Tabelle.

Spaltenfamilien

In Cloud Bigtable können Sie anders als in HBase bis zu etwa 100 Spaltenfamilien verwenden, ohne dass dadurch die Leistung beeinträchtigt wird. Daher hat es sich bewährt, die aufeinander bezogenen Werte einer Zeile in die gleiche Spaltenfamilie zu gruppieren. Sie haben dadurch die Möglichkeit, anstelle aller Daten jeder Zeile Daten einer einzelnen Familie oder mehrerer Familien abzufragen. Gruppieren Sie Daten so nah wie möglich beieinander, um in Ihren häufigsten API-Aufrufen genau die Informationen zu erhalten, die Sie brauchen, aber nicht mehr.

Außerdem sollten die Namen Ihrer Spaltenfamilien kurz sein, weil sie Bestandteil der Daten sind, die mit jeder Anfrage übertragen werden.

Spaltenqualifizierer

Da Cloud Bigtable-Tabellen "Sparse Tables" sind, können Sie so viele Spaltenqualifizierer pro Zeile erstellen, wie Sie brauchen. Durch leere Zellen entsteht kein Speicherplatznachteil. Daher ist es oft sinnvoll, Spaltenqualifizierer als Daten zu behandeln. Wenn Ihre Tabelle beispielsweise Nutzerbeiträge enthält, könnten Sie die eindeutige ID des jeweiligen Beitrags als Spaltenqualifizierer verwenden.

Entsprechend sollten Sie Ihre Daten auf so wenig Spaltenqualifizierer wie möglich aufteilen, da es ansonsten viele Zeilen mit einer großen Anzahl nicht leerer Zellen geben kann. Cloud Bigtable benötigt Zeit für die Verarbeitung der einzelnen Zellen in einer Zeile. Außerdem bedeutet jede Zelle eine zusätzliche Datenmenge, die in der Tabelle gespeichert und über das Netzwerk gesendet wird. Wenn Sie beispielsweise 1 KB (1.024 Byte) Daten speichern, ist es sehr viel platzsparender, diese Daten in einer einzelnen Zelle zu speichern als in 1.024 Zellen mit jeweils 1 Byte. Wenn Sie normalerweise mehrere zusammenhängende Werte gleichzeitig lesen oder schreiben, speichern Sie diese Werte besser gemeinsam in einer Zelle. Verwenden Sie dazu ein Format, in dem sich die einzelnen Werte später problemlos extrahieren lassen (z. B. das binäre Protokollpufferformat).

Ebenso empfiehlt es sich, kurze Namen für die Spaltenqualifizierer zu verwenden, um die übertragene Datenmenge pro Anfrage zu reduzieren.

Tabellendesign

Große Tabellen

Cloud Bigtable hat eine Höchstgrenze von 1.000 Tabellen pro Instanz. In den meisten Fällen sollten Sie weitaus weniger Tabellen haben. In anderen Datenbanksystemen entscheiden Sie sich möglicherweise, Daten basierend auf dem Thema und der Anzahl der Spalten in mehreren Tabellen zu speichern. In Cloud Bigtable sollten Sie jedoch alle Ihre Daten in einer großen Tabelle speichern. Sie weisen jedem Datensatz ein eindeutiges Zeilenschlüsselpräfix zu, sodass Cloud Bigtable die zugehörigen Daten in einem zusammenhängenden Bereich speichert, den Sie dann nach Zeilenschlüsselpräfix abfragen können.

Von der Erstellung vieler kleiner Tabellen wird in Cloud Bigtable aus verschiedenen Gründen abgeraten:

  • Das Senden von Anfragen an viele verschiedene Tabellen kann den Aufwand der Back-End-Verbindung erhöhen, was zu einem Anstieg der Extremwert-Latenz führt.

  • Mehrere Tabellen in verschiedenen Größen können das Load-Balancing im Hintergrund stören, das für die Leistungsfähigkeit von Cloud Bigtable sorgt.

Weitere Informationen