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
import hashlib
from shade import *

conn = openstack_cloud(cloud='myfavoriteopenstack')

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

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

Sie sollten Ausgaben sehen wie:

Munch({u'content-length': u'0', u'x-container-object-count': u'0',
u'accept-ranges': u'bytes', u'x-container-bytes-used': u'0',
u'x-timestamp': u'1463950178.11674', u'x-trans-id':
u'txc6262b9c2bc1445b9dfe3-00574277ff', u'date': u'Mon, 23 May 2016
03:24:47 GMT', u'content-type': u'text/plain; charset=utf-8'})

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

print(conn.list_containers())

[Munch({u'count': 0, u'bytes': 0, u'name': u'fractals'}),
Munch({u'count': 0, u'bytes': 0, u'name': u'fractals_segments'})]

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 = conn.get_container(container_name)
object = conn.create_object(container=container_name, name=object_name, filename=file_path)

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:

print(conn.list_objects(container_name))

[Munch({u'hash': u'd1408b5bf6510426db6e2bafc2f90854', u'last_modified':
u'2016-05-23T03:34:59.353480', u'bytes': 63654, u'name': u'an amazing
goat', u'content_type': u'application/octet-stream'})]
object = conn.get_object(container_name, object_name)
print(object)

print(hashlib.md5(open('goat.jpg', 'rb').read()).hexdigest())

d1408b5bf6510426db6e2bafc2f90854

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

conn.delete_object(container_name, object_name)

Munch({u'content-length': u'0', u'x-container-object-count': u'0',
u'accept-ranges': u'bytes', u'x-container-bytes-used': u'0',
u'x-timestamp': u'1463950178.11674', u'x-trans-id':
u'tx46c83fa41030422493110-0057427af3', u'date': u'Mon, 23 May 2016
03:37:23 GMT', u'content-type': u'text/plain; charset=utf-8'})

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

print(conn.list_objects(container_name))

[]

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'
print(conn.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 base64
import cStringIO
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']:
    r = requests.get('%s/fractal/%s' % (endpoint, fractal['uuid']), stream=True)
    with open(fractal['uuid'], 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
    conn.create_object(container=container_name, name=fractal['uuid'])

for object in conn.list_objects(container_name):
    print(object)

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 conn.list_objects(container_name):
    conn.delete_object(container_name, object['name'])
conn.delete_container(container_name)

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.

Dies fügt einen ‚foo‘ Schlüssel zu den Metadaten hinzu, die einen Wert von ‚bar‘ haben.

Bemerkung

swift Metadatentasten werden mit ‚x-object-meta-‚ vorangestellt, also wenn Sie das Objekt mit get_object () bekommen, um den Wert der Metadaten zu erhalten, wird Ihr Schlüssel ‚x-object-meta-foo‘ sein.

metadata = {'foo': 'bar'}
conn.create_object(container=container_name, name=fractal['uuid'],
    metadata=metadata
)

Große Objekte

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

Shade’s create_object-Funktion hat einen ‚use_slo‘ -Parameter (der standardmäßig auf true), der Ihr Objekt in kleinere Objekte zum Hochladen zerbricht und bei Bedarf wieder zusammenbringt.

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:

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.