Teknoloji

NoSQL

nosql_comic1Bilgisayar devriminden hemen sonra bilgisayarların hesap makinesi olarak kullanımı dışında verileri saklamak için de kullanılabileceği keşfedildi. İlk başta veri depolama dosyalar üzerinde yapılıyordu. Daha sonra bu alanda devrim niteliğinde ilerlemeler oldu. Firmalar veri depolama,saklama konularında çalışmaya başladılar.

IBM’in bu konuda çalışmaları SeQuEl[1] dilinin bir örneği olan System R[2]’ da sergilendi. System R, bilgiler üzerinde yüksek seviye bir dille işlem yapılmasına olanak veriyordu. SQL’in altyapısını sunan bu türden sistemler RDBMS[3] – veritabanı yönetim sistemleri olarak anıldı. RDBMS’ lerin hedefi SQL’i yüksek seviye bir dil olarak kullanıp kullanıcıların verilere ulaşmasını sağlamak, verilere erişimi kontrollü bir şekilde yönetmek, erişimlerde verilerin tutarlılığını ve birden çok kullanıcının aynı anda veritabanına ulaşmasını yönetmektir.

Bu sistemi daha sonra Ingres[4] devam ettirdi. Fakat bu firmaların arasından sıyrılarak SQL’i kullanan ve bir numaralı veritabanı sistemini oluşturan günümüzün pazar lideri Oracle[5] firması oldu.

SQL, verileri birbirine bağlantılı tablolar şeklinde tutmayı sağlar. Böylece veriler üzerinde bağıntılar kurarak saklanması, sorgulanması, silinmesi, güncellenmesi kolay bir altyapıyı kullanıcının hizmetine sunar. Bu yöntemi kullanan veritabanlarına “ilişkisel” denir.

Yıllar içinde RDBMS sistemleri tüm dünyada büyük bir popülerlik kazandı. Uygulamalarda verinin tutulması için dosya erişimi yerine RDBMS sistemleri tercih edildi.

Dünyada RDBMS pazarında lider konumunda olan üç firma vardır. Bunlar;

  1. Oracle

  2. IBM

  3. Microsoft

Paralı uygulamalar dışında açık kaynak kodlu alternatifler şu şekilde sıralanır;

  1. MySQL

  2. PostgreSQL.

Bu listenin dışında kalanlardan RDBMS’in özelliklerini tam olarak sunmayanlar yer alırlar. Yazıda bunlara değinilmedi.

Pekala biz bu yazıda SQL’e neden bu kadar değiniyoruz, NoSQL[6]’in ne olduğunu anlatsak olmaz mıydı ? Bu konuya girmeden önce mutlaka SQL’in bize sunamadıklarını anlatmamız, SQL’in zayıflıklarına değinmemiz gerekiyordu. Bunun için günümüz ve 30 sene öncesini karşılaştıralım. Verilerle ilgili ne tür değişimler oldu görelim.

Veri miktarı arttı

Stock Market BackgroundGünümüzde dünya üzerinde dolaşan bilgi miktarında çok ciddi artışlar oldu. Bu veri depolama sistemlerine de yansıdı. Örneğin sosyal ağ kullanan bir web sitesinin depoladığı verileri RDBMS’de tuttuğunu düşünün. Veri miktarı artınca sunucular ve bunların yönetimi zorlaştı. Performans problemleri ortaya çıktı. RDBMS’lerin merkezi yapıda çalışan client-server modeli zor zamanlar geçirmeye başladı.

Firmalar RDBMS’lerin kısıtlı genişleyebilirlik özellikleri nedeniyle performans problemleri yaşamaya başladılar. Büyük oyuncular (Microsoft, IBM, Oracle) önceden böyle bir veri artışı olabileceğini çok da düşünmemiş olacaklar ki ortaya çıkan problemleri çözmek için kolları sıvadılar.

Bunun için Oracle’ın, IBM’in, Microsoft’un çeşitli çözümleri piyasaya sürüldü. Bunlar SQL’in kısıtlarını ortadan kaldırmak için yeni özelliklere sahip yeni nesil RDBMS’lerini pazara sundular. Elbette daha pahalı bir şekilde !

Yukarıdaki veri depolamadaki artış tespitimiz için bir örnek verelim;

  • 1990’da 1.5GB kapasiteye sahip bir sabit disk ile saniyede 4.4MB bilgi okunabiliyordu. 5.5 dk’da tüm disk okunabiliyor.

  • 2012’de 1.5TB kapasiteye sahip bir sabit disk ile saniyede 100MB bilgi okunabiliyor. 250 dk’da tüm disk okunabiliyor. 1.5 GB => 0.25 dk’da okunabiliyor !

Güzel ve yerinde bir tespit daha yapalım mı?

Diske Yazmak Diskten Okumaktan daha yavaş!

Peki bunu hızlandırmak için ne yapmalıyız?

Verileri paralel şekilde okuyabiliriz. Örneğin elimizde 100 disk olsun. Her diske verinin 100’de birini yazarız. 100 diski paralel olarak birlikte okuruz. Böylece tüm veriyi yaklaşık 2.5dk ‘dan az bir zamanda okumuş oluruz.

RDBMS’lerin bu tür fiziksel problemlere çözüm üretmesi zordu çünkü RDBMS’lerin tasarımı bundan neredeyse 30 sene önce yapıldı ve bu o zamanda varolan fiziksel depolama kabiliyetleri göz önünde bulundurarak gerçekleşti.

Günümüzde bu yüzdendir ki farklı veri depolama stratejilerinin araştırılması NoSQL’in doğmasına sebep olmuştur. Amaç farklı veri tiplerinin saklanmasında RDBMS’ler dışında kullanılabilecek, senaryolarımızdaki ihtiyaçlarımızı, performans hedeflerimize ulaşmamızı sağlayan başka sistemlerin araştırılmasıdır.

NoSQL’in uygulama alanlarına bakarsak;

  • Arama motorları

  • Sosyal ağlardaki birey-ürün, birey-birey ilişkilerinin incelenmesi

  • Lokasyon tabanlı pazarlama

  • Sensör tabanlı veri işleme yazlımları

  • Beğenilerin öğrenilmesi ve ürün önerme

RDBMS dışında bir veri saklama metodolojisi kullanmak risklidir. Çünkü RDBMS’ler her ne kadar eski nesil bir tasarıma sahip olsalar da NoSQL alternatiflerinden her zaman daha stabil durumdadırlar. Verilerinizin bir anda kaybolma riski çok azdır.

Yapılan hata her uygulama için RDBMS veya NoSQL’i tekil olarak kullanmaktır. Önemli nokta şudur; veritabanı ihtiyaçlarımızı karşılayan sistemler seçilmelidir.En iyi pratik NoSQL ve SQL’in çözümü oluşturan parçalarda bir arada kullanılmasıdır.

Firmaların yaptığı bir diğer hata RDBMS’lerin özelliklerini sonuna kadar kullanmadan NoSQL’e veya başka sistemlere olan geçme isteğidir. Tam tersi RDBMS’in tüm özellikleri sonuna kadar kullanılmalıdır. Eğer performans veya genişleyebilirlik özellikleri bir yere kadar iyileştirilebiliyorsa ve üstüne çıkılamıyorsa NoSQL alternatifleri değerlendirilmelidir.

Yöntem

Karar vermeden önce verini incele! Bunun için;

  1. Veri tipini incele, karakteristiğini öğren (Log, gerçek, zamanlı veriler, lokasyon bilgileri, web sayfaları)

  2. Ne sıklıkla veriye ulaşıyorsun?

  3. Veri tipi hangi sıklıklı değişiyor?

“Veri tipine özel NoSQL” seçenekleri aşağıdaki gibidir.

nosql3

1. Document Stores [7]

Popüler implementasyonlar : MongoDB, CouchDB

Her dosya bir dokümandır. Dokümanlar birbirleriyle aynı tablolarda yaşamazlar. Her dosya kendi içinde bir B-Tree indekslemeye sahiptir. RDBMS’lerdeki tablo buradaki dosyaya karşılık gelir. Aşağıdaki örnekte Derin’in dosyasında Derin’le ilgili özellikle sıralanmıştır. Volkan’ın kütüğü ile Derin’in kütüğü aynı indekslemede yer almıyor.

Derinin kütüğü => İsim:”Derin”,

Adres:”Kavaklıdere”, Hobi:”oyuncak”.

2. Key-Value Store [8]

Popüler implementasyonlar: Riak, Redis, Cassandra

Verilen key’lerin hangi value’lara işaret ettiği tanımlanır. Hash[11] algoritmaları kullanılır. Value’lara çok hızlı erişim imkanı sağlar.

cocuk[‘Derin’] = {‘ilkisim’:’Derin’, ‘Adres’:’Kavaklıdere’, ‘Hobi’:’oyuncak’}

3. Column Stores – Tabular Data [9]

Popüler implementasyonlar: Bigtable-HBase

RDBMS’lerde satır bazında işlemler yapılırken burada kolonlar ve bunların üzerinden işlemler yapılır. Verileri indekslemek için RDBMS’lere çok yakın karakteristikler sergilerler.

4. Graph [10]

Popüler implementasyonlar: Neo4J

Verileri graphdaki ilişkiler olarak tutarlar. Sosyal ağlarda yoğun olarak kullanılır.

Bunların dışında çok büyük veri ambarları üzerinde hesaplama yapmayı sağlayan ekosistem yazılımları geliştirilmektedir. En popüler olanı Hadoop[12] ekosistemidir.

Kaynak

[1] – http://tr.wikipedia.org/wiki/SQL
[2] – System R – http://www.cs.berkeley.edu/~brewer/cs262/SystemR.pdf
[3] – RDBMS – http://www.oracle.com/us/corporate/profit/p27anniv-timeline-151918.pdf
[4] – Ingres – http://en.wikipedia.org/wiki/Ingres_(database)
[5] – Oracle – http://www.oracle.com/index.html
[6] – NoSQL – http://nosql-database.org/
[7] – Document Stores – http://ayende.com/blog/4459/that-no-sql-thing-document-databases
[8] – Redis Key-value Store – http://redis.io/
[9] – Column Stores http://en.wikipedia.org/wiki/Column-oriented_DBMS
[10] – Graph Databases http://mashable.com/2012/09/26/graph-databases/
[11] – Hash algorithms http://en.wikipedia.org/wiki/Hash_function
[12] – Hadoop Home Page http://hadoop.apache.org/