Ist es besser, viele kleine Azure-Speicher-Blob-Container (jeweils mit einigen Blobs) oder einen wirklich großen Container mit Tonnen von Blobs zu haben?


80

Das Szenario ist also das folgende:

Ich habe mehrere Instanzen eines Webdienstes, der einen Datenblock in Azure Storage schreibt. Ich muss in der Lage sein, Blobs in einem Container (oder einem virtuellen Verzeichnis) zu gruppieren, je nachdem, wann sie empfangen wurden. Hin und wieder (im schlimmsten Fall jeden Tag) werden ältere Blobs verarbeitet und dann gelöscht.

Ich habe zwei Möglichkeiten:

Option 1

Ich mache einen Container namens "Blobs" (zum Beispiel) und speichere dann alle Blogs in diesem Container. Jeder Blob verwendet einen Verzeichnisstilnamen, wobei der Verzeichnisname der Zeitpunkt ist, zu dem er empfangen wurde (z. B. "hr0min0 / data.bin", "hr0min0 / data2.bin", "hr0min30 / data3.bin", "hr1min45 / data.bin" ", ...," hr23min0 / dataN.bin "usw. - alle X Minuten ein neues Verzeichnis ). Das Ding, das diese Blobs verarbeitet, verarbeitet zuerst hr0min0-Blobs, dann hr0minX usw. (und die Blobs werden bei der Verarbeitung noch geschrieben).

Option 2

Ich habe viele Container mit einem Namen, der auf der Ankunftszeit basiert (also zuerst ein Container mit dem Namen blobs_hr0min0, dann blobs_hr0minX usw.), und alle Blobs im Container sind die Blobs, die zur angegebenen Zeit angekommen sind. Das Ding, das diese Blogs verarbeitet, verarbeitet jeweils einen Container.

Meine Frage ist also, welche Option ist besser? Gibt mir Option 2 eine bessere Parallelisierung (da sich ein Container auf verschiedenen Servern befinden kann) oder ist Option 1 besser, weil viele Container andere unbekannte Probleme verursachen können?

Antworten:


59

Ich denke nicht, dass es wirklich wichtig ist (aus Sicht der Skalierbarkeit / Parallelisierung), da die Partitionierung im Win Azure-Blobspeicher auf Blob-Ebene und nicht auf Container erfolgt. Gründe für die Verteilung auf verschiedene Container haben mehr mit der Zugriffskontrolle (z. B. SAS) oder der Gesamtspeichergröße zu tun.

Weitere Informationen finden Sie hier: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/05/10/windows-azure-storage-abstractions-and-their-scalability-targets.aspx

(Scrollen Sie nach unten zu "Partitionen").

Zitat:

Blobs - Da der Partitionsschlüssel auf den Blob-Namen beschränkt ist, können wir den Zugriff auf verschiedene Blobs auf so viele Server verteilen, um den Zugriff auf diese zu skalieren. Auf diese Weise können die Container so groß werden, wie Sie es benötigen (innerhalb des Speicherplatzlimits des Speicherkontos). Der Nachteil ist, dass wir nicht die Möglichkeit bieten, atomare Transaktionen über mehrere Blobs hinweg durchzuführen.


Muss der Blob-Name so kurz wie möglich gehalten werden? (Ich habe "einen wirklich großen Container mit Tonnen von Blobs", Option 1 in der Frage.)
nmit026

59

Jeder hat Ihnen hervorragende Antworten gegeben, wenn Sie direkt auf Blobs zugreifen. Wenn Sie jedoch Blobs in einem Container auflisten müssen, werden Sie mit dem Modell mit vielen Containern wahrscheinlich eine bessere Leistung erzielen. Ich habe gerade mit einer Firma gesprochen, die eine große Anzahl von Blobs in einem einzigen Container aufbewahrt hat. Sie listen häufig die Objekte im Container auf und führen dann Aktionen für eine Teilmenge dieser Blobs aus. Sie sehen einen Leistungseinbruch, da die Zeit zum Abrufen einer vollständigen Liste immer länger geworden ist.

Dies gilt möglicherweise nicht für Ihr Szenario, ist jedoch zu berücksichtigen ...


1
Das ist ein guter Punkt. Zum Zeitpunkt des Schreibens (Juni 2016) gibt es meines Erachtens noch keine andere Möglichkeit, die Anzahl der Blobs in einem Container zu ermitteln, als eine Liste aller Blobs in diesem Container abzurufen und die CountEigenschaft der Liste zu überprüfen .
Steven Rands

Muss der Blob-Name so kurz wie möglich gehalten werden? (Ich habe "einen wirklich großen Container mit Tonnen von Blobs", Option 1 in der Frage.)
nmit026

Genau das Szenario, das wir vermeiden wollen
Glenit

20

Theoretisch sollte es keinen Unterschied zwischen vielen Containern oder weniger Containern mit mehr Blobs geben. Die zusätzlichen Container können als zusätzliche Sicherheitsgrenzen nützlich sein (z. B. für öffentlichen anonymen Zugriff oder andere SAS-Signaturen). Zusätzliche Container können auch das Housekeeping beim Beschneiden etwas vereinfachen (Löschen eines einzelnen Containers im Vergleich zum Zielen auf jeden Blob). Aus diesen Gründen verwende ich tendenziell mehr Container (nicht aus Gründen der Leistung).

Theoretisch sollten die Auswirkungen auf die Leistung nicht bestehen. Der Blob selbst (vollständige URL) ist der Partitionsschlüssel in Windows Azure (seit langer Zeit). Dies ist die kleinste Sache, die von einem Partitionsserver ausgeglichen wird. Sie könnten (und werden es oft tun) zwei verschiedene Blobs in demselben Container haben, die von verschiedenen Servern bereitgestellt werden.

Jeremy gibt an, dass zwischen mehr und weniger Containern ein Leistungsunterschied besteht. Ich habe mich nicht genug mit diesen Benchmarks befasst, um zu erklären, warum dies der Fall sein könnte, aber ich würde andere Faktoren (wie Größe, Testdauer usw.) vermuten, um etwaige Unstimmigkeiten zu erklären.


4

Es gibt noch einen weiteren Faktor, der dazu beiträgt. Preis!

Derzeit sind Operation List und Create Container zum gleichen Preis erhältlich: 0,054 US $ / 10.000 Anrufe

Der gleiche Preis gilt eigentlich für das Schreiben des Blobs.

Im Extremfall können Sie also viel mehr bezahlen, wenn Sie viele Container erstellen und löschen

  • Löschen ist kostenlos

Sie können den Rechner hier sehen: https://azure.microsoft.com/en-us/pricing/calculator/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.