Mach es haltbar

Mach es haltbar

In diesem Abschnitt wird der Objektspeicher eingeführt.

OpenStack Objektspeicher <https://www.openstack.org/software/openstack-storage/> ` (code-named swift) ist Open-Source-Software, mit der Sie redundante, skalierbare Datenspeicherung erstellen können, indem Sie Cluster von standardisierten Servern verwenden, um Petabyte zugängliche Daten zu speichern. Es ist ein langfristiges Speichersystem für große Mengen an statischen Daten, die Sie abrufen, nutzen und aktualisieren können. Im Gegensatz zu herkömmlichen Speichersystemen, die Sie über ein Dateisystem aufrufen, greifen Sie über eine API auf Objektspeicher zu.

Die Objektspeicher-API ist um Objekte und Container herum angeordnet.

Ähnlich wie bei dem UNIX-Programmiermodell ist ein Objekt wie ein Dokument oder ein Bild ein ‚Beutel von Bytes‘, der Daten enthält. Sie verwenden Container, um Objekte zu gruppieren. Sie können viele Objekte in einem Container platzieren, und Ihr Konto kann viele Container haben.

Wenn Sie darüber nachdenken, was Sie traditionell machen, um sie haltbar zu speichern, merken Sie schnell, dass das Halten mehrerer Kopien Ihrer Objekte auf getrennten Systemen eine gute Wegstrategie ist. Allerdings ist die Verfolgung dieser Mehrfachkopien schwierig, und das Erstellen einer in eine App erfordert komplizierte Logik.

OpenStack Object Storage repliziert automatisch jedes Objekt mindestens zweimal, bevor er ‚write success‘ in Ihren API-Aufruf zurückgibt. Eine gute Strategie ist es, drei Exemplare von Objekten standardmäßig zu halten, indem sie sie im Falle eines Hardwarefehlers, einer Wartung, eines Netzwerkausfalls oder einer anderen Art von Bruch über das System replizieren. Diese Strategie ist sehr praktisch für die App-Erstellung. Sie können einfach Objekte in Objektspeicher reintun und sich nicht um die zusätzliche Arbeit kümmern, die es braucht, um sie sicher zu halten.

Verwenden Sie Objektspeicher, um Fraktale zu speichern

Die Fractals App verwendet derzeit das lokale Dateisystem auf der Instanz, um die von ihm erzeugten Bilder zu speichern. Aus einer Reihe von Gründen ist dieser Ansatz nicht skalierbar oder langlebig.

Da das lokale Dateisystem eine kurzlebige Speicherung ist, gehen die Fraktalbilder zusammen mit der Instanz verloren, wenn die Instanz beendet ist. Block-basierte Speicherung, die der :doc: /block_storage Abschnitt diskutiert, vermeidet dieses Problem, aber wie lokale Dateisysteme, erfordert es die Verwaltung, um sicherzustellen, dass es nicht überläuft, und sofortige Aufmerksamkeit, wenn Festplatten kaputtgehen

Der Objektspeicherdienst verwaltet viele Aufgaben, die normalerweise vom Anwendungsbesitzer verwaltet werden. Der Object Storage Service bietet eine skalierbare und langlebige API, die Sie für die Fractals App verwenden können, wodurch es keine Notwendigkeit gibt, sich der niederen Details wie Objekte gespeichert und repliziert zu widmen, und wie der Speicherpool wächst. Object Storage behandelt Replikation für Sie. Es speichert mehrere Kopien jedes Objekts. Sie können die Objektspeicher-API verwenden, um ein Objekt auf Anfrage zurückzusenden.

Erstens erfahren Sie, wie Sie eine Verbindung zum Objektspeicher-Endpunkt herstellen können:

from __future__ import print_function
from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver

auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'

provider = get_driver(Provider.OPENSTACK_SWIFT)
swift = provider(auth_username,
                 auth_password,
                 ex_force_auth_url=auth_url,
                 ex_force_auth_version='2.0_password',
                 ex_tenant_name=project_name,
                 ex_force_service_region=region_name)

Warnung

Libcloud 0,16 und 0,17 sind mit einem Fehler behaftet, der bedeutet, dass die Authentifizierung für einen swift Endpunkt mit einer Python-Ausnahme fehlschlägt <https://issues.apache.org/jira/browse/LIBCLOUD-635> `_. Wenn Sie dies begegnen, können Sie Ihre libcloud-Version aktualisieren oder einen einfachen ‚2-zeiligen Patch anwenden <https://github.com/fifieldt/libcloud/commit/ec58868c3344a9bfe7a0166fc31c0548ed22ea87> `_.

Bemerkung

Libcloud verwendet einen unterschiedlichen Anschluss für Object Storage für alle anderen OpenStack-Dienste, so dass ein Conn-Objekt aus früheren Abschnitten hier nicht funktioniert und wir müssen einen neuen namens :code: swift erstellen.

Um Objekte zu speichern, müssen wir zuerst einen Container bauen. Rufen sie auf :code: fractals:

container_name = 'fractals'
container = swift.create_container(container_name=container_name)
print(container)

Sie sollten Ausgaben sehen wie:

<Container: name=fractals, provider=OpenStack Swift>

Sie sollten nun in der Lage sein, diesen Container in einer Auflistung aller Container in Ihrem Konto sehen:

print(swift.list_containers())

Sie sollten Ausgaben sehen wie:

[<Container: name=fractals, provider=OpenStack Swift>]

Der nächste logische Schritt besteht darin, ein Objekt hochzuladen. Finden Sie ein Foto von einer Ziege online, nennen Sie es :Code: goat.jpg, und laden Sie es auf Ihre Fraktale Container:

file_path = 'goat.jpg'
object_name = 'an amazing goat'
container = swift.get_container(container_name=container_name)
object = container.upload_object(file_path=file_path, object_name=object_name)

Auflisten von Objekten in Ihrem :code: Fraktale Container, um zu sehen, ob der Upload erfolgreich war. Dann laden Sie die Datei herunter, um zu überprüfen, ob das md5sum gleich ist:

objects = container.list_objects()
print(objects)

[<Object: name=an amazing goat, size=191874, hash=439884df9c1c15c59d2cf43008180048, provider=OpenStack Swift ...>]
object = swift.get_object(container_name, object_name)
print(object)

<Object: name=an amazing goat, size=954465, hash=7513986d3aeb22659079d1bf3dc2468b, provider=OpenStack Swift ...>
import hashlib
print(hashlib.md5(open('goat.jpg', 'rb').read()).hexdigest())

7513986d3aeb22659079d1bf3dc2468b

Schließlich bereinigen Sie, indem Sie das Testobjekt löschen:

swift.delete_object(object)

Bemerkung

Sie müssen Objekte und nicht Objektnamen an die Löschbefehle übergeben.

Jetzt sind keine Objekte mehr im :code: fractals container.

objects = container.list_objects()
print(objects)

[]

Sichern Sie die Fractals aus der Datenbank auf dem Objektspeicher

Sichern Sie die Fractals App-Bilder, die derzeit in der Datenbank gespeichert sind, auf Object Storage.

Legen Sie die Bilder in den :code: Fraktale Container:

container_name = 'fractals'
container = swift.get_container(container_name)

Als nächstes unterstützen Sie alle vorhandenen Fraktale aus der Datenbank in den swift Container. Eine einfache Schleife kümmert sich darum:

Bemerkung

Ersetzen Sie :code: IP_API_1 mit der IP-Adresse der API-Instanz.

import json

import requests

endpoint = 'http://IP_API_1'
params = { 'results_per_page': '-1' }
response = requests.get('%s/v1/fractal' % endpoint, params=params)
data = json.loads(response.text)
for fractal in data['objects']:
    response = requests.get('%s/fractal/%s' % (endpoint, fractal['uuid']), stream=True)
    container.upload_object_via_stream(response.iter_content(), object_name=fractal['uuid'])

for object in container.list_objects():
    print(object)

<Object: name=025fd8a0-6abe-4ffa-9686-bcbf853b71dc, size=61597, hash=b7a8a26e3c0ce9f80a1bf4f64792cd0c, provider=OpenStack Swift ...>
<Object: name=26ca9b38-25c8-4f1e-9e6a-a0132a7a2643, size=136298, hash=9f9b4cac16893854dd9e79dc682da0ff, provider=OpenStack Swift ...>
<Object: name=3f68c538-783e-42bc-8384-8396c8b0545d, size=27202, hash=e6ee0cd541578981c294cebc56bc4c35, provider=OpenStack Swift ...>

Bemerkung

Der Beispielcode verwendet die wunderbare `Requests library <http://docs.python-requests.org/en/latest/> `_. Bevor Sie versuchen, das vorherige Skript auszuführen, stellen Sie sicher, dass es auf Ihrem System installiert ist.

Konfigurieren Sie die Fractals App, um Object Storage zu verwenden

Warnung

Derzeit können Sie nicht direkt gespeicherte Bilder in OpenStack Object Storage speichern. Bitte wiederholen Sie diesen Abschnitt nochmals in Zukunft.

Zusatzfunktionen

Container löschen

Um einen Container zu löschen, müssen Sie zuerst alle Objekte aus dem Container entfernen. Andernfalls schlägt der Löschvorgang fehl:

for object in container.list_objects():
    container.delete_object(object)
swift.delete_container(container)

Warnung

Es ist nicht möglich, gelöschte Objekte wiederherzustellen. Achtung.

Metadaten zu Objekten hinzufügen

Sie können erweiterte Aufgaben wie das Hochladen eines Objekts mit Metadaten abschließen, wie im folgenden Beispiel gezeigt. Weitere Informationen finden Sie in der Dokumentation zu Ihrem SDK.

Diese Option verwendet auch einen Bit-Stream zum Hochladen der Datei, Iteration von Bit für Bit über die Datei und übergeben diese Bits an Object Storage, wie sie kommen. Im Vergleich zum Laden der gesamten Datei im Speicher und dann senden ist diese Methode effizienter, vor allem für größere Dateien.

file_path = 'goat.jpg'
object_name = 'backup_goat.jpg'
extra = {'meta_data': {'description': 'a funny goat', 'created': '2015-06-02'}}
with open('goat.jpg', 'rb') as iterator:
    object = swift.upload_object_via_stream(iterator=iterator,
                                            container=container,
                                            object_name=object_name,
                                            extra=extra)

Große Objekte

Für die Effizienz, die meisten Object Storage-Installationen behandeln große Objekte, > 5GB, anders als kleinere Objekte.

Wenn Sie mit großen Objekten arbeiten, verwenden Sie den :code: ex_multipart_upload_object anstelle des einfacheren :code:` upload_object` call. Der Aufruf spaltet das große Objekt in Chunks und schafft ein Manifest, so dass die Chunks beim Download rekombiniert werden können. Ändern Sie den :code: chunk_size Parameter, in Bytes, auf einen Wert, den Ihre Cloud akzeptieren kann.

swift.ex_multipart_upload_object(file_path, container, object_name,
                                 chunk_size=33554432)

Nächste Schritte

Sie sollten jetzt ziemlich sicher sein, mit Object Storage zu arbeiten. Weitere Informationen zu den Object Storage SDK-Anrufen finden Sie unter:

https://libcloud.readthedocs.org/en/latest/storage/api.html

Oder versuchen Sie eines dieser Tutorial Schritte:

Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.