12 Mart 2017 Pazar

NoSQL Veritabanı Arayışımız


Teknolojinin hızla gelişmesiyle birlikte yeni ihtiyaçlar, yeni sorunlar da gün yüzüne çıkmaya başladı. İnternete bağlanma hızlarımızın artmasıyla birlikte ürettiğimiz veri miktarı inanılmaz oranda artış gösterdi. Bu baş döndürücü değişimlerden veri tabanı sistemleri de fazlasıyla nasibini aldı.

Daha önce Oracle, MySQL, MS Sql Server gibi veritabanları tüm piyasayı domine ederken gelişen farklılaşan ihtiyaçlarla yeni ürünler boy gösterdi. Bu bağlamda NoSQL dediğimiz, açılımı "Not only SQL", Türkçeye, "sql'in yeterli gelmediği nokta" gibi çevrilebilecek yeni bir kavram hayatımıza girdi. Oracle, MySQL gibi ilişkisel(RDBMS) sistemlerinin yetersiz kalmaya başladığı noktalarda NoSQL veritabanları imdada yetişti. HBase, Cassandra, MongoDB, Couchbase ve diğerleri...

Yakın döneme kadar MS SQL 2014 veritabanımız ile mutlu mesut yaşarken artan veri miktarımız, lisanslama maliyetleri, sistem bakım maliyetleri gibi nedenlerden ötürü bazı arayışlara girmek durumunda kaldık. Söz buraya gelmişken çoğu teknolojik gelişme son dönemde İnternet devlerinin mevcut çözümlerin yetersiz kaldığı noktada kendi iç kaynaklarıyla ihtiyaçlarına uygun farklı çözümler geliştirmeleriyle ortaya çıktı ve çıkmaya devam ediyor. Google'da geliştirilen Hadoop HDFS, Linkedin'de geliştirilip yayılan Apache Kafka gibi. Kendi hikayemize dönersek, SQL Server'da tuttuğumuz bir kaç tablomuz aşırı derecede büyüdü ve yaptığımız projeksiyonlarda yakın dönemde 2-3 katına çıkmasını öngörüyorduk. Tablo büyüklüğü 500M kayıt ve yaklaşık 600GB'lık bir veritabanı manasına geliyordu. Bu durum bize:

  • Çok uzun süren backup süreleri
  • Bakım çok zaman alan tablo bakım işlemleri (index rebuild, organize vs.)
  • Artan olası lisanslama maliyetleri
gibi sorunlar ortaya çıkarmaya başladı. 

Geldiğimiz noktada yaptığımız araştırma ve incelemeler ile aşağıdaki özelliklere sahip bir veri tabanı sistemi ile sorunlarımızı aşabileceğimizi fark ettik.
  • Açık lisanslı
  • Dağıtık sistem olarak birden fazla sunucu üzerinde çalışabilecek
  • Her hangi bir sunucu down olduğunda hizmet vermeye devam edecek (No Single Point of Failure)
  • Çok pahalı olmayan ve eşit donanım özelliklerine sahip olmayan sunuculara üzerinde çalışabilecek
  • Çok hızlı sorgulama ve insert etme özelliklerine sahip
  • Yatay olarak çok rahat genişleyebilir
  • Farklı programlama dilleri noktasında yardımcı kütüphanelere sahip olması
Bu özelliklerin yanında RDBMS sistemlerden alıştığımız bazı özelliklerden de feragat etmemiz gerekiyordu. NoSQL söz konusu olduğunda göz önüne almamız gereken bir noktada da RDBMS sistemlerin sağladığı aşağıdaki noktalardan kısmen yada tamamen vaz geçmeniz gerekliliği. Yoksa her şeyi halleden bir sistem olsa farklı ihtiyaçlara girmezdik değil mi :)
  • ACID dediğimiz prensipleri desteklememeleri
  • Tablolar arası ilişkileri RDBMS sistemlerdeki gibi tanımlayamamız. (join yapamamız)
  • Transaction yapısının olmaması.

Yukarıdaki özellikleri ve eksiklikleri göz önüne aldığımızda ihtiyaçlarımıza uygun olabilecek en uygun NoSQL çözümünün Apache Cassandra olduğu ortaya çıktı. Tüm dünyada daha fazla kabul görmeye başlamış, binlerce büyük internet şirketinin kullandığı bu sistem sağladığı özellikler ile övgüyü hak ediyor. Başka yazılarda genel özelliklerini ve geçiş sürecimizi biraz daha detaylı anlatmaya çalışacağız.





Appache Cassandra Veri Aktarma



Her hangi bir RDBMS veri tabanı sisteminden Cassandra'ya geçişte karşılaşılan büyük çaplı sorunlardan biri de mevcut veriyi aktarmak. Cassandra söz konusu olduğunda en azından 100M/200M satıra sahip tablolardaki verinin aktarılması gerekir. Bunun için de geliştirilmiş bazı özel yaklaşımlar mevcut. Ben bu yazıda kendi yaşadığımın deneyimi aktarmak istiyorum.
Cassandra'ya bulk veri yüklemek için çeşitli yöntemler geliştirilmiş durumda. sstableloader Cassandra Bulk Loader ile ilgili bazı dokümanlar Datastax'ın sitesinde mevcut. Ancak bir miktar yazılım geliştirme yapılması gerekiyor. İnternette çok fazla kaynak da bulamadığınızdan sancılı bir süreç.
Bu genel probleme Brian Hess isimli bir geliştirici çok güzel ve kullanışlı bir ara yüz yazmış. Bununla ilgili Java programına bu linkten erişebilirsiniz. Kullanımı oldukça kolay ve çok stabil olduğunu düşünüyorum. Örneğin ben bir projemizde MS SQL 2014'te bulunan yaklaşık 500M kayda sahip bir tabloyu başarılı bir şekilde export ettim. Madde madde yapılanları özetlemek gerekirse :
  • SQL Server'den tabloyu yaklaşık 60M-70M'luk kayıtlar içerecek şekilde csv formatında export ettim. Bununla ilgili bu yazıya göz atabilirsiniz.


  • Cassandra-loader uygulamasını Java 8 yüklü bir sunucuya indirdim. Bunun için daha önce konfigüre konfigüre ettiğim Cassandra Cluster sunucularından birini kullandım. Ubuntu 14.04 sunucu üzerinde gayet stail bir şekilde çalıştığını söyleyebilirim. Aşağıdaki kod ile oluşturulan bu csv dosyaları sizin için Java Cassandra kütüphanesinin bulk insert fonksiyonları ile oldukça hızlı bir şekilde insert ediliyor.Buraya çok farklı parametreleri argüman olarak sağlayabilirsiniz. Bununla ilgili sitede açıklamalar mevcut. Örneğin aşağıda 45.32.xx.xx ip'de yer alan Cassandra sunucusu üzerinden MyKeyspace Cassandra veri tabanında yer alan MyTablo tablosuna her satırda 4 kolon olacak şekilde ve ayraç olarak TAB(\t) karakteri ile ayrılmış 60M satırlık csv dosyasını 10 paralel thread ile çalışacak şekilde insert etmesini, hata durumu oluşursa (eksik kolonlu satır vs.) 20000 hata oluşana dek bu işleme devam etmesini söylüyoruz. Dahasını ihtiyacınıza göre konfigüre edebilrisiniz.
./cassandra-loader -f /opt/cassandra-loader/MyTablo140to200M.csv -host 45.32.xx.xx -schema "MyKeyspace.MyTablo(col1, col2, col3, col4)" -delim "\t" -maxInsertErrors 20000 -maxErrors 20000 -numThreads 10
  • Uygulama dosyadaki satırları 100K lık kümeler halinde insert ederek bunları ilerleme durumunu ekrana basıyor.
    İşlem Durumu

  • İşlem logları da aynı dizinde .BADPARSE, .BADINSERT ve .LOG uzantılı dosyalar olarak tutuluyor.
  • Benim çalışmalarımda gördüğüm kadarıyla 60M kayıt yaklaşık 30 dakikada tablolara insert edilmişti.Dosyaların her biri yaklaşık 10GB ve bunları 30dakikada insert edebilmek çok güzel :)
Cassandra'ya geçişlerin en zorlu kısımlarından biri büyük verilerin yeni ortama aktarılması işlemi. Henüz bu işlemi bir kaç tık ile yapabilmek mümkün olmadığından bir miktar çalışma yapmak gerekiyor. Bu işlemi kolaylaştırmak için yazılmış güzel bir uygulamanın işimizi ne kadar kolaylaştırdığını anlatmaya çalıştım. Sizin de tecrübelerinizi paylaşmanızı bekliyorum. Yeni yazıda görüşmek üzere.