Dayanıklı hale getirin

Dayanıklı hale getirin

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.

Fraktalları depolamak için Nesne Depolamayı kullanın

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)

[]

Fraktalları veritabanından Nesne Depolama üzerine yedekleyin

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

Fraktallar uygulamasını Nesne Depolamayı kullanacak şekilde yapılandırın

Uyarı

Şu an üretilen imajları doğrudan OpenStack Nesne Depolamaya kaydedemezsiniz. Lütfen ilerde bu kısmı tekrar ziyaret edin.

Ek özellikler

Kapsayıcıları silin

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.

Metaveri nesneleri ekleyin

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)

Büyük nesneler

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)

Sonraki adımlar

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:

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.