Multitenant Mimarisi - Trakya Üniversitesi

advertisement
Veri Tabanı Yönetim Sistemleri 2
Ders 10
Oracle NoSQL Veritabanına Genel Bakış
Yrd. Doç. Dr. Altan MESUT
Trakya Üniversitesi
Bilgisayar Mühendisliği Bölümü
Büyük Veri (Big Data)
• Tablet ve akıllı cep telefonu gibi Internet'e
bağlanarak veri veri alışverişinde bulunan mobil
cihazların hızla artması ile dünya çapında gün
geçtikçe daha çok veri üretilmektedir.
• Sensörler gibi insanlar tarafından üretilmeyen
veriler de gün geçtikçe artmaktadır.
• Üretilen veri belirli bir biçimde olmayıp, ilişkisel
veritabanları gibi şema bağımlı yapılarda
saklanması güç olduğu için büyük verileri
saklamak amacıyla daha çok NoSQL adı verilen
veri tabanı yapıları tercih edilmektedir.
Büyük veri için 5 V kuralı
• Büyük verinin temel karakteristiğini temsil
etmek için genellikle "5 V" tanımı kullanılır.
– Volume: Verinin büyüklüğü
– Velocity: Verinin büyüme hızı
– Variety: Verinin farklılığı (farklı kaynaklardan alınan
ve belirli bir yapısı olmayan verinin RDBMS'lerde
saklanmasının zorluğu)
– Value: Büyük verinin içinden belirli bir kurum veya
konu için değerli olan verinin elde edilmesi
– Veracity: Verinin doğruluğu (güvenilirliği)
NoSQL Veritabanı
• "Yapısal olmayan" veriyi şemasız biçimde, yani "İlişkisel
olmayan" yapıda saklar.
• NoSQL veritabanları bazen SQL benzeri sorgu dillerini de
kullandıkları için "Not Only SQL" olarak ta tanımlanabilirler.
• NoSQL veritabanları için en çok tercih edilen veri modelleri:
– Key-value store: Yapısal olmayan veri için basit ama etkili ve
esnek bir modeldir (Oracle NoSQL, Voldemort, Dynamo)
– Columnar: bilgi yoğunluğu az olan veri setleri (sparse dataset),
gruplama ve toplam alma için uygundur (Cassandra, Hbase)
– Document: XML depoları ve kendini tanımlayan nesneler için
elverişlidir (MongoDB, CouchDB, Lotus Notes)
– Graph: İlişkinin iki yönde de gerçeklenebilmesi için iyi olan bu
model gelen aramalar için yavaştır (Neo4J, Allegro, OrientDB)
RDBMS
• Yüksek değerli, yüksek
yoğunluklu, karmaşık veri
• Karmaşık veri ilişkileri
• Birleşme (Join) var
• Şema temelli
• Yayılma değil büyütmeye
göre tasarlanmış
• İyi tanımlanmış
standartlar
• Veritabanı-merkezli
NoSQL
• Düşük değerli, düşük
yoğunluklu, basit veri
• Çok basit ilişkiler
• Join yok
• Şemasız, yapısal olmayan
veya yarı yapısal veri
• Dağıtık saklama ve işlem
• Standartlar tam belirgin
değil
• Uygulama-merkezli ve
geliştici-merkezli
Durum Tespiti: Senaryo 1
Sağlık Hizmeti Sistemi
• Ülkede yaşayan tüm vatandaşların sağlık
kayıtlarının tutulması istenmektedir.
Milyonlarca kişi için röntgen görüntüleri gibi veriler de saklanacak ise
petabyte'lar boyutunda veri: Volume
• Doktorlar hastaların sağlık özgeçmişlerini
görebilmek için bu sistemi kullanacaklardır.
Doktoraların hastalara ayıracak çok zamanı olmadığı düşünülürse hızlı
çalışacak bir sistem olmalı: Velocity
• Sistem farklı türde verileri saklayabilecek
yetenekte olmalıdır.
Hastalar hakkında, röntgen sonuçları, laboratuvar sonuçları, kullanılan
ilaçlar ve doktor girişleri gibi birçok farklı türde veri saklanacak: Variety
• Saklanacak olan veri zamanla değişebilecektir.
Farklı hastanelerin farklı veri saklama politikaları olabilir ve bu
politikalar (değerli olan bilgi) zamanla değişebilir: Value
NoSQL kullanmak uygun olur.
Durum Tespiti: Senaryo 2
İnsan Kaynakları Sistemi
• Firmadaki tüm çalışanların (eski çalışanlar dahil)
bilgilerini saklanacaktır.
• İşe başlama, işten ayrılma (veya emeklilik)
tarihleri, ailesel bilgiler, sağlık bilgileri, kazançlar
gibi birçok veri saklanacaktır.
• Önemli dokümanların taranmış halleri, parmak izi
verileri, ses örnekleri gibi metin bazlı olmayan
verilerin de saklanabilmesi gereklidir.
• Firma menfaati ve çalışanlar ile ilgili iç politikalar
zamanla değişebilir.
Her ne kadar farklı türde veriler saklanacak olsa da, saklanacak olan bilgiler
için bir yapı öngörülebilir. Saklanacak olan tüm personel bilgileri değerlidir.
Kişiye özel bilgiler güvenlikli bir şekilde saklanmalıdır. RDBMS uygundur.
Oracle NoSQL Veritabanı
• Oracle NoSQL veritabanı key-value store (anahtardeğer deposu) modelinde, Java dili ile yazılmış olan ve
Java API'leri kullanılarak erişilebilen bir veri tabanıdır.
• Oracle'ın büyük veri elde etme çözümü olan bu
veritabanı Berkeley DB Java Sürümü üzerine kuruludur.
• Özellikleri:
– Ölçeklenebilirdir (veri arttıkça ek düğüm eklenebilir)
– Her saklama düğümünün bir veya daha fazla replikası
olabileceği için yüksek erişilebilirliğe sahiptir.
– Master ve replica düğümler arasında otomatik yükdengeleyici (load balancing) mekanizmaya sahiptir.
Oracle NoSQL Veritabanı Nasıl Çalışır?
Oracle NoSQL Veritabanı Bileşenleri
KVStore
• Oracle NoSQL Veritabanının temel bileşeni, farklı veri
merkezleri (data centers) üzerinde bulunabilecek olan birçok
saklama düğümünden oluşan Key-Value Store (KVStore)'dur.
• Saklama düğümü fiziksel veya sanal bir makinedir. Genellikle
saklama düğümleri birisi ana düğüm (master) diğer(ler)i de
onun kopyaları (replica) olan birçok düğümün birleşmesi ile
oluşan replication group (shard) altında organize edilirler.
• Uygulamalarınızdan Java API'lerini kullanarak KVStore'a
erişebilirsiniz. Bunun için Oracle NoSQL Veritabanı
Sürücüsü'nü uygulamanıza tanıtmalısınız.
• Yönetimsel işler için komut istemi arayüzünü kullanarak veya
web-tabanlı grafiksel arayüzü kullanarak ta erişebilirsiniz.
KVLite
• Oracle NoSQL Veritabanı kurulunca gelen
basitleştirilmiş bir sürümüdür.
– Sadece 1 saklama düğümünü destekler
– Replica düğüm bulunmaz
– Konfigürasyon gerektirmez
– Tek bir işlem (process) üzerinde çalışır
– Genellikle eğitim ve test amaçlı kullanılır
KVLite'ı Başlatma
• host: KVLite'ın çalışacağı makine (varsayılan: localhost)
• admin: Web-tabanlı yönetim için erişim portu
(varsayılan: 5001)
• port: İstemcilerin bağlanacağı port (varsayılan: 5000)
• store: Yeni başlatılacak store'un ismi (varsayılan:
kvstore)
• root: KVHome klasörünün yolu
KVLite'ın çalıştığını test etme
Eğer KVLite durursa, aynı seçenekler ile KVLite'ı tekrar başlatmak için run-kvlite.sh
çalıştırılabilir veya yeni seçenekler ile çalıştırmak için KVRoot klasörü silinerek
tekrar önceki slayttaki komut kullanılabilir.
Oracle NoSQL VT için Şema Yapısı
• Oracle NoSQL VT'de her kayıt key ve value çiftinden oluşur.
• NoSQL veritabanının şemasız bir mimariye sahip olduğunu
belirtmiştik. İlişkisel veritabanına benzetmeye çalışırsak key ve value
adında iki sütuna sahip bir tablo olarak düşünebiliriz.
• Fakat bu sütunların belirli bir biçimi yoktur.
• Key-value modelinde şema kendini tanımlayamaz. VT'yi kullanan
uygulama bu key ve value için veri yapısını bilmek zorundadır.
Key (Anahtar)
• Her kaydı tekil olarak tanımlamak için yapısı VT
yöneticisi tarafından belirlenecek olan String
türünde bir değerdir.
• Bu string değer birçok majör ve birçok minör
bileşenden oluşabilir (en az 1 majör bileşen
bulunmalıdır, minör olmayabilir).
• Bu bileşenlerin yapısı veritabanı tarafından
bilinmez (kendini tanımlayamaz: 'self-describing'
değil), uygulamayı geliştirenin bilmesi gerekir.
• Majör bileşenleri aynı olan kayıtlar aynı bölümde
saklanır (sorgular için iyi).
Anahtar belirleme örneği
• Örnek olarak ad ve soyad bilgilerinin majör bileşen, doğum
tarihi, telefon numarası, eposta ve resim gibi bilgilerin
minör bileşen olarak kararlaştırıldığını düşünelim.
–
–
–
–
ad/soyad.doğumtar
ad/soyad.tel
ad/soyad.eposta
ad/soyad.resim
• Bu durumda adı ve soyadı aynı olan her kayıt aynı bölümde
(partition) yer alacaktır. Oysa ki eposta adreslerinin tekil
olacağı düşünülerek, eposta majör bileşen, ad ve soyad
minör bileşenler olarak ta düşünülebilirdi. Hiç minör bileşen
kullanılmaz ise kayıt sayısı arttıkça performans düşebilir.
Örneğimizde majör bileşeni oluşturan elemanlar '/' ile ayrıldı.
Majör-Minör bileşen ayrımı ise '.' karakteri ile yapıldı.
Anahtarı uygun şekilde belirmek için
• Uygulama performansının iyi olması için anahtarı
en uygun şekilde belirlemek çok önemlidir.
Anahtarı belirlerken şu sorulara uygun cevaplar
aranmalıdır:
–
–
–
–
–
–
Saklamak istediğiniz veri (değer: value) nedir?
Hangi verilere her zaman birlikte erişilir?
Hangi verilere bağımsız olarak erişilir?
Değer bileşeninin büyüklüğü nedir?
Veriye hangi sıklıkta erişim yapılır?
KVStore içinde kaç bölüm (partition) var?
Value (Değer)
• Saklanacak değer bileşeni bir bayt dizisidir ve neyi
temsil ettiği yine uygulama tarafından bilinir ('selfdescribing' değil).
• Bu değerin büyüklüğü anahtarın belirlenme biçimine
göre değişecektir (Maksimum 4GB olabilir):
– Örneğin anahtar olarak sadece eposta adresini majör-key
belirlediyseniz, değer içinde ad, soyad, doğum tarihi,
resim, … gibi o kişi ile ilgili her şeyi saklamak zorunda
kalırsınız (bu bilgilerin birbiri ile karışmaması için de belirli
bir ayıraç işaretine ihtiyacınız olacaktır). Eğer önceki
örneğimizde olduğu gibi minör-key'ler kullanılırsa farklı
anahtarlara bölünme olacağı için value büyüklüğü azalır.
Oracle NoSQL VT için uygulama
geliştirme
• Uygulama geliştirirken 3 temel kavram dikkate
alınmalıdır:
– Consistency (tutarlılık): Master ve Replica
düğümlerindeki kayıtların birbiri ile tutarlı olması
– Durability (dayanıklılık): Veritabanında bir hata
oluştuğunda verinin kaybolmaması
– Versioning (güncelleme zamanı): Kayıt
eklendiğinde ve güncellendiğinde zaman bilgisi
tutma
VTYS1-Ders1'de Hareket Yöneticisinden bahsederken belirttiğimiz ACID (Atomicity,
Consistency, Isolation, Durability) kavramında bunlardan ikisi yer almaktaydı.
Consistency (Tutarlılık)
• Tutarlılığı varsayılan bir politika tanımlayarak
KVStore'un tamamı için geçerli kılabileceğiniz gibi,
bu politikayı tanımlamadan belirli işlemlerde
kendiniz tutarlılık politikası verebilirsiniz (veya
belirli işlemler için varsayılan politikadan farklı bir
durumu sağlatabilirsiniz).
• Eğer yüksek düzeyde tutarlılık sağlamak isterseniz
bunun sonucu düşük yazma performansı
olacaktır.
Tutarlılık Örneği
• Consistency.ABSOLUTE ifadesi master düğümde tutarlı
veri olmasını sağlar. Aşağıda CreditCard.java
örneğinden bir bölüm yer almaktadır:
Durability (Dayanıklılık)
• Master düğümlerdeki tüm değişiklikler eğer anında
replica düğümlere yansıtılırsa, yazma performansını
düşüren bu durum tutarlılığın yanında dayanıklılığı da
sağlayacaktır (master düğümün hata vermesi
durumunda replica'nın birebir master ile aynı olması
önemlidir).
• Yazma işlemlerinde önce hafızadaki bilgi değişir, sonra
dosya sistemindeki buffer'a değişiklik yansıtılır, en
sonunda kalıcı hafıza ile senkronizasyon sağlanır. Bu
durumların her biri için replica'lara güncelleme
yapılması yerine, bir defa güncellenmesi yazma işlemini
hızlandırabilir.
Versioning (güncelleme zamanı)
• Kayıt ekleme ve güncellemelerde zaman bilgisi
tutmanın 2 önemli nedeni vardır:
– Bir güncelleme veya silme işlemini sadece o kaydın
değeri değişmediği zaman yapmak isteyebilirsiniz
– Bir okuma işlemi yaparken en son yazılan değeri
okumak isteyebilirsiniz
KVStore Handle
• Oracle NoSQL VT'ye erişimi kontrol eden bir
kaynaktır.
• Store üzerindeki tüm işlemleri yapmak için ve
store'u açmak/kapatmak için kullanılır.
• KVStore Handle yaratmak için öncelikle
KVStoreConfig sınıfından bir nesne yaratılır.
• Daha sonra bu nesne handle'ı döndürecek olan
KVStoreFactory sınıfına verilir.
• Handle elde edildiğinde Store otomatik olarak
açılacaktır.
s
• Bazı erişilebilir yöntemler:
• Örnek:
KVStoreFactory Sınıfı
• Sadece KVStore handle'ını döndüren getStore
yöntemine sahip olan statik bir sınıftır.
• NOT: Aşağıdaki paketler import edilmelidir
– oracle.kv.KVStore
– oracle.kv.KVStoreConfig
– oracle.kv.KVStoreFactory
Anahtar Tanımlama
• Eğer Major veya Minor anahtar birden çok
bileşenden oluşacak ise String türünde bir
ArrayList oluşturulup bileşenler bu listeye
eklenebilir:
• Eğer anahtarlar tek bileşenden oluşacak ise
listeye gerek yoktur (sadece String).
Anahtar ve Değer Oluşturma
• Key sınıfının createKey yöntemi ile kayıt
anahtarı oluşturulur:
• Value sınıfının createValue yöntemi ile kayıt
değeri oluşturulur:
Kayıt Yaratma örneği:
Gerekli paketler:
java.util.ArrayList
oracle.kv.Key
oracle.kv.Value
Kayıt Yazma işlemi
• Eğer yazılmak istenen değer Store içinde yoksa
yeni kayıt olarak yazılır, varsa eski kayıt
güncellenir (RDBMS'de Merge işlemi gibi).
Yazma, Silme ve Okuma Yöntemleri
• Yazma
–
–
–
–
• Okuma
put();
putIfAbsent();
putIfPresent();
putIfVersion();
–
–
–
–
get();
multiGet();
multiGetIterator();
storeIterator();
• Silme
– delete();
– multiDelete();
– deleteIfVersion();
gerekli paket: oracle.kv
İlgili Exception'lar
• DurabilityException: Yazma veya silme işlemi
belirlenen tutarlılık politikası ile uyuşmaz ise
• RequestTimeoutException: Okuma, yazma
veya silme işlemi verilen zamanda bitirilemez
ise
• FaultException: Uygulama tarafından
bilinmeyen bir hata oluştuğunda
• ConsistencyException: Okuma işlemi
belirlenen tutarlılık politikası ile uyuşmadıysa
Put, Delete & MultiDelete
Yazma ve Silme Örnekleri:
Get & MultiGet
Okuma Örneği
Download