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.
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:
auth_username = "your_auth_username"
auth_password = "your_auth_password"
auth_url = "http://controller:5000"
project_name = "your_project_name_or_id"
swift = Fog::Storage::OpenStack.new openstack_auth_url: auth_url + "/v3/auth/tokens",
openstack_domain_id: "default",
openstack_username: auth_username,
openstack_api_key: auth_password,
openstack_project_name: project_name
Um Objekte zu speichern, müssen wir zuerst einen Container bauen. Rufen sie auf :code: fractals:
container_name = "fractals"
container = swift.directories.create key: container_name
p container
Sie sollten Ausgaben sehen wie:
TBC
Sie sollten nun in der Lage sein, diesen Container in einer Auflistung aller Container in Ihrem Konto sehen:
p swift.directories.all
Sie sollten Ausgaben sehen wie:
TBC
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.directories.get container_name
object = container.files.create body: File.read(File.expand_path(file_path)),
key: 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:
p container.files.all
TBC
p container.files.get object_name
TBC
puts Digest::MD5.hexdigest(File.read(File.expand_path(file_path)))
7513986d3aeb22659079d1bf3dc2468b
Schließlich bereinigen Sie, indem Sie das Testobjekt löschen:
object.destroy
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.directories.get 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.
endpoint = "http://IP_API_1"
uri = URI("#{endpoint}/v1/fractal")
uri.query = URI.encode_www_form results_per_page: -1
data = JSON.parse(Net::HTTP.get_response(uri).body)
data["objects"].each do |fractal|
body = open("#{endpoint}/fractal/#{fractal["uuid"]}") {|f| f.read}
object = container.files.create body: body, key: fractal["uuid"]
end
p container.files.all
Warnung
Derzeit können Sie nicht direkt gespeicherte Bilder in OpenStack Object Storage speichern. Bitte wiederholen Sie diesen Abschnitt nochmals in Zukunft.
Um einen Container zu löschen, müssen Sie zuerst alle Objekte aus dem Container entfernen. Andernfalls schlägt der Löschvorgang fehl:
container.files.each do |file|
file.destroy
end
container.destroy
Warnung
Es ist nicht möglich, gelöschte Objekte wiederherzustellen. Achtung.
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.
object_name = "backup_goat.jpg"
file_path = "backup_goat.jpg"
extra = {
description: "a funny goat",
created: "2015-06-02"
}
object = container.files.create body: File.read(File.expand_path(file_path)),
key: object_name,
metadata: extra
Für die Effizienz, die meisten Object Storage-Installationen behandeln große Objekte, > 5GB
, anders als kleinere Objekte.
def chunked_file_upload(swift, container_name, object_name, file_path)
chunk_size = 4096
offset = 0
hash = Digest::MD5.hexdigest(File.read(File.expand_path(file_path)))
object = swift.put_object(container_name, object_name, nil) do
chunk = File.read(file_path, chunk_size, offset)
offset += chunk_size
chunk ? chunk : ''
end
unless hash == object.data[:headers]["etag"]
swift.delete_object container_name, object_name
raise "Checksums do not match. Please retry."
end
container = swift.directories.get container_name
container.files.get object_name
end
object_name = "very_large_file"
file_path = "very_large_file"
object = chunked_file_upload(swift, container_name, object_name, file_path)
Sie sollten jetzt ziemlich sicher sein, mit Object Storage zu arbeiten. Weitere Informationen zu den Object Storage SDK-Anrufen finden Sie unter:
https://github.com/fog/fog/blob/master/lib/fog/openstack/docs/storage.md
Oder versuchen Sie eines dieser Tutorial Schritte:
Blockieren Sie Speicherplatz: Migrate the database to block storage, or use the database-as-a-service component.
: doc: / orchestration: Automatisches Orchestrieren Ihrer Applikation.
Vernetzung: Learn about complex networking.
Beratung für Entwickler, die neu in Betrieb sind: Get advice about operations.
Werde verrückt: Learn some crazy things that you might not think to do ;)
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.