DevVeri.com

Boğulacaksan büyük veride boğul!

NoSQL

Son zamanlarda sıklıkla duymaya başladığımız NoSQL kavramı, yıllardır bilişim dünyasında vazgeçilmez bir yere sahip olan ilişkisel veritabanı sistemlerine (RDBMS) alternatif olarak ortaya çıkan, aslen internetin gün geçtikçe artan verisini depolayabilmek ve yüksek trafiğe sahip sistemlerin ihtiyaçlarına cevap verebilmek amacıyla ortaya çıkmış yatay olarak ölçeklendirilebilen sistemlere verilen genel addır.NoSQL sistemlerinde RDBMS’de kullanılan SQL dili kullanılmadığı için “No SQL” adı verilmiştir. Kendini kanıtlamış bir çok örneği olmasına rağmen henüz endüstri standardı olarak kabul görmemesinden dolayı kimi zaman “Not Only SQL” olarak da adlandırılır. Bazılarımız bunu yeni ve muhteşem bir teknoloji olarak görürken, bazılarımız bu sistemlerin tek başına yeterli olamayacağını düşünüyor. Yani bilişim dünyası profesyonelleri henüz NoSQL kavramı konusunda ortak bir görüş sahip değil. Bu konu bir tarafta tartışıla dursun, aslında çok da yeni olmayan bu kavramın en bilinenleri Big Table ve DynamoDB yıllardır Google ve Amazon tarafından kullanılan NoSQL sistemleridir. Google indekslediği inanılmaz büyüklükteki internet verisini RDBMS’de değil, Big Table üzerinde tutuyor. Üstelik bu verilere RDBMS üzerinden erişebileceğinden çok daha hızlı ve belki en önemlisi, çok daha ucuza erişebiliyor.NoSQL sistemlerin ortaya çıkışı genel olarak büyüyen internet verisinin RDBMS’de performanslı bir şekilde işlenememesinden kaynaklanıyor. Veri büyüklüğü ve trafik olarak belirli büyüklüğe gelen ve hali hazırda açık kaynaklı veritabanı sistemleri kullanan firmalar bir noktada bu veritabanlarının kısıtlarına takılıyorlar. Dikey büyüme maliyetli olduğundan, yatayda büyüyebilmek için daha fazla önbellek (cache) kullanımı, verilerin programatik olarak dağıtılması (sharding) gibi teknikleri deniyorlar. Bunların da yetmediği durumda NoSQL sistemleri ortaya çıkmaya başlıyor.

NoSQL sistemlerin RDBMS’lerden farkı nedir?

RDBMS’ler işlem (transaction) tabanlı çalışan sistemlerdir. Bu işlemlerin stabil çalışması ve veri bütünlüğü için ACID (Atomicity, Consistency, Isolation, Durability) kuralları bulunur. NoSQL sistemleri bu kuralların tamamına uymaz. Örneğin birçok NoSQL sisteminde “transaction” kavramı bulunmuyor. Zaten CAP teorisine göre herhangi dağıtık bir sistem aynı anda Tutarlılık (Consistency), Müsaitlik (Availability) ve Parçalanma payı (Partition tolerance) kavramlarının hepsini birden asla sağlayamaz. Yani dağıtık bir sistemin her bir parçasından aynı veriye erişebilme, aynı anda bütün isteklere cevap verebilme, kaybedilen paketlere rağmen verinin bütününü kaybetmeme özelliklerine aynı anda sahip olamaz. Bunlardan mutlaka birinde problem çıkacaktır. NoSQL sistemlerde ise bu kavramlar esnetilerek yatayda büyüme ile performans kazancı amaçlanmıştır. Örneğin veriyi bölerek, belirli sayıdaki kopyalarını da dağıtık sistemin farkı parçalarına göndererek tutarlılık sağlanabilir. Bu sayede paket kaybı yaşansa da verinin tamamı kaybedilmez, aynı zamanda veri bölündüğü için her bir parçaya düşen yük dengelenmiş olur.

RDBMS’lerde veriler tablolarda, tanımlı sütunlarda satır satır bulunurken, NoSQL sistemler sabit tablo tanımlarına bağımlı değillerdir. Yani daha sonradan özel bir işlem yapmadan yeni kolonlar eklenebildiği gibi, kayıtlar arasında kolon farklılıkları olabilir. Örneğin 1. satırda a ve b kolonları varken 2. satırda bambaşka kolonlar bulunabilir. Bu esnek yapı bize denormalizasyon kolaylığı sağlar. RDBMS’lerde veriler ilişkilerine göre ayrı tablolara düzenli bir şekilde yerleştirilerek normalize edilirken, verilere erişim için birleştirme (join) kullanılır. Dağıtık sistemlerde birleştirme operasyonu sıkıntılara sebep olur. Çünkü birleştirilmek istenen veriler farklı parçalarda olabilir. Bu yüzden dağıtık sistemlerde birleştirme işlemi elle yapılmalıdır. Yani önce a verisi çekilir, sonra bununla ilişkili b verisi çekilip programatik olarak birleştirilme yapılır. Normal sistemlerde bu işlemler performans kaybına sebep olurken, dağıtık sistemlerde bu performans kaybı sistemin genel performansı yanında önemsizdir. İşte bu sebeple dağıtık sistemlerde birleştirme operasyonu yapmak yerine veri denormalize tutularak verilere erişim kolaylaştırılır. Denormalize edilmiş veriler içerisinde veriler kendini tekrar edecektir ancak bu da dağıtık sistemlerin çalışma performansını arttırdığı için önemli değildir. NoSQL sistemler de bu sebeple sabit tablo tanımı içermez, verilerin denormalize tutulmasını kolaylaştırır.

RDBMS’lerde verilerin tekil birer anahtar (primary key) ile birbirlerinden ayrılması zorunlu değildir. Ancak NoSQL sistemler temel olarak verilere tekil anahtarlar üzerinden erişir. Her NoSQL sisteminde ikincil indeks (secondary index) yeteneği de bulunmayabilir. Bu yüzden verilere erişim SQL sorguları ile yapıldığı gibi kolay yapılamaz. Uygulamanın özelliğine göre birincil anahtarlar belirli bir mantığa göre verilir ve bu sayede veriye erişmeden önce zaten bu anahtar biliniyor ya da oluşturulabiliyor olur. Örneğin zamana göre artan  ön ek (prefix), kaydın anahtarı ile birleştirilerek tek seferde ilgili kaydın belirli bir zaman aralığındaki kayıtlarına erişmek mümkündür. Bu sayede herhangi bir sorguya gerek olmaksızın tamamen anahtarlar üzerinden verilere hızlıca erişim sağlanmış olur.

NoSQL sistemlerin bazılarında map reduce yeteneği bulunmaktadır. Bu sayede RDBMS üzerinde SQL ile gerçekleştirilmesi çok kompleks olan analizler, map reduce ile kolay bir şekilde gerçekleştirilebilir.

NoSQL sistemlerin kendi aralarındaki farklılıkları nelerdir?

NoSQL sistemlerinin SQL-92 gibi bir standardı olmadığı için yukarda yazılanların genel özelliklerin dışında kendi aralarında farklılıklar göstermektedir. Her sistemin veri tutarlılığı ve erişimi ile ilgili farklı özellikleri ve yetenekleri bulunmaktadır. Fakat NoSQL sistemlerini genel olarak 3 grupta toplayabiliriz:

Döküman (Document) tabanlı: Bu sistemlerde bir kayıt döküman olarak isimlendirilir. Dökümanlar genelde JSON formatında tutulur. Bu dökümanların içerisinde sınırsız alan oluşturulabilir. MongoDB, CouchDB, HBase, Cassandra ve Amazon SimpleDB bunlara örnektir.

Anahtar / Değer (Key / Value) tabanlı: Bu sistemlerde anahtara karşılık gelen tek bir bilgi bulunur. Yani kolon kavramı yoktur. Azure Table Storage, MemcacheDB ve Berkeley DB bunlara örnektir.

Grafik (Graph) tabanlı: Diğerlerinden farklı olarak verilerin arasındaki ilişkiyi de tutan, Graph theory modelindeki sistemlerdir. Neo4J, FlockDB bunlara örnektir.

NoSQL sistemlerin artıları ve eksileri nelerdir?

NoSQL sistemleri yüksek erişilebilirlik sunarlar. Okuma ve yazma performansları olarak RDBMS’lerden göreceli olarak daha performanslı olabilirler. Yukarıda bahsettiğimiz özelliklerinden dolayı yatay olarak genişletilebilirler. Binlerce sunucu birarada küme olarak  çalışabilir ve çok büyük veri üzerinde işlem yapabilirler. Esnek yapılarından dolayı programlama ve bakım anlamında kolaylık sağlarlar. Farklı özelliklere sahip bir çok implementasyon arasından seçim yapma şansınız vardır. Çoğu açık kaynaklı ve bulut bilişime uygun olduğu için maliyet anlamında avantajlıdır.

Öte yandan RDBMS sistemlerini kullanan uygulamaların NoSQL sistemlere taşınması başlangıçta zor olacaktır. Veriler başarılı bir şekilde taşınsa bile bağlantı (join) kullanan kodların değiştirilmesi gerekicektir. Aynı şekilde sorgu tabanlı veri erişimi yerine anahtar tabanlı veri erişimi sağlamak gerekebilir. Ttransaction kavramı bulunmadığı için veri kaybı sözkonusu olabilir. Veri güvenliği konusunda da RDBMS’ler kadar gelişmiş özelliklere henüz sahip değiller. Bazı projelerin dökümantasyon ve profesyonel destek konusunda eksikleri olabilir.

Sonuç

Uzun yıllardır RDBMS kullanıyorsanız NoSQL sistemlere geçmek size çok anlamlı gelmeyebilir. Ancak internet işiyle uğraşanlar için RDBMS ile bir tıkanma noktası var. Bu noktaya ulaştığınızda NoSQL çözümleri sizin için çok faydalı olabilir. Şu anda olgunlaşmış durumda bir çok NoSQL proje mevcut, bunları alıp sisteminize adapte edebilirsiniz. Elbette her durum için NoSQL çözümleri uygun olmayacaktır, önemli olan uygun alanlarda kullanabiliyorsanız NoSQL çözümlerini değerlendirmenizdir.

Sitemizde amacımız NoSQL çözümlerini sizlere tanıtmak, artıları ve eksilerini değerlendirmek ve tecrübelerimizi paylaşmaktır.

30 thoughts on “NoSQL

  • omer dedi ki:

    cok faydali bir yazi olmus, tesekkurler…

  • Nurullah dedi ki:

    Bu konu hakkındaki nadir türkçe kaynaklardan biri 🙂 teşekkürler

  • Abdullah dedi ki:

    Bu faydalı yazınız için çok teşekkürler.

  • bcakir dedi ki:

    Çok açıklayıcı bir yazı olmuş, teşekkür ederim. Benim sormak istediğim bir soru var, NoSQL sistemlerini ne kadar büyüklüğe ya da trafik miktarına eriştiğimizde RDBMS sistemlerine tercih etmeliyiz?

    • Hakan İlter dedi ki:

      Bu çok değişken birşey, eğer elinizdeki rdbms işinizi görüyorsa illaki nosql kullanmanız gerekir diye bir gereklilik yok. Eğer veri çok büyükse, rdbms ile saklamak masraflı oluyorsa, veriyi daha hızlı okumak gerekiyorsa ya da çok fazla yazma işlemi varsa ve bu veriler de transactional değilse o zaman nosql çözümleri kullanılabilir. Örneğin milyonlarca kullanıcı mesajını veritabanında saklamanın özel bir getirisi yok, fakat bu mesajları örneğin mongodb’de saklayarak veriyi dağıtabilir ve hızlı erişebilirsiniz.

  • Servet dedi ki:

    Bilgiler için çok teşekkür ederim. Kolaylıklar dilerim

  • Omer Faruk dedi ki:

    NoSQL uygulamaları hakkında çok yüzeysel bir bilgim vardı, genel olarak hash map tarzı bir yapı olduğunu biliyordum. Yazınızı okuyunca biraz daha bilgilenmiş oldum ancak RDBMS’in bence en önemli özelliklerinden olan consistency bu yapılarla pek mümkün gözükmüyor. Verilere hızlı ulaşmaktan başka bir faydası yok gibi gözüküyor ama yüzlerce eksisi sayılabilir. Tabi cost’un önemli olduğu internet dünyasında kaldı ki birçoğunda consistency falanda gereksiz ögeler olarak görülebilir kendisine bu sistemin yer bulması mümkün. Bir miktar buldu bile zaten…

    • Hakan İlter dedi ki:

      Consistency yok demek çok doğru değil. Mongodb’de veriyi kaydederken write concern’ü safe olarak ayarlayarak verinin kesin olarak yazılmasını sağlayabiliyorsunuz ya da Cassandra’da hangi verinin hangi seviyeden consistent olacağını yazma sırasında belirleyebiliyorsunuz, örneğin 4 sunucudan 3’üne garantili olarak yazmasını sağlayabiliyorsunuz.

      Yine de kimse bir ödeme sisteminde yani transactional bir sistemde nosql kullanmayı tavsiye etmiyor tabiki. Daha önce de dediğim gibi bu sistemler belirli ihtiyaçları karşılamak üzere ortaya çıkmış ve o ihtiyaçları da gayet iyi karşıladıklarını söyleyebiliriz. Örneğin Facebook mesajlaşma altyapısında HBase kullanıyor, bu sayede milyarlarca mesaj, chat mesajını saklayıp bize sorunsuz bir hizmet sunabiliyor.

      Özetle, artılar ve eksiler ihtiyaca göre değişebiliyor. Bugün bu teknolojilerin hepsinin çıkış kaynağı olan Google’ın altyapısında bu sistemler mevcut.

      • Omer Faruk dedi ki:

        Consistency derken kalıcılıktan değilde tutarlılıktan bahsetmiştim. Ama ilk mesajda da zaten dediğim gibi kullanıldıkları yerler, bu gibi kıstasların olmazsa olmaz olmadığı yerler olduğundan hız ön plana çıkıyor. Bilgilendirmeniz için çok teşekkür ederim.

  • Mehmet dedi ki:

    NoSQL alanda yazılmış çok açıklayıcı ,kaynak niteliğinde bir yazı olmuş.Hocam eğer izin verirseniz bu yazınızı ödevimde kullanmak istiyorum.Teşekkür ederim

  • Ati dedi ki:

    Hakan bey bizim loglarımızı tuttugumuz bir db var buraya saniyede 500 kayıt geldigi için yazmakta sıkıntılar yaşıyoruz. logları öncelikle nosql db e yazıp oradan parça parça almak sizce sıkıntımıza çözüm olur mu

  • Çok aydınlatıcı bir yazı olmuş no sql konusunda aklımda takılan sorulara cevap buldum. Teşekkür ederim.

  • Fatih Yücel ŞEN dedi ki:

    Yazıdan güzel bilgiler edindim teşekkürler. Yanlız c# ile yapılmış bir nosql örneği de yayımlarsanız çok daha yararlı olur. Adım adım mongodb kurulumu ve c# ile bağlantı sağlayıp, veri listeleme-ekleme-silme-güncelleme gibi örneklerini video çekerek yayımlarsanız çok yararlı olacağından eminim.

  • aslı dedi ki:

    büyük veri nedir! Ve nerelerde kullanılır bu konu ile ilgili bir bilgi verebilir misiniz bana ?

  • Çok açıklayıcı ve yararlı olmuş. Teşekkür ederim.

  • ibrahim dedi ki:

    Merhaba Hakan Bey. Öncelikle emeğinize sağlık diyeyim. Son Günlerde veritabanları üzerinde bir araştırma yapmaktayım. Amacım da veritabanı dünyasına kuş bakışı bakabilmek. Örneğin;
    – SQL Veritabanı olarak: Sunucu Bazlı (sql server, mysql, postgresql) ve Dosya Bazlı Veritabanları (sqlite,access)
    – Dosya Olarak: XML(veritabanı olarak kullanılabiliyor-http://en.wikipedia.org/wiki/XML_database), Düz Metin (Flat File)
    – NoSQL olarak da sizin ifade ettiğiniz yapı

    benim takıldığım nokta gruplamayı doğru yapıp yapmadığım ve buraya dahil etmediğim farklı bir yapının var olup olmaması. Bu konuda yardımcı olabilir misiniz?

  • NoSQL dedi ki:

    Gayet başarılı bir yazı olmuş elinize sağlık

  • İbrahim YILMAZ dedi ki:

    Merhaba,

    Konu ile ilgili temel kavramların daha net anlaşılabileceği bir sunum paylaşmak istiyorum:

    http://www.slideshare.net/kunthar/nosql-veritabanlari

    Saygılar.

  • burak dedi ki:

    Şimdilik NO NoSQL diyorum. Eksileri çok. Artık kısmetse nosql v2 ye bakacağız.

  • Muhammed dedi ki:

    Gerçekten eline sağlık. güzel bir kaynak olmuş.

  • Adem KALIN dedi ki:

    Giriş seviyesi için gayet yararlı bir tanıtıcı yazı olmuş. İlgi ve merakımı uyandıran bir alandı, daha da merak duydum, elinize sağlık.

  • Ahmet SONER dedi ki:

    Harika bir türkçe kaynak olmuş elinize sağlık.

  • Ali Kemal dedi ki:

    Oldukça aydınlatıcı ve fikir verici bir yazı olmuş.
    Teşekkür ederim.

  • Kaya bey dedi ki:

    NoSQL degil bence Not Only Sql daha dogru olur. Hakan beyin de dedigi gibi kimse payment vs gibi projelerde NotOnlySql i tavsiye etmiyor. Ama konu twitter ,facebook gibi bigdata isleyen yerlere gelince mecburen bu sistem devreye giriyor.
    Gelisen teknolojide quantim bilgisayarlar vs de yapildiktan sonra belki de bu NotOnlySql e gerek kalmaya bilir diye dusunuyorum.Asil sorun olan performans konusu quantum bilgisayarlarla biraz daha cozulurse insanligi bi 20-30 yil daha gotururu diye dusunuyorum

  • Ahmet Çavuş dedi ki:

    Aradan yıllar da geçse, NoSQL ile ilgili halen istifade edilebilecek nadir Türkçe kaynaklardan. Teşekkür ederiz.

  • Aysenur dedi ki:

    Merhabalar mongoDB ne demek?

  • Duvar Kaplama dedi ki:

    teşekkür ederim yardımcı oldunuz,güzel bir blog, güzel bir paylaşım.

    Saygilar Kenan

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.