Make it durable

Make it durable

Bagian ini memperkenalkan penyimpanan objek.

OpenStack Object Storage (code-named swift) adalah perangkat lunak open-source yang memungkinkan Anda membuat penyimpanan data yang berlebihan dan terukur dengan menggunakan kumpulan server standar untuk menyimpan petabyte data yang dapat diakses. Ini adalah sistem penyimpanan jangka panjang untuk sejumlah besar data statis yang dapat Anda ambil, leverage, dan perbarui. Tidak seperti sistem penyimpanan tradisional lainnya yang Anda akses melalui sistem file, Anda mengakses Object Storage melalui API.

Object Storage API diatur di sekitar objek dan kontainer.

Mirip dengan model pemrograman UNIX, sebuah objek, seperti dokumen atau image, adalah "bag of bytes" yang berisi data. Anda menggunakan kontainer untuk mengelompokkan objek. Anda dapat menempatkan banyak benda di dalam kontainer, dan akun Anda dapat memiliki banyak kontainer.

Jika Anda memikirkan bagaimana Anda secara tradisional membuat apa yang Anda simpan dengan tahan lama, Anda dapat dengan cepat menyimpulkan bahwa menyimpan banyak salinan objek Anda pada sistem yang terpisah adalah strategi strategi yang bagus. Namun, mencatat banyak salinan itu sulit dilakukan, dan membangunnya ke dalam sebuah aplikasi membutuhkan logika yang rumit.

OpenStack Object Storage secara otomatis mereplikasi setiap objek setidaknya dua kali sebelum mengembalikan 'write success' ke panggilan API Anda. Strategi yang bagus adalah menyimpan tiga salinan objek, secara default, setiap saat, mereplikasi di seluruh sistem jika terjadi kegagalan perangkat keras, perawatan, pemadaman jaringan, atau jenis kerusakan lainnya. Strategi ini sangat cocok untuk pembuatan aplikasi. Anda bisa membuang barang (dump object) ke dalam penyimpanan objek dan tidak khawatir dengan pekerjaan tambahan yang diperlukan agar mereka tetap aman.

Gunakan Object Storage untuk menyimpan fractal

Aplikasi Fractal saat ini menggunakan sistem file lokal pada instance untuk menyimpan image yang dihasilkannya. Untuk sejumlah alasan, pendekatan ini tidak terukur atau awet.

Karena sistem file lokal adalah penyimpanan singkat, image fraktal hilang bersamaan dengan instance saat berakhir. Penyimpanan berbasis blok, dimana bagian Block Storage membahas, menghindari masalah itu, tapi seperti sistem file lokal, memerlukan administrasi untuk memastikan tidak terisi, dan segera diperhatikan jika disk gagal.

Layanan Object Storage mengelola banyak tugas yang biasanya dikelola oleh pemilik aplikasi. Layanan Object Storage menyediakan API terukur dan tahan lama yang dapat Anda gunakan untuk aplikasi fraktal, sehingga perlu diperhatikan rincian tingkat rendah tentang bagaimana objek disimpan dan direplikasi, dan bagaimana cara menumbuhkan storage pool. Object Storage menangani replikasi untuk Anda. Ini menyimpan banyak salinan dari setiap objek. Anda dapat menggunakan Object Storage API untuk mengembalikan objek, berdasarkan permintaan.

Pertama, pelajari cara menyambungkan ke Object Storage endpoint:

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)

Peringatan

Libcloud 0,16 dan 0,17 menderita bug yang berarti otentikasi ke swift endpoin bisa gagal a Python exception. Jika Anda menjumpai ini, Anda bisa mengupgrade versi libcloud Anda, atau aplikasikan yang sederhana 2-line patch.

Catatan

Libcloud menggunakan konektor yang berbeda untuk Object Storage ke semua layanan OpenStack lainnya, jadi sebuah objek sambung dari bagian sebelumnya tidak akan bekerja di sini dan kita harus membuat yang baru bernama swift.

Untuk mulai menyimpan objek, pertama kita harus membuat kontainer. Teleponmu fractals:

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

Anda harus melihat output seperti:

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

Anda sekarang dapat melihat penampung ini muncul dalam daftar semua kontainer di akun Anda:

print(swift.list_containers())

Anda harus melihat output seperti:

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

Langkah logis berikutnya adalah mengunggah sebuah objek. Temukan foto kambing secara online, beri nama goat.jpg, dan unggah ke kontainer Anda fractals:

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)

Daftar objek di kontainer Anda fractals untuk melihat apakah upload berhasil dilakukan. Kemudian, download file untuk memverifikasi bahwa md5sum adalah sama:

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

Akhirnya, bersihkan dengan cara menghapus objek test:

swift.delete_object(object)

Catatan

Anda harus melewati objek dan bukan nama objek ke perintah hapus.

Sekarang, tidak ada lagi benda yang tersedia di container fractals`.

objects = container.list_objects()
print(objects)

[]

Cadangkan Fractal dari database pada Object Storage

Cadangkan gambar aplikasi Fractals, yang saat ini tersimpan di dalam database, di Object Storage.

Tempatkan image di kontainer fractals:

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

Selanjutnya, cadangkan semua fraktal yang ada dari database ke swift container. Sebuah loop sederhana menangani hal itu:

Catatan

Ganti IP_API_1 dengan alamat IP dari instance API.

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 ...>

Catatan

Kode contoh menggunakan yang mengagumkan Requests library. Sebelum Anda mencoba menjalankan skrip sebelumnya, pastikan itu terinstal di sistem Anda.

Konfigurasikan aplikasi Fractal untuk menggunakan Object Storage

Peringatan

Saat ini, Anda tidak bisa langsung menyimpan image yang dihasilkan di OpenStack Object Storage. Silakan kunjungi kembali bagian ini lagi di masa mendatang.

Fitur tambahan

Hapus kontainer

Untuk menghapus sebuah kontainer, pertama-tama Anda harus menghapus semua objek dari kontainer. Jika tidak, operasi penghapusan akan gagal:

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

Peringatan

Tidak mungkin mengembalikan objek yang dihapus. Hati-hati.

Tambahkan metadata ke objek

Anda dapat menyelesaikan tugas lanjutan seperti mengunggah objek dengan metadata, seperti ditunjukkan pada contoh berikut. Untuk informasi lebih lanjut, lihat dokumentasi untuk SDK Anda.

Opsi ini juga menggunakan sedikit aliran untuk meng-upload file, iterasi sedikit demi sedikit di atas file dan melewati bit by bit tersebut ke Object Storage saat mereka datang. Dibandingkan dengan memuat keseluruhan file dalam memori dan kemudian mengirimkannya, metode ini lebih efisien, terutama untuk file yang lebih besar.

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)

Objek besar

Untuk efisiensi, sebagian besar instalasi Object Storage memperlakukan objek besar, > 5GB, berbeda dari objek yang lebih kecil.

Jika Anda bekerja dengan objek besar, gunakan panggilan ex_multipart_upload_object daripada panggilan lebih sederhana upload_object. Panggilan membagi objek besar menjadi potongan dan menciptakan manifes sehingga potongan dapat digabungkan kembali pada unduhan. Ubah parameter chunk_size , dalam satuan byte, ke nilai yang bisa diterima awan Anda.

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

Langkah selanjutnya

Anda sekarang harus cukup yakin bekerja dengan Object Storage. Anda dapat menemukan lebih banyak informasi tentang Object Storage SDK di:

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

Atau, cobalah salah satu langkah tutorial berikut:

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.