Bu kısım nesne deoplamayı tanıtır.
OpenStack Nesne Depolama (kod adı swift) petabaytlarca erişlebilir veriyi depolamak için standart sunucuların kümesini kullanarak yedekli, ölçeklenebilir veri deposu oluşturmanızı sağlayan açık kaynak bir yazılımdır. Büyük miktarlarda statik veriyi alabileceğiniz, kullanabileceğiniz ve güncelleyebileceğiniz uzun dönem depolama sistemidir. Bir dosya sistemi üzerinden eriştiğiniz daha geleneksel depolama sistemlerinin aksine Nesne Depolamaya API üzerinden erişirsiniz.
Nesne Depolama API’si nesneler ve kapsayıcılar etrafında düzenlenmiştir.
UNIX programlama modeline benzer şekilde, bir nesne, örneğin bir belge veya imaj, veri içeren bir “baytlar çantasıdır”. Kapsayıcıları kullanarak nesneleri gruplarsınız. Bir kapsayıcıya birçok nesne koyabilirsiniz, ve hesabınız birçok kapsayıcıya sahip olabilir.
Geleneksel olarak kaydettiğiniz bir şeyi nasıl dayanılı yaptığınızı düşünürseniz, nesnelerinizin çoklu kopyalarını farklı sistemlerde tutmanın iyi bir strateji olduğu sonucuna varabilirsiniz. Ancak, bu çoklu kopyaları takip etmek zordur, ve bunu bir uygulamada inşa etmek karmaşık bir mantık gerektirir.
OpenStack Nesne Depolama API çağrınıza ‘yazma başarılı’ döndürmeden önce her nesneyi otomatik olarak en az iki kere yedekler. Donanım arızası, bakım, ağ kesintisi veya başka bir şeylerin kırılması durumuna karşı sistemde tüm nesnelerin öntanımlı olarak her zaman üç kopyasını tutmak iyi bir stratejidir. Bu strateji uygulama oluşturmada çok kolaylık sağlar. Nesneleri direk nesne depolamaya atar ve güvenli tutmak için gerekli olan ek iş yükünü düşünmezsiniz.
Fraktal uygulaması şu an ürettiği imajları depolamak için yerel dosya sistemini kullanır. Birden fazla sebepten, bu yaklaşım ne ölçeklenebilirdir ne de dayanıklı.
Yerel dosya sistemi geçici depolama olduğundan, fraktal imajlar sunucu sonlandırıldığından beraber kaybolurlar. Blok Depolama kısmında tartışıldığı gibi blok tabanlı depolama bu problemi aşar, ama yerel dosya sistemleri gibi dolmasını engellemek için bir yöneticiye ve diskler arızalanırsa anında müdahaleye ihtiyaç duyarlar.
Nesne Depolama servisi normalde uygulama sahibi tarafından yönetilen birçok görevi yönetir. Nesne Depolama servisi fraktal uygulaması için kullanabileceğiniz ölçeklenebilir ve dayanıklı bir API sunar, nesnelerin nasıl depolandığı ya da yedeklendiği, depolama havuzunun nasıl büyütüleceği gibi düşük seviye ayrıntıları bilmeniz gerekliliğini ortadan kaldırır. Nesne Depolama sizin için yedeklemeyi halleder. Her nesnenin birden fazla kopyasını deoplar. İstediğiniz anda Nesne Depolama API’sini kullanarak bir nesne döndürebilirsiniz.
Önce, Nesne Depolama uç noktasına nasıl bağlanacağınızı öğrenin:
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)
Uyarı
Libcloud 0.16 ve 0.17 bir swift uç noktasına kimlik doğrulamanın bir Python istisnasıyla sonlandığı bir hataya sahiptir. Bununla karşılaşırsanız, libcloud sürümünüzü güncelleyin, veya basit 2 satırlık bir yamayı uygulayın.
Not
Libcloud Nesne Depolama iin tüm OpenStack servislerine farklı bağlantı kullanır, yani önceki kısımlardan bir conn nesnesi burada çalışmayacaktır, swift
isimli yeni bir tane oluşturmalıyız.
Nesneleri depolamaya başlamak için, önce bir kapsayıcı yapmalıyız. fraktallar
ismini verebilirsiniz:
container_name = 'fractals'
container = swift.create_container(container_name=container_name)
print(container)
Şuna benzer bir çıktı görmelisiniz:
<Container: name=fractals, provider=OpenStack Swift>
Artık bu kapsayıcıyı hesabınızdaki kapsayıcıların listesinde görebiliyor olmalısınız:
print(swift.list_containers())
Şuna benzer bir çıktı görmelisiniz:
[<Container: name=fractals, provider=OpenStack Swift>]
Sonraki mantıksal adım bir nesne yüklemektir. İnternette bir keçi resmi bulun, ismini goat.jpg
yapın ve fraktallar
kapsayıcınıza yükleyin:
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)
fraktallar
kapsayıcınızdaki nesneleri listeleyerek yüklemenin başarılı olduğunu onaylayın. Ardından md5sum değerinin aynı olduğundan emin olmak için dosyayı indirin:
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
Son olarak deneme nesnesini silerek temizlik yapın:
swift.delete_object(object)
Not
Silme komutlarına nesne isimlerini değil nesneleri vermelisiniz.
Artık fraktallar
kapsayıcısında kullanılabilir nesne yoktur.
objects = container.list_objects()
print(objects)
[]
Şu an veritabanında tutulan Fraktallar uygulama imajlarını Nesne Depolamaya yedekleyin.
İmajları fraktallar
kapsayıcısına koyun:
container_name = 'fractals'
container = swift.get_container(container_name)
Ardından, mevcut tüm fraktalları veritabanından swift kapsayıcısına yedekleyin. Bunu yapmak için basit bir döngü yeterlidir:
Not
IP_API_1
anahtarını API sunucusunun IP adresiyle değiştirin.
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 ...>
Not
Örnek kod harika Requests kitaplığını kullanır. Önceki betiği çalıştırmaya çalışmadan önce sisteminize kurulu olduğundan emin olun.
Uyarı
Şu an üretilen imajları doğrudan OpenStack Nesne Depolamaya kaydedemezsiniz. Lütfen ilerde bu kısmı tekrar ziyaret edin.
Bir kapsayıcıyı silmek için önce kapsayıcıdan tüm nesneleri çıkarmalısınız. Aksi halde silme işlemi başarısız olur:
for object in container.list_objects():
container.delete_object(object)
swift.delete_container(container)
Uyarı
Silinen nesneleri geri yükleme imkansızdır. Dikkatli olun.
Aşağıdaki örnekte gösterildiği gibi metaveriyle birlikte bir nesne yükleme gibi karmaşık görevleri tamamlayabilirsiniz. Daha fazla bilgi için SDK’nız için belgelendirmeye göz atın.
Bu seçenek de bit akışı kullanarak dosya yükler, dosya üzerinde bit bit ilerleyerek ve bu bitleri geldikçe Nesne Depolamaya geçirerek. Tüm dosyayı belleğe yükleyip ardından göndermeyle karşılaştırdığınızda bu yöntem daha etkindir, özellikle daha büyük dosyalar için.
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)
Etkinlik için, çoğu Nesne Depolama kurulumları büyük nesnelere, örneğin >5GB
küçük nesnelerden farklı davranırlar.
Büyük nesnelerle çalışıyorsanız, daha basit olan upload_object
çağrısı yerine ex_multipart_upload_object
çağrısını kullanın. Çağrı büyük nesneyi parçalara böler ve bir bildiri oluşturarak indirme zamanında parçaların tekrar birleştirilebilmesini sağlar. :code.`chunk_size` parametresini bulutunuzun kabul edeceği bir değere bayt olarak ayarlayın.
swift.ex_multipart_upload_object(file_path, container, object_name,
chunk_size=33554432)
Artık Nesne Depolamayla çalışırken kendinizden emin olmalısınız. Nesne Depolama SDK çağrılarıyla ilgili daha fazla bilgi için:
https://libcloud.readthedocs.org/en/latest/storage/api.html
Veya şu öğretici adımlarından birini deneyin:
Blok Depolama: Veritabanını blok depolamaya göç ettirin, veya servis olarak veritabanı bileşenini kullanın.
Orkestrasyon: Uygulamanızı otomatik olarak düzenleyin.
Ağ: Karmaşık ağları öğrenin.
İşlemlere yeni geliştiriciler için öneri: İşlemler hakkında öneri alın.
Çılgınlaşmak: Yapmayı düşünmeyeceğiniz bazı çılgın şeyleri öğrenin ;)
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.