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
import hashlib
from shade import *
conn = openstack_cloud(cloud='myfavoriteopenstack')
Nesneleri depolamaya başlamak için, önce bir kapsayıcı yapmalıyız. fraktallar
ismini verebilirsiniz:
container_name = 'fractals'
container = conn.create_container(container_name)
print(container)
Şuna benzer bir çıktı görmelisiniz:
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'})
Artık bu kapsayıcıyı hesabınızdaki kapsayıcıların listesinde görebiliyor olmalısınız:
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'})]
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 = conn.get_container(container_name)
object = conn.create_object(container=container_name, name=object_name, filename=file_path)
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:
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
Son olarak deneme nesnesini silerek temizlik yapın:
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'})
Artık fraktallar
kapsayıcısında kullanılabilir nesne yoktur.
print(conn.list_objects(container_name))
[]
Şu an veritabanında tutulan Fraktallar uygulama imajlarını Nesne Depolamaya yedekleyin.
İmajları fraktallar
kapsayıcısına koyun:
container_name = 'fractals'
print(conn.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 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)
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 conn.list_objects(container_name):
conn.delete_object(container_name, object['name'])
conn.delete_container(container_name)
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 “bar” değerine sahip bir “foo” anahtarını metaveriye ekler.
Not
Swift metaveri anahtarlarının önüne bir “x-object-meta-” değeri gelir böylece get_object() ile nesneyi aldığınızda metaveri değerini alabilmeniz için anahtar “x-object-meta-foo” olur.
metadata = {'foo': 'bar'}
conn.create_object(container=container_name, name=fractal['uuid'],
metadata=metadata
)
Etkinlik için, çoğu Nesne Depolama kurulumları büyük nesnelere, örneğin >5GB
küçük nesnelerden farklı davranırlar.
Shade’in create_object fonksiyonu nesnenizi yüklerken ve gerektiğinde tekrar birleştirirken kullanılmak üzere küçük parçalara bölen (öntanımlı değeri doğru olan) bir “use_slo” parametresine sahiptir.
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:
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.