Cloud Storage ist ein in hohem Maße skalierbarer Dienst, der Technologie zur automatischen Skalierung verwendet, um sehr hohe Anforderungsraten zu erreichen. Auf dieser Seite sind Richtlinien zur Optimierung der Skalierung und Leistung von Cloud Storage aufgeführt.
Automatische Skalierung
Cloud Storage ist ein Multi-Tenant-Dienst, das heißt, die Nutzer teilen sich die gleichen zugrunde liegenden Ressourcen. Damit diese gemeinsam verwendeten Ressourcen optimal genutzt werden können, haben Buckets folgende anfängliche Eingangs-/Ausgangskapazität:
- Etwa 1.000 Schreibanfragen für Objekte pro Sekunde, einschließlich des Hochladens, Aktualisierens und Löschens von Objekten Beachten Sie, dass Cloud Storage auch ein kleineres Limit für wiederkehrende Schreibvorgänge auf denselben Objektnamen hat.
- Etwa 5.000 Leseanfragen für Objekte pro Sekunde, einschließlich des Auflistens von Objekten sowie des Lesens von Objektdaten und Objektmetadaten
Diese anfänglichen Lese- und Schreibraten ergeben im Durchschnitt 2,5 PB an Schreib- und 13 PB an Leseanfragen für 1 MB an Objekten pro Monat. Mit zunehmender Anfragerate für einen bestimmten Bucket erhöht Cloud Storage automatisch die Eingangs-/Ausgangskapazität für diesen Bucket. Dazu wird die Anfragelast auf mehrere Server verteilt.
Lastenumverteilungszeit
Wenn sich ein Bucket dem Maximum seiner Eingangs/-Ausgangskapazität nähert, erkennt Cloud Storage dies normalerweise innerhalb von Minuten und verteilt die Last entsprechend auf mehr Server. Folglich ergeben sich möglicherweise vorübergehende Einschränkungen, wenn sich die Anforderungsrate für Ihren Bucket schneller erhöht als Cloud Storage diese Umverteilung vornehmen kann. Insbesondere sind eine höhere Latenzzeit und Fehlerrate zu erwarten. Wie unten beschrieben lassen sich durch eine schrittweise Erhöhung der Anforderungsrate für Ihre Buckets derartige Latenzzeiten und Fehlerraten vermeiden.
Objektschlüsselindexierung
Cloud Storage unterstützt eine einheitliche Objektauflistung, sodass Nutzer problemlos Datenverarbeitungsabläufe über Cloud Storage ausführen können. Um eine einheitliche Objektauflistung zu erreichen, wird von Cloud Storage für jeden Bucket ein Index an Objektschlüsseln verwaltet. Dieser Index ist in lexikografischer Reihenfolge hinterlegt und wird immer dann aktualisiert, wenn Objekte in einen Bucket geschrieben oder von diesem gelöscht werden. Das Hinzufügen und Löschen von Objekten, deren Schlüssel innerhalb eines kleinen Indexbereichs liegen, führt zu einem höheren Konfliktrisiko.
Cloud Storage erkennt solche Konflikte, auch Hotspotting genannt, und verteilt die Last des betroffenen Indexbereichs automatisch auf mehrere Server. Ähnlich wie bei der Skalierung der Eingangs-/Ausgangskapazität eines Buckets sollten Sie beim Zugriff auf einen neuen Indexbereich, beispielsweise wenn Objekte mit einem neuen Präfix geschrieben werden, die Anforderungsrate wie unten beschrieben schrittweise erhöhen. Andernfalls können vorübergehend höhere Latenzzeiten und Fehlerraten auftreten.
Best Practices
Die folgenden Abschnitte enthalten Best Practices zum Erhöhen der Anforderungsrate, zur Auswahl der Objektschlüssel und zur Verteilung von Anfragen, um vorübergehende Einschränkungen bei Ihrem Bucket zu vermeiden. Neben diesen Überlegungen zu Buckets gibt es auch kombinierte Bandbreitenlimits, die für Buckets gelten, die sich am selben Standort und im selben Projekt befinden.
Anforderungsrate schrittweise erhöhen
Um sicherzustellen, dass die automatische Skalierung von Cloud Storage immer die beste Leistung bietet, sollten Sie Ihre Anforderungsrate für jeden Bucket, der seit mehreren Tagen nicht mit einer hohen Anforderungsrate genutzt wurde oder über einen neuen Bereich an Objektschlüsseln verfügt, schrittweise erhöhen. Wenn Ihre Anforderungsrate weniger als 1.000 Schreibanfragen oder 5.000 Leseanfragen pro Sekunde beträgt, ist keine Erhöhung erforderlich. Wenn Ihre Anforderungsrate diese Obergrenzen voraussichtlich überschreiten wird, sollten Sie mit einer Anforderungsrate beginnen, die unterhalb oder nahe dieser Obergrenzen liegt, und dann die Rate allmählich erhöhen, und zwar nicht schneller als mit einer Verdoppelung der Rate über einen Zeitraum von 20 Minuten.
Treten Probleme wie erhöhte Latenzzeiten und Fehlerraten auf, stoppen Sie zeitweise die Erhöhung oder verringern Sie vorübergehend die Anforderungsrate, um Cloud Storage mehr Zeit für die Skalierung Ihres Buckets zu geben. Sie sollten Ihre Anfragen in folgenden Fällen mit exponentiellem Backoff wiederholen:
- Sie erhalten Fehler mit den Antwortcodes
408
und429
. - Sie erhalten Fehler mit Antwortcodes vom Typ
5xx
.
Namenskonvention verwenden, mit der die Last gleichmäßig über die Schlüsselbereiche verteilt wird
Die automatische Skalierung eines Indexbereichs kann durch die Verwendung sequenzieller Namen, zum Beispiel Objektschlüsseln, die auf einer Reihe von Zahlen oder Zeitstempeln basieren, verlangsamt werden. Dies geschieht, weil Anfragen fortlaufend in einen neuen Indexbereich verschoben werden, wodurch die Umverteilung der Last schwieriger und weniger wirksam wird.
Um eine anhaltend hohe Anforderungsrate zu erreichen, sollten Sie keine sequenziellen Namen verwenden. Durch vollkommen zufällige Objektnamen erhalten Sie die beste Lastenverteilung. Falls Sie eine sequenzielle Nummerierung oder einen Zeitstempel als Teil Ihrer Objektnamen verwenden möchten, führen Sie für Ihre Objektnamen einen Zufallsfaktor ein, indem Sie vor der Sequenznummer oder dem Zeitstempel einen Hash-Wert einfügen.
Wenn die ursprünglichen Objektnamen, die Sie verwenden möchten, so aussehen:
my-bucket/2016-05-10-12-00-00/file1 my-bucket/2016-05-10-12-00-00/file2 my-bucket/2016-05-10-12-00-01/file3 ...
Dann können Sie den MD5-Hash des ursprünglichen Objektnamens berechnen und dem Objektnamen die ersten sechs Zeichen des Hash als Präfix hinzufügen. Der neue Objektname sieht so aus:
my-bucket/2fa764-2016-05-10-12-00-00/file1 my-bucket/5ca42c-2016-05-10-12-00-00/file2 my-bucket/6e9b84-2016-05-10-12-00-01/file3 ...
Ein längeres zufälliges Präfix bietet eine effektivere automatische Skalierung bei der Erhöhung auf sehr hohe Lese- und Schreibraten. Ein Präfix mit einem Zeichen, das einen zufälligen Hexadezimalwert verwendet, ermöglicht beispielsweise eine effektive automatische Skalierung von den ersten 5.000/1.000 Lese-/Schreibvorgängen pro Sekunde auf etwa 80.000/16.000 Lese-/Schreibvorgänge pro Sekunde, denn das Präfix hat 16 potenzielle Werte. Wenn Ihr Anwendungsfall keine höheren Raten erfordert, kann ein zufälliges Präfix mit einem (1) Zeichen beim Erhöhen der Anforderungsraten genauso effektiv sein wie ein zufälliges Präfix mit zwei oder mehr Zeichen.
Zufälligkeit nach einem gemeinsamen Präfix ist unter dem Präfix wirksam
Beachten Sie, dass der zufällig erstellte String nicht unbedingt am Anfang des Objektnamens stehen muss. Das Hinzufügen eines zufälligen Strings nach einem gemeinsamen Präfix ermöglicht ebenfalls eine automatische Skalierung. Die Wirkung ist jedoch auf dieses Präfix beschränkt, ohne dass der Rest des Buckets berücksichtigt wird.
Beispiel:
my-bucket/images/animals/4ce4c6af-6d27-4fa3-8a91-5701a8552705/1.jpg my-bucket/images/animals/9a495e72-1d85-4637-a243-cbf3e4a90ae7/2.jpg ... my-bucket/images/landscape/585356ac-ce89-47a8-bdd2-78a86b58fee6/1.jpg my-bucket/images/landscape/2550ae5b-395e-4243-a29b-bbf5aece60ef/2.jpg ... my-bucket/images/clouds/1.jpg my-bucket/images/clouds/2.jpg ...
Die oben aufgeführte Benennung ermöglicht eine effiziente automatische Skalierung der Objekte in images/animals
und images/landscape,
, jedoch nicht in images/clouds
.
Zufälligkeit nach sequentiellen Präfixen ist weniger wirksam
Wie oben erwähnt, nützt die Verwendung eines nach dem Zufälligkeitsprinzip erstellten Strings nur bei der automatischen Skalierung unter diesem Präfix. Sobald die Anfragen zu einem neuen Präfix verschoben werden, profitieren Sie möglicherweise nicht mehr von den vorherigen automatischen Skalierungseffekten. Das ist besonders dann ein Problem, wenn die Präfixe einem sequentiellen Muster folgen.
Hier ein Beispiel, wenn Sie stündlich Dateien unter einem neuen zeitstempelbasierten Präfix schreiben:
my-bucket/2016-05-10-00/cf9a7b95-0d2e-4466-9596-840ff388ddbd my-bucket/2016-05-10-00/f1e16a88-16b8-4c66-ba66-a225c87be80c my-bucket/2016-05-10-00/646d8272-4a88-4dc2-b2d4-d537c778df41 ... my-bucket/2016-05-10-01/bdcba6de-ac25-4c27-8550-0d08f249e69d my-bucket/2016-05-10-01/a32c867c-09a9-4d65-9668-ddd4ebe4138b my-bucket/2016-05-10-01/d619485c-5243-4a4e-8ef3-0f7e1d26ce1d ...
Obwohl die automatische Skalierung dazu beiträgt, die Schreibrate unter einem Präfix mit der Zeit zu erhöhen, wird die Rate zu Beginn jeder Stunde zurückgesetzt. Dies führt zu einer suboptimalen Schreibrate und einer periodischen Erhöhung der Latenz und Fehlerrate. Wenn Sie im Laufe der Zeit in verschiedene Präfixe schreiben müssen, müssen Sie darauf achten, dass die neuen Präfixe gleichmäßig über den gesamten Schlüsselbereich verteilt sind, damit dieses Problem vermieden wird.
Bulk-Vorgänge zur gleichmäßigen Lastverteilung über Schlüsselbereiche neu ordnen
Manchmal möchten Sie mit Ihren Daten in Cloud Storage einen Bulk-Upload oder -Löschvorgang durchführen. In beiden Fällen haben Sie möglicherweise keine Kontrolle über die Objektnamen. Sie können jedoch die Reihenfolge festlegen, in der die Objekte hochgeladen oder gelöscht werden, um die höchstmögliche Schreib- oder Löschrate zu erreichen.
Dazu müssen Sie die Uploads oder Löschvorgänge auf mehrere Präfixe verteilen. Wenn beispielsweise jeder Ordner, den Sie hochladen möchten, viele Unterordner und Dateien enthält, ist es ratsam, einen parallelen Upload aus mehreren Ordnern durchzuführen und zufällig auszuwählen, welche Ordner und Dateien hochgeladen werden. Dadurch kann das System die Last gleichmäßiger über ganze Schlüsselbereiche verteilen. Somit erreichen Sie nach der ersten Erhöhung eine hohe Anfragerate.
Nächste Schritte
- Kontingente und Limits für Cloud Storage
- Empfohlene Wiederholungsstrategie für Anfragen an Cloud Storage