Aus Linux-Magazin 03/2014

Riak CS als S3-kompatibler Cloudspeicher

© Chiya Li, 123RF.com

Amazons Onlinestorage-API S3 kann man auch ohne den Internetkonzern verwenden: Das freie Riak CS baut auf einer verteilten Datenbank auf und bringt flexiblen Cloudspeicher auf die eigenen Server.

Amazons Cloudstorage-Dienst S3 (Simple Storage Service) ist bei Website-Betreibern und SaaS-Anbietern beliebt. Beispielsweise speichern Tumblr und Pinterest ihre Bilddateien dort, und der Contentmanager Alfresco nutzt es ebenfalls. Ruby on Rails schickt mit der Erweiterung Paperclip Uploads nach S3, und der Amazon-Speicher kann sogar Apache-Hadoop-Dateisysteme für Analysen vorhalten. Es gibt kaum ein Framework, das nicht einen Adapter zu S3 anbietet.

Speichern ohne Amazon

Es gibt allerdings Szenarien, bei denen es nicht opportun ist, Daten auf Amazons Servern abzulegen. Dazu gehört der Umgang mit Business-kritischen Daten, die in der Firma bleiben sollen, sowie das Speichern von personenbezogenen Informationen, die das Land nicht verlassen dürfen. Für diese Fälle muss der Nutzer die Anwendung an eine alternative Lösung anpassen – oder er greift zu Riak CS (Cloud Storage, [1]). Die Apache-lizenzierte Software des US-Unternehmens Basho bildet einen Großteil der Funktionalität und der REST-Schnittstelle von S3 nach.

Mit Riak CS lassen sich aber nicht nur die Daten im Hause halten. Ein lokaler S3-artiger Speicher hilft auch Anwendungsentwicklern, denn sie haben den Server im Griff und können zum Beispiel Ausfälle simulieren. Zum Umstellen auf den Amazon-Dienst für den Produktiveinsatz reicht dann unter Umständen eine alternative Konfigurationsdatei.

Die Basis von Riak CS bildet Riak ([2], [3]), ein verteilter und hochverfügbarer Key-Value-Store, der große Datenmengen zum schnellen Zugriff bereithält und dem Ausfall einzelner Server trotzt. Diese Eigenschaften sowie einfache Administration, Skalierbarkeit und Unabhängigkeit von einem Masterserver sind auch für Dateispeicher wünschenswert.

Riak vereint eine Datenbank mit einem Peer-to-Peer-Netzwerk. Es legt die Daten nicht auf einem einzelnen Server ab, sondern verteilt sie bestmöglich über mehrere Rechner (Nodes) im Netzwerk. Dazu verwendet die Software ein Verfahren namens Consistent Hashing (konsistente Hashfunktion): Legt ein User unter dem Schlüssel »Essen« den Text »Salami-Pizza« ab, erzeugt Riak aus dem Schlüssel einen Hashwert. Dabei stellt es sicher, dass der Schlüssel im Zahlenraum von 0 bis 2160 – 1 liegt. Um die Daten gleichmäßig über den so genannten Ring zu verteilen, unterteilt es den Raum in eine feste Anzahl von Behältern, beispielsweise 32.

Betrachtet man eine Installation mit den Nodes A, B, C und D, so erhält jeder Server möglichst die gleiche Menge an Daten. Da die Schlüssel im Zahlenraum gleichmäßig verteilt sind, kann Riak die Behälter einfach nach dem Round-Robin-Prinzip den beteiligten Servern zuweisen: Jeder ist für 25 Prozent des Hashringes verantwortlich. Fällt beispielsweise der Hash von »Essen« in das erste Viertel, wird der Text auf Server A abgelegt.

Replikation

Das allein sorgt aber nicht für hohe Verfügbarkeit oder Datenredundanz. Um dem Ausfall von Servern zu widerstehen, repliziert Riak die Daten, legt also Kopien auf weiteren Servern ab. Es speichert die Daten nicht nur in jenem Behälter, der laut Hashfunktion dafür zuständig ist, sondern zusätzlich in den beiden folgenden. Durch die Verteilung der Behälter auf die vorhandenen Server befinden sich die Daten nun auf drei Servern, in Abbildung 1 liegt jedes Schlüssel-Daten-Paar von A auch als Kopie auf den Servern B und C. Die Verantwortung für die Daten obliegt damit nicht einem, sondern mehreren Servern. Fällt einer aus, sind die Daten nach wie vor verfügbar.

Abbildung 1: Riak verteilt die Daten mittels einer konsistenten Hashfunktion und speichert zusätzliche Sicherheitskopien auf mehreren Rechnern des Clusters.

Abbildung 1: Riak verteilt die Daten mittels einer konsistenten Hashfunktion und speichert zusätzliche Sicherheitskopien auf mehreren Rechnern des Clusters.

Je nachdem, welche Ansprüche der Anwender an Verfügbarkeit und Konsistenz stellt, kann er die Schreib- und Lese-Einstellungen von Riak anpassen. Im Standardsetup verteilt Riak alle Daten auf drei Server, diese Zahl ist der so genannte N-Value. Ein Schreibvorgang gilt als erfolgreich, wenn die Datenbank auf mindestens zwei dieser drei Rechner geschrieben hat, das regelt der W-Value. Ähnliches gilt für den Lesevorgang, hier beträgt der R-Value standardmäßig zwei. Weitere Hintergründe zu Riak vermittelt das englischsprachige Onlinedokument “A little Riak Book” (Abbildung 2, [4]).

Abbildung 2: "A Little Riak Book" macht die Prinzipien hinter der Datenbank anschaulich.

Abbildung 2: “A Little Riak Book” macht die Prinzipien hinter der Datenbank anschaulich.

Dezentral und skalierbar

Die beschriebene Architektur bringt neben der Ausfallsicherheit einen weiteren Vorteil: Wie auch S3 setzt Riak CS dem Wachstum der Datenmenge praktisch keine Grenzen. Wird der Speicherplatz auf den Servern knapp, dann lassen sich neue in den Ring integrieren, indem der Admin sie mit wenigen Befehlen hinzufügt. Für die passende Umverteilung von Daten und Last sorgt Riak durch Kommunikation zwischen den Knoten automatisch. Riak kann noch einen Schritt weiter gehen, denn Bashos proprietäre Erweiterung MDC (Multi Data Center) erlaubt es, den Speicher sogar über mehrere Rechenzentren zu verteilen, was Amazon bei S3 bisher nicht anbietet.

Riak CS besteht aus drei Komponenten, die der Admin einzeln installieren muss. Auf der untersten Ebene dient Riak selbst als Datenspeicher, daher kümmert sich Riak CS als Manager darum, wie die Daten abgelegt werden, und macht sie über das S3-API verfügbar. Obendrein sorgt die Komponente Stanchion für die Serialisierung bestimmter Anfragen. Riak CS dient also primär als API-Schicht oberhalb der Riak-Datenbank.

Alle Komponenten stehen für unterschiedliche Linux-Distributionen schon als fertige Pakete bereit. Die folgende Beschreibung bezieht sich auf Ubuntu 12.04 LTS, lässt sich aber auf andere Linuxe größtenteils übertragen. Die neuesten Pakete für Riak CS und Stanchion finden sich auf der Basho-Website [5], für Riak unter [6]. Die Installation erledigt Root per Paketmanager, bei Ubuntu mit »dpkg« :

dpkg -i riak_1.4.2-1_amd64.deb
dpkg -i riak-cs_1.4.3-1_amd64.deb
dpkg -i stanchion_1.4.3-1_amd64.deb

Damit sind die Hauptkomponenten von Riak CS installiert, als Nächstes konfiguriert der Admin sie für den Einsatz und legt Benutzerkonten an.

Konfiguration

Die Datenbank Riak erlaubt es, unterschiedliche Backends zu verwenden, die für die Persistenz der Daten auf der Festplatte sorgen, wobei jedes Vor- und Nachteile besitzt. Auch Riak CS nutzt diese Backends, um Metadaten, Rohdaten und Nutzer zu speichern. In der Riak-Konfiguration wählt der Admin die passenden aus. Dazu bearbeitet er die Datei »app.config« , die in der Programmiersprache Erlang formuliert ist. (Das Bearbeiten ist in der Datei dokumentiert, also auch ohne Erlang-Kenntnisse möglich.) Er ersetzt die bestehende Sektion »riak_kv« durch den Inhalt von Listing 1. Das aktiviert die von Riak CS benötigten Backends Eleveldb und Bitcask.

Listing 1

Backends in app.config aktivieren

01 {riak_kv, [
02           {add_paths, ["/usr/lib/riak-cs/lib/riak_cs-1.4.3/ebin"]},
03           {storage_backend, riak_cs_kv_multi_backend},
04           {multi_backend_prefix_list, [{<<"0b:">>, be_blocks}]},
05           {multi_backend_default, be_default},
06           {multi_backend, [
07             {be_default, riak_kv_eleveldb_backend, [
08               {max_open_files, 50},
09                 {data_root, "/var/lib/riak/leveldb"}
10           ]},
11             {be_blocks, riak_kv_bitcask_backend, [
12               {data_root, "/var/lib/riak/bitcask"}
13             ]}
14           ]},

Damit ist der Storage für Riak konfiguriert. Um außerdem dafür zu sorgen, dass die Riak-Instanz von außen erreichbar ist, ersetzt man in der Sektion »riak_api« den Wert »127.0.0.1« durch »0.0.0.0« :

{pb, [ {"0.0.0.0", 8087 } ]}

Jetzt steht Riak über alle vorhandenen Netzwerkschnittstellen zur Verfügung. Das ist fürs erste Einrichten praktisch, im Produktivbetrieb ist es jedoch meist sinnvoll, Riak nur an ein bestimmtes Interface zu binden. Im selben Teil der Konfiguration ist zudem »{pb_backlog, 64}« durch »{pb_backlog, 256}« zu ersetzen. Dies sorgt dafür, dass sich das Request Pooling von Riak CS passend zu Riak selbst verhält.

Damit ist die Riak-Konfiguration an sich abgeschlossen, allerdings beschränkt Ubuntu die Anzahl der geöffneten Dateien pro Programm auf 1024, was für eine umfangreiche Datenbank ungeeignet ist. Root setzt daher mit der folgenden Kommandozeile einen geeigneten Wert:

echo "ulimit -n 65536" > /etc/default/riak

Nun kann er Riak – wie unter Ubuntu gewohnt – mit »service riak start« als Dienst starten. In der Konfiguration von Riak CS ist ebenfalls die Netzwerkschnittstelle einzurichten. Das funktioniert analog zu Riak, jedoch in der Datei »/etc/riak-cs/app.config« . Standardmäßig lauscht Riak CS nun an Port »8080« , was sich bei Bedarf umkonfigurieren lässt.

Anfangs existiert kein User in Riak CS. Um einen anzulegen, aktiviert man die anonyme Einrichtung:

{anonymous_user_creation, true}

Auch für Riak CS ist es unter Ubuntu nötig, das Ulimit zu erhöhen und die Komponente via Upstart zu starten:

echo "ulimit -n 65536" > /etc/default/riak-cs
service riak-cs start

Zum Schluss startet Root den Stanchion-Dienst mit einem geeigneten Ulimit:

echo "ulimit -n 65536" > /etc/default/stanchion
service stanchion start

Dies schließt die Konfiguration von Riak CS ab. Zum Hinzufügen neuer Knoten in den Riak-Ring bringt die Software ein Kommandozeilentool mit, das dazu drei Schritte verwendet:

riak-admin cluster join Node@Server-IP
riak-admin cluster plan
riak-admin cluster commit

Der Cluster ist nun konfiguriert und bereit für den ersten User. Wie bei den meisten Interaktionen mit Riak CS erfolgt auch das Erzeugen neuer Nutzer via HTTP, also auch via »curl« in der Shell (Listing 2). Da das anonyme Anlegen von Usern aktiviert ist, lässt sich der Admin-Account einfach durch die Angabe einer E-Mail-Adresse und eines lesbaren Namens aktivieren. Das API gibt die passenden Logindaten zurück, die von S3 bekannten »KeyID« und »KeySecret« . Danach empfiehlt es sich, die Anonymous User Creation wieder zu deaktivieren.

Listing 2

User anlegen

01 curl -H 'Content-Type: application/json' -X POST http://localhost:8080/riak-cs/user \
02 --data '{"email":"admin@example.com", "name":"admin"}'

Der generierte User ist als Admin einsetzbar, wenn man seine »KeyID« und »KeySecret« für den Cluster sowohl in der »/etc/riak-cs/app.config« als auch in der »/etc/stanchion/app.config« konfiguriert:

{admin_key, "7BIEUBFQYSOBJYWAILC2"},
{admin_secret, "lWGZ3ejqLFblrJVxszPo3=="},

Dieser Benutzer darf alle Administrationsaufgaben übernehmen.

Daneben gibt es das optional installierbare Paket »riak_cs_control« [7], das eine Weboberfläche für die wichtigsten Features der Benutzerverwaltung einfach zugänglich macht (Abbildung 3).

Abbildung 3: Auf Wunsch gibt es zu Riak CS ein Web-basiertes Control Panel.

Abbildung 3: Auf Wunsch gibt es zu Riak CS ein Web-basiertes Control Panel.

Von Daten zu Dateien

Riak Cloud Storage setzt auf dem Key-Value-Store Riak auf, speichert statt Werten aber Dateien. Die Datenbank läuft am besten mit Werten, die zwischen 100 KByte und 1 bis 2 MByte groß sind. Um Binärobjekte mit Größen bis in TByte-Regionen zu speichern, zerteilt die Storagelösung diese in Chunks genannte kleine Bruchstücke, die standardmäßig 1 MByte umfassen. Diese schreibt es als Werte in die Datenbank.

Riak merkt sich in den Metadaten, welche Stücke zu welcher Datei gehören sowie deren Typ, die Zugriffsrechte und noch weitere Informationen. Dank der Eigenschaften der Datenbank Riak kommt das Speichersystem auf diese Weise automatisch auch in den Genuss von Verteilung und Hochverfügbarkeit. Fragt danach ein Client die Datei an, findet Riak CS die Metadaten, holt die Stücke aus der Datenbank und setzt sie schließlich wieder zusammen.

S3-API im Einsatz

Zudem ist Riak CS dafür zuständig, nach außen das S3-API von Amazon nachzubilden. Dank der bekannten Schnittstelle können Anwender die eigene Installation mit vielen S3-tauglichen Programmen nutzen, etwa mit dem Kommandozeilentool »s3cmd« [8]. Das GPL-lizenzierte Programm eignet sich auch zum Einbinden in Shellskripte und lässt sich unter Ubuntu mit Apt installieren.

Die Konfiguration beschränkt sich darauf, mit dem Tool den eigenen Riak-CS-Server aufzurufen statt Amazons. Dazu trägt man diesen als Proxy für Amazons Dienst ein, »KeyId« und »KeySecret« sind ebenfalls erforderlich [9]. Anschließend lässt sich »s3cmd« wie bei S3 verwenden, um Dateien auf Riak CS zu verwalten. Listing 3 zeigt eine Beispielsitzung. Der Parameter »-c« gibt die Konfigurationsdatei für das Tool an.

Listing 3

Zugriff mit s3cmd

01 s3cmd -c riakcs.cfg mb s3://test # Bucket test erzeugen
02 s3cmd -c riakcs.cfg put myfile.txt s3://test # Datei myfile.txt hochladen
03 s3cmd -c riakcs.cfg la # Alle Dateien und Buckets des Users auflisten
04 s3cmd -c riakcs.cfg get s3://test/myfile.txt ~/myfile.txt # Datei myfile.txt herunterladen

Für die meisten Programmiersprachen gibt es sehr gute S3-Bibliotheken. Ruby beispielsweise kann das offizielle Amazon-AWS-SDK [10] für das Zusammenspiel mit Riak CS verwenden. Auch dort ist der Cloudstorage als S3-Proxy anzugeben. Danach kann man etwa Buckets per Ruby auflisten, wie Listing 4 zeigt.

Listing 4

S3-API mit Ruby nutzen

01 require 'aws-sdk'
02
03 s3 = AWS::S3.new(
04   access_key_id:  "7BIEUBFQYSOBJYWAILC2",
05   secret_access_key: "lWGZ3ejqLFblrJVxszPo3==",
06   proxy_uri: "http://localhost:8080",
07   use_ssl: false,
08   max_retries: 0
09   )
10
11   s3.buckets.each { |bucket| puts bucket.name }

Die beschriebene Konfiguration lässt eine einfache Nutzung zu, für den produktiven Einsatz empfiehlt der Hersteller Basho allerdings, den Cluster mit einem Load Balancer oder Proxy vom restlichen Netzwerk zu trennen [11]. Dies schützt den Cluster primär davor, durch schadhafte oder manipulierte Clients belastet zu werden – ein speziell im mobilen Umfeld bekanntes Problem. Da die Kommunikation via HTTP stattfindet, kommen Open-Source-Programme wie Nginx oder HA Proxy in Frage, auch Appliances funktionieren in der Regel.

Riak CS ist weitestgehend mit S3 kompatibel, die Unterstützung für einzelne API-Features ist unter [12] aufgelistet. Daher lässt sich der S3-Ersatz beispielsweise als Backend für Paperclip [13] verwenden, das Datei-Upload-Plugin für Ruby on Rails. Damit bleiben die Daten der Anwender auf den eigenen Servern.

Ausblick

Mit dem Key-Value-Store Riak besitzt CS eine solide Basis, die sich dennoch weiterentwickelt. Die kommende Riak-Release 2.0 steht derzeit als Technical Preview zum Download bereit. Sie soll die Benutzung vereinfachen, beispielsweise kann der Anwender Konfigurationsdateien in bekannten Formaten verwenden und muss nicht mehr auf Erlang-Syntax achten.

Daneben schafft die Integration mit Apache Solr neue Möglichkeiten bei der Suche. Neue Datentypen erlauben es, komplexe Szenarien einfacher abzubilden, und optionale Konsistenz im Sinne des CAP-Theorems erlaubt den Einsatz jenseits der klassischen NoSQL-Szenarien. Riak CS bringt viele der Funktionen von S3 aus der Amazon-Cloud auf die eigenen Server und damit unter eigene Kontrolle. So findet das verbreitete S3-API Anwendung in Bereichen, die ihm bisher etwa durch die Gesetzeslage verwehrt blieben. Das macht das freie Riak Cloud Storage zu einem wichtigen Puzzleteil auf dem Weg zur eigenen Private Cloud. Zudem arbeiten die Entwickler auch an Features, die es zu einem Objektspeicher für das Cloudframework Open Stack machen sollen [14]. (mhu)

Der Autor

Philipp Fehre ist seit 2010 im NoSQL-Feld aktiv und arbeitet als Consultant und Entwickler. Zudem engagiert er sich für Open Source, beschäftigt sich mit Agile Development und Test Driven Development und ist in Usergroups aktiv. Sein Blog ist unter http://sideshowcoder.com zu finden.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben