Was ist ein Blob Storage und wofür brauche ich so etwas?

Blobs speichern in der Cloud
Kommentare

Mit dem Azure Blob Storage bietet Microsoft einen Speicher für unstrukturierte Daten, wie zum Beispiel große Text- oder Binärdateien (Binary Large Objects), der zentrale Dateizugriffe für mehrere Rollen ermöglicht. Kurz gesagt, ich betrachte den Blob Storage gerne als eine Art „Lumpensammler“, in dem alles abgelegt werden kann, was nicht in ein relationales System passt. In diesem Artikel möchte ich den Speicher und seine Zugriffsmöglichkeiten mittels C# ein wenig näher bringen.

Cloud Computing bietet eine Vielzahl an neuen Möglichkeiten zum Betreiben von Anwendungen. So stellen die verschiedenen Anbieter ein kaum noch überschaubares Angebot zur Verfügung, um Daten, Services etc. sicher in der Cloud zu speichern.

Mit Azure bietet Microsoft eine Cloud-Plattform, die sowohl als Infrastructure as a Service als auch als Platform as a Service anzusehen ist. Mit den zur Verfügung gestellten Diensten können Anwendungen individuell nach eigenen Wünschen erstellt, verwaltet und bereitgestellt werden. Microsoft garantiert hierbei eine Verfügbarkeit von 99 Prozent.

Ein Vorteil von Microsoft Azure liegt in der Möglichkeit, Systeme bedarfsgerecht skalieren zu können. So können Ressourcen jederzeit an den momentanen Bedarf angepasst werden. Um es Entwicklern zu ermöglichen, das Beste aus beiden Welten (Cloud und On Premise) zusammenzufügen und so IT-Optionen zu optimieren, legt Microsoft zudem Wert darauf, dass auch Hybridlösungen möglich sind. Mit dem Azure Storage stellt Microsoft einen sicheren, hochverfügbaren, haltbaren, gut skalierbaren und vor allem leicht zugänglichen Speicher in der Cloud zur Verfügung. Mittels diesem ist es möglich, sowohl kleine Datenmengen, die Sie beispielsweise für Ihre Vereinshomepage benötigen, aber auch mehrere Terabytes große Szenarien zu speichern, ohne sich dabei um die Infrastruktur kümmern zu müssen. Bezahlt wird dabei das tatsächlich in Anspruch genommene Datenvolumen.

Der Storage ist von mobilen und Desktopanwendungen aus erreichbar und unterstützt mehrere Betriebssysteme sowie eine Vielzahl von Programmiersprachen, wie bspw. C# oder Java. Grundsätzlich ist der Azure Storage in drei Bereiche unterteilt:

  1. Table Storage: Speichern von strukturierten Datensätzen auf NoSQL-Basis.
  2. Queues: Mit einer Queue wird ein Zwischenspeicher bezeichnet, der Nachrichten aufnehmen kann und diese zur weiteren Verwendung zur Verfügung stellt. Den interessierten Leser möchte ich an dieser Stelle auf meinen Artikel in der Januarausgabe [1] verweisen.
  3. Blob Storage: Mit diesem werden wir uns im Folgenden genauer auseinandersetzten.

Der Blob Storage dient in erster Linie zur Speicherung unstrukturierter Daten, egal in welcher Form diese vorliegen. Dabei kann von überall mittels HTTP oder HTTPS auf diese Daten zugegriffen werden. So sind Blobs in Azure über das folgende URL-Format adressierbar: http://<storage account>.blob.core.windows.net/<container>/<blob>.

Abb. 1: Das Konzept des Blob-Speichers

Abb. 1: Das Konzept des Blob-Speichers

Abbildung 1 zeigt Anhand eines Beispiels den wesentlichen Aufbau eines Blob Storages. Dieser umfasst im Wesentlichen die folgenden drei Komponenten:

  1. Über den Account bzw. das Speicherkonto erfolgen alle Zugriffe.
  2. Ein Container dient in erster Linie der Gruppierung eines Satzes von Blobs. Dabei ist es zwingend erforderlich, dass sich ein Blob innerhalb eines solchen Containers befindet. Bei der Benennung von Containern sind folgende Regeln zu beachten:
    1. Der Name des Containers muss mindestens drei, jedoch höchstens 63 ausschließlich klein geschriebene Zeichen lang sein.
    2. Die Containernamen müssen zwingend mit einer Zahl oder einem Buchstaben beginnen. Danach können Bindestriche (-) verwendet werden. Allerdings darf dieser nicht das letzte Zeichen in der Zeichenkette sein.
  3. Bei einem Blob handelt es sich um eine Datei eines beliebigen Typs und einer nahezu beliebigen Größe. Hierbei wird zwischen zwei verschiedenen Typen unterschieden: den Block-Blobs und den Page-Blobs. Beide Typen verfügen über vollkommen unterschiedliche Eigenschaften. Block-Blobs werden verwendet, wenn Sie die Inhalte streamen möchten. Page-Blobs sind die bessere Wahl, wenn sehr viele Schreibzugriffe auf dem Blob auszuführen sind. Wer sich genauer mit den Unterschieden zwischen den beiden Blob-Arten befassen möchte, kann das hier tun. Der Name eines Blobs muss zwischen einem und maximal 1 024 Zeichen lang sein. Da es sich in den meisten Fällen um Block-Blobs handelt, gehen wir im Folgenden, wenn von Blobs gesprochen wird, immer von einem Block-Blob aus. Bei Blobs gibt es grundsätzlich keine Unterverzeichnisse. Der Container ist die einzige zur Verfügung stehende Ebene. Allerdings gibt es einen Trick, um weitere Verzeichnisebenen simulieren zu können. Da der Slash (/) ein zulässiges Zeichen im Blob-Namen ist, können so durch entsprechende Benennung Unterverzeichnisse der Blobs simuliert werden.

Erstellen eines Speicherkontos

Um den Azure Storage verwenden zu können, wird ein Speicherkonto benötigt. Dazu müssen Sie sich zunächst im Azure-Portal anmelden. Wie Sie eine kostenlose Testversion einrichten, können sie hier nachlesen. Nach dem erfolgreichen Anmelden im Azure-Portal kann mit der Einrichtung des Speicherkontos begonnen werden.

Dazu klicken Sie im Navigationsbereich auf NEU, dann auf Data + Storage und anschließend auf Storage. Jetzt haben Sie die Möglichkeit, Ihr Speicherkonto einzurichten.

Im Eingabefeld Storage geben Sie einen Namen der Subdomain ein, unter der Ihr Speicherkonto laufen soll. Der Eintrag muss eine Mindestlänge von drei Zeichen haben. Die maximale Anzahl der Zeichen liegt bei 24. Es können kleingeschriebene Buchstaben sowie Ziffern verwendet werden.

Anschließend kann ausgewählt werden, in welchem Standort der Speicher eingerichtet werden soll. Ich würde an dieser Stelle immer einen der europäischen Standorte wählen. Aufgrund der derzeitigen Datenschutzdiskussionen möchte ich auf die Datenschutzrichtlinien von Microsoft hinweisen. Diese sind im Microsoft-Azure-Vertrauenscenter zu finden. Zum Entstehungszeitpunkt dieses Artikels verfügt Microsoft über zwei Azure-Rechenzentren in Europa: Nordeuropa (Dublin) und Westeuropa (Amsterdam). Unter Preisstufe können Sie auswählen, wie Ihre Replikate, die um die Hochverfügbarkeit zu gewährleisten von Microsoft automatisch erstellt werden, angelegt werden können. Für unsere Spielwiese reicht die Preisstufe „Lokal redundant“, d. h., es werden drei Replikate im gleichen Datacenter abgelegt, was vollkommen ausreichend ist.

Den Bereich Abonnement sowie den Bereich Ressourcengruppe und Diagnose brauchen wir nicht anzupassen.

Durch Drücken des Buttons Erstellen erfolgt die Einrichtung des Storages. Dies kann einige Minuten in Anspruch nehmen. Sofern der Haken bei auf Startseite anzeigen gesetzt wurde, wird der Storage auf der Hauptseite angezeigt.

Das war zunächst alles, was für die Einrichtung eines Speicherkontos in Azure zu konfigurieren ist.

Konfiguration der Verbindung zum Blob Storage

Grundsätzlich gibt es verschiedene Möglichkeiten der Konfiguration. Welche Variante gewählt wird, hängt im Wesentlichen vom geplanten Projekt ab. In diesem Artikel möchte ich zeigen, wie die Konfiguration eines Projekts, das nicht in der Cloud gehostet wird, am sinnvollsten eingerichtet wird.

Als einfachste Variante eines solchen Beispiels betrachten wir eine Konsolenanwendung. Zu diesem Zweck erstellen wir in Visual Studio 2013 eine neue (Konsolen-)Anwendung (ich habe diese AzureBlobLabor genannt).

Wir passen die Konfigurationsdatei (app.config oder web.config) an, indem der Connection-String für den Azure-Account hinzufügt wird.

Listing 1

<configuration>
   <appSettings>
      <add key="StorageConnectionString" 
      value="DefaultEndpointsProtocol=https;
      AccountName=account-name;AccountKey=account-key" />
   </appSettings
</configuration>

Nachdem diese Schritte erfolgreich ausgeführt wurden, müssen wir doch noch einmal in das Azure-Portal gehen. Um das Speicherkonto, in dem wir den Blob Storage einrichten möchten, festlegen zu können, ist im Portal in den Speicherbereich zu wechseln. Die einfachste Möglichkeit, um an die Zugangsdaten zu gelangen, erfolgt über einen Klick auf den oben genannten Shortcut auf der Startseite. Durch einen Klick auf das Schlüsselsymbol, werden die benötigten Informationen eingeblendet (Abb. 2).

Abb. 2: Speicherkontoname

Abb. 2: Speicherkontoname

Als Accountname wird der Speicherkontoname eingetragen – ich habe ihn sobiesstorage genannt. Damit der Account-Key gesetzt werden kann, wird der primäre Zugriffsschlüssel verwendet. Dieser kann jederzeit neu generiert werden, sodass er, falls nötig, auch ausgetauscht werden kann. Der fertige Connection-String sollte in etwa der Form aus Listing 2 entsprechen.

Listing 2

<configuration>
  <appSettings>
    <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=sobiestorage;AccountKey=PU3ZqsmL7LIQZWkSWKno0odKop2SXz1GAEnTdEhHJE7YovzVPH8Ss1z3oz13a2Jo3wHvl5ifZ/C4Mvh6rPH53w==" />
  </appSettings>
</configuration>

In den nun folgenden Schritten soll der programmatische Zugriff auf einen Blob realisiert werden. Um überhaupt auf Azure zugreifen zu können, ist dem Projekt die Microsoft.WindowsAzure.Storage.dll hinzuzufügen.

Benötigte Assembly hinzufügen

Der einfachste Weg zur Installation der benötigten dlls ist, das Azure-Storage-Paket über NuGet zu installieren. Mittels Rechtsklick auf die Solution im Explorer und durch Auswahl von NuGet Pakete verwalten öffnet sich der Installationsmanager. Im Suchfeld (oben rechts) kann nach Windows.Azure.Storage gesucht werden. Anschließend ist dieses Paket zu installieren. Nach der erfolgreichen Installation steht der Namespace in dem Projekt zur Verfügung. Die dll ist allerdings auch im Azure-SDK für .NET enthalten. Diese steht hier zum Download zur Verfügung.

Die Namespace-Deklaration

Endlich kommen wir dazu, ein paar Zeilen Code zu schreiben und fügen dem Programm die folgenden Namespaces hinzu:

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

Sollten die Namespaces nicht zur Verfügung stehen, überprüfen Sie bitte, ob die Microsoft.Windows.Azure.Storage.dll im Projekt referenziert ist. Sollte die Installation über NuGet ausgeführt worden sein, sollte die Referenz jedoch automatisch gesetzt sein.

Auslesen des Connection-Strings

Das Auslesen des Connection-Strings aus der app. bzw. web.config ist, wie sicherlich den meisten schon bekannt, über den ConfigurationManager möglich. Dazu ist die entsprechende Referenz (System.Configuration.dll) dem Projekt hinzuzufügen. Dass der Namespace entsprechend einzubinden ist, sollte sich von selbst verstehen (using System.Configuration).

In dem Beispiel sollte der hinzugefügte Code Listing 3 entsprechen.

Listing 3

using System.Configuration;
…
CloudStorageAccount storageAccount = CloudStorageAccount
.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);

Einen Container erzeugen

Wie bereits oben erwähnt, muss jeder Blob in einem Conatiner liegen. Im Beispiel (Listing 4) wird ein solcher Container erzeugt, sofern er nicht bereits existiert.

Listing 4

// Auslesen des Connection-Strings
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Erzeugen des Blob-Clients.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Erzeugen einer Referenz eines Containers mit dem Namen 'meincontainer' 
CloudBlobContainer container = blobClient.GetContainerReference("meincontainer");

// Erzeuge den Container, falls dieser noch nicht existiert.
container.CreateIfNotExists();

Standardmäßig sind Container im Azure-Speicher als privat deklariert. Mithilfe der folgenden Codezeilen kann der Container für alle Benutzer sichtbar gemacht werden:

container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });

Auf diese Weise kann jeder Anwender, der den URI des Containers kennt, diesen einsehen. Das Löschen und Modifizieren der Daten ist jedoch nur möglich, wenn der Zugangsschlüssel bekannt ist.

Blob in einen Container laden

Im Folgenden werde ich darauf eingehen, wie es auf einfache Art und Weise möglich ist, einen Block-Blob in einen Container zu laden.

Listing 6

// Auslesen des Connection-Strings
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Erzeugen des Blob-Clients 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Erzeugen einer Referenz eines Containers mit dem Namen 'meincontainer'
CloudBlobContainer container = blobClient.GetContainerReference("meincontainer");

// Erzeugen einer Referenz eines Blobs mit dem Namen 'meinBlob'
CloudBlockBlob blockBlob = container.GetBlockBlobReference("meinBlob");

// Erstellen bzw. Überschreiben des Blobs mit einer Datei
using (var fileStream = System.IO.File.OpenRead(@"path\myfile"))
{
    blockBlob.UploadFromStream(fileStream);
}

Listing 6 zeigt, wie ein Blob in einen Container mit dem Namen meincontainer hochgeladen wird. Zunächst wird eine Referenz auf den Container, in dem der Blob gespeichert werden soll, benötigt. Anschließend wird eine Referenz für einen neuen Blob mit dem Namen meinBlob erzeugt. Mittels der Methode UploadStream kann nun jeder beliebige Stream in den Blob geladen werden. Dabei wird dieser, sofern er noch nicht existiert, erzeugt bzw. überschrieben.

Alle Blobs im Container auflisten

Um alle Blobs eines Containers auflisten zu können, benötigen wir zunächst die Referenz auf den Container. Anschließend kann man mit der Methode ListBlobs die Blobs und/oder die Verzeichnisse (wir erinnern uns daran, dass virtuell eine Verzeichnisstruktur auf einem Container aufgebaut werden kann) auflisten. Listing 7 zeigt eine Möglichkeit, wie den URI jedes Elements in einem Container Namens meincontainer aufzulisten.

Listing 7

// Auslesen des Connection-Strings
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Erzeugen des Blob-Clients.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Erzeugen einer Referenz eines Containers mit dem Namen 'meincontainer'
CloudBlobContainer container = blobClient.GetContainerReference("meincontainer");

// Schleife über alle Elemente im Container
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
  if (item.GetType() == typeof(CloudBlockBlob))
  {
    CloudBlockBlob blob = (CloudBlockBlob)item;

      Console.WriteLine("Block blob der Länge {0}: {1}", blob.Properties.Length, blob.Uri);

  }
  else if (item.GetType() == typeof(CloudPageBlob))
  {
    CloudPageBlob pageBlob = (CloudPageBlob)item;

    Console.WriteLine("Page blob der Länge {0}: {1}", pageBlob.Properties.Length, pageBlob.Uri);

  }
  else if (item.GetType() == typeof(CloudBlobDirectory))
  {
    CloudBlobDirectory directory = (CloudBlobDirectory)item;

    Console.WriteLine("Directory: {0}", directory.Uri);
  }
}

Das Ergebnis könnte dann beispielsweise folgende Form haben:

Bild01.jpg
2015/Spanien/Bild01.jpg
2015/Spanien/Bild02.jpg
2015/Spanien/Bild03.jpg
2015/Spanien/Buchung.pdf

Blob downloaden

Um Blobs vom Speicher laden zu können, wird als Erstes eine Referenz auf den Container benötigt. Weiterhin wird eine Referenz auf den zu ladenden Blob benötigt. Anschließend kann der Blob mit der DownloadToStream-Methode in einen fileStream geschrieben werden. Der Code für den Download eines Blobs wird in Listing 8 dargestellt.

Listing 8

// Auslesen des Connection-Strings 
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Erzeugen des Blob-Clients. 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Referenz auf den Container mit dem Namen 'meincontainer' 
CloudBlobContainer container = blobClient.GetContainerReference("meincontainer");

// Erzeugen einer Referenz eines Blobs mit dem Namen 'foto1.jpg'
CloudBlockBlob blockBlob = container.GetBlockBlobReference("foto1.jpg");

// Speichern des Blob-Inhalts in eine Datei
using (var fileStream = System.IO.File.OpenWrite(@"path\myfile"))
{
  blockBlob.DownloadToStream(fileStream);
}

Löschen eines Blobs

Die Vorgehensweise beim Löschen eines Blobs entspricht im Wesentlichen den oben genannten Vorgängen. Die Routine zum Löschen eines Blobs ist in Listing 9 erläutert.

Listing 9

// Auslesen des Connection-Strings 
CloudStorageAccount storageAccount = CloudStorageAccount.Parse( CloudConfigurationManager
  .GetSetting("StorageConnectionString"));

// Erzeugen des Blob-Clients. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Referenz auf den Container mit dem Namen 'meincontainer' 
CloudBlobContainer container = blobClient.GetContainerReference("meinContainer ");

// Referenz auf den Blob mit dem Namen 'meinblob.txt'
CloudBlockBlob blockBlob = container.GetBlockBlobReference("meinblob.txt");

// Löschen des Blobs
blockBlob.Delete();

Tools zur Blob-Verwaltung

Beim Ausführen des Codes ist nicht zu erkennen, was wirklich passiert ist. Im besten Fall wird eine Nachricht auf der Konsole angezeigt, dass das Programm fehlerfrei durchgelaufen ist. Wir wollen aber wissen, ob dies wirklich der Fall ist und die gewünschte Änderung auf dem Storage ausgeführt wurde. Zu diesem Zweck gibt es verschiedene Tools, mit deren Hilfe es möglich ist, den Blob Stroage sichtbar zu machen. Im Folgenden möchte ich kurz auf eines der vielen Freewaretools eingehen und den Azure Explorer vorstellen. Dieser kann hier kostenfrei heruntergeladen werden. Das UI des Azure Explorers ist stark an das des Windows Explorers angelehnt. Neben den lokalen Laufwerken kann auch der Azure Storage eingebunden werden. Dafür muss lediglich per Rechtsklick auf Azure Storage Accounts geklickt und im Kontextmenü Add Account ausgewählt werden. Nachdem der Storage-Name (accountName) und der Zugangsschlüssel (accountKey) eingetragen wurden (Abb. 3), wird der Speicher zum Explorer hinzugefügt.

Ab. 3: Zugangsschlüssel eintragen

Ab. 3: Zugangsschlüssel eintragen

Anschließend kann der Speicher, wie aus dem Windows Explorer bekannt, verwendet werden. Die „virtuellen“ Ordner werden als vollwertige Ordner angezeigt.

Fazit

Mit dem Azure Storage stellt Microsoft ein einfaches Werkzeug zur Verfügung, um Daten abzulegen. Einmal eingerichtet, stellt der Zugriff auf den Speicher keine große Herausforderung mehr dar. Die Kosten, die für die Bereitstellung eines Speichers entstehen, sind überschaubar. Siehe hierzu [8]. Die Einsparmöglichkeiten bei den Wartungskosten machen die Mietkosten schnell wieder wett. Die Möglichkeit, Systeme zu skalieren und jederzeit zu starten und zu beenden, spricht eindeutig für den Weg in die Cloud. So ist es, wie oben gesehen, mittels Azure möglich, innerhalb von Minuten einen Blob Storage, aber auch beispielsweise eine Queue, bereitzustellen und genauso schnell ist diese auch wieder zu entfernen. Das Gleiche gilt zum Beispiel für Websites, SQL-Datenbanken, virtuelle Maschinen und vieles mehr.

Einen, wie ich finde, nicht zu vernachlässigenden Nachteil habe ich bei meinen Recherchen für diesen Artikel dann doch gefunden. So bietet der Azure Storage derzeit keine intuitive Möglichkeit, eine Sicherung seiner Daten durchzuführen. Der Azure Storage repliziert zwar die Daten automatisch und schützt so vor unerwarteten Hardwareausfällen, jedoch schützt dies z. B. nicht vor einem fehlerhaften Löschen meiner gespeicherten Daten. Ich vermisse eine einfache Möglichkeit, den eigenen Storage über das Portal auf einen zweiten unabhängigen Azure Storage zu kopieren. Am besten in Form eines automatischen Jobs, der die Sicherung zu einem vom Anwender festgelegten regelmäßigen Zeitraum ausführt. Diesen Service bietet heute jedes NAS-Laufwerk.

Für diejenigen, die kein MSDN-Abo haben, stellt Microsoft eine 30-Tage-Testversion zur Verfügung, in denen 150 Euro Guthaben verspielt werden können. Es lohnt sich in jedem Fall, sich mit dieser Thematik einmal auseinanderzusetzen.

Aufmacherbild: Macro detail of pile von Shutterstock / Urheberrecht: CobraCZ

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -