İyi ki doğdun e-Bergi! Yazımıza geçmeden, başta ODTÜ Bilgisayar Topluluğu olmak üzere bu projenin buralara gelmesinde emeği geçen, sabahlayan, ödevlerini bırakıp yazılar yazan, düzenleyen, yayınlayan gönüllülere teşekkür etmek istiyorum. 7 yıl önce Türkçe kaynak eksikliğini bir nebze olsun gidermek için başlattığımız bu projenin emin ellerde olduğunu görmek kadar mutlu edici bir şey yok gerçekten.
Çok fazla duygusallaşmadan konumuza gelelim. Bu yazıda elimden geldiğince sizlere NoSQL veritabanlarından bahsedeceğim. NoSQL, ilişkisel veritabanlarının eksiklerini gidermek amacıyla ortaya çıkmış yeni ve bir hayli geniş bir olgu. Başta bunun üzerinde durmakta fayda var, NoSQL bir metot yada tasarım değil daha çok bir olgu ve hareketi temsil ediyor. Doğru açılımı "Not only SQL (ilişkisellikten öte)" olan NoSQL, bu yanılgı nedeniyle bazı kişiler ve kaynaklar tarafından "No-SQL" (ilişkisel olmayan) olarak adlandırılıyor. Her ne kadar yazinin devamında bahsedeceğim nedenlerle genelde ilişkisellikten ödün veriliyor olsa da, amaç ilişkisel veritabanlarına rakip olup tam tersini yapmak değil, teknolojinin gelişmesiyle oluşan gereksinimlere cevap vermektir. Bu gereksinimlere cevap verdiği sürece bir NoSQL veritabanının ilişkisel olmasına hiçbir engel de yoktur.
İlişkisel veritabanları ve eksikleri
NoSQL konseptini daha iyi anlayabilmek için öncelikle geleneksel yaklaşımı ve eksikliklerini inceleyelim. Eğer ilişkisel veritabanlarına aşina değilseniz devam etmeden önce "İlişkisel veritabanları" yazımıza göz atmanızı tavsiye ederim.
Öncelikle şunu belirtmek gerekiyor ki ilişkisel veritabanları hala oldukça geçerli ve yaygın kullanılan bir teknoloji ve çoğu koşulda kullanılmasında hiçbir sorun bulunmamakta. Asıl sorun, kullanıcı sayınız ve saklamanız gereken veri miktarı artmaya başladıkça kendini göstermeye başlıyor. Bir uygulamanın veri miktarı, kullanıcı sayısı ve kullanım miktarı ile başedebilmesine bilgisayar biliminde ölçeklenebilirlik (scalability) denir, ve bu konuda yaşanan problemlerin hatırı sayılır bir kısmını veritabanları oluşturur. Bu konuda ilişkisel veritabanlarının yaşadığı en temel problemlere örnek vermek gerekirse:
-Tablolardan birinin artık bir diske sığamayacak kadar büyümesi
-Bir tabloya eşzamanlı değişiklik yapmaya çalışan çok fazla bağlantı olması
-Bir veritabanı sunucusundan veri talep eden çok fazla bağlantı olması
Ve daha niceleri. Bu problemleri ilişkisel veritabanlarında çözmenin yolları olsa da, harcadığınız çaba veri miktarına bağlı olarak üstel bir şekilde artarak bir noktadan sonra kabul edilemez seviyeye geliyor. İşte tam bu noktada NoSQL veritabanları devreye giriyor. NoSQL veritabanlarının avantajlarından bazıları şunlar:
-**Veri miktarı:** İlişkisel veritabanlarında veriniz büyüdükçe "dikey/yatay ölçekleme" (vertical/horizontal scaling) gibi onlarca takla atmanız gerekir. Çoğu zaman bu attığınız taklalar sonucu ilişkisel veritabanlarının en önemli özelliğini, ilişkiselliği feda etmeniz gerekir. Çoğu NoSQL veritabanında bu problem göz önünde bulundurularak veri ölçeklenebilirliği kendiliğinden desteklenmektedir.
-**Performans:** İlişkisel veritabanlarının bir diğer sorunu ise kullanıcı sayısıdır. Kullanıcı sayısı veritabanı sunucusuna bağlantı sayısıyla doğru orantılı olduğundan, bir süre sonra sunucularınız yetersiz gelmeye başlar. Başlarda buna "sahip/köle kopyalaması" (master/slave replication) gibi çözümler bulunsa da bu sefer sistemimize tedbirini almamız gereken "kırılma noktaları"(single point of failure) eklenecektir. Bir diğer problem ise tablolara yapılan değişiklikler süresince tablolar kilitleneceğinden, yeni veri ekleyen yada verilerini güncelleyen kullanıcı sayısı arttıkça performansta gözle görülür yavaşlamalar oluşmaya başlar. Dahası sunucu sayınızı iki-üç katına bile çıkarsanız, çoğu zaman performansınızdaki artış çok düşük seviyelerde olur. NoSQL veritabanları bu problemleri de göz önüne aldığı için çoğunda çok çaba sarfetmeden performans problemlerinizi çözebilirsiniz, ayrıca yine çoğunda sunucu sayınızla performansınız doğru orantılı olarak yükselir.
-**Veri yapıları:** Farklı NoSQL veritabanları veriyi farklı şekillerde tutar ve sunar. Bu da bazı uygulamalar, programlama dilleri ve geliştiriciler için ekstra anlaşılırlık ve kolaylık sağlar. Örneğin döküman tabanlı veritabanları nesne yönelimli dilleri kullanan geliştiriciler tarafından çok sevilmekte ve yaygın olarak kullanılmaktadır.
-**Sistem yönetimi:** NoSQL veritabanları büyük uygulamalar ve çok sayıda sunucu kullanımı fikrine dayanarak tasarlandıkları için sistem yöneticileri için büyük kolaylıklar sağlar. Bir sunucu havuzuna sunucu ekleyip çıkarmak genelde bir satırı değistirmek yada bir komut girmek kadar kolaydır. Aynı nedenle sunucularınıza bakım yapmanız gerekirse uygulamanızı bakım moduna almanız gerekmez.
Peki her şey bu kadar NoSQL veritabanlarının lehine ise neden bütün uygulamalar NoSQL'e geçmiyor? Neden hala yeni başlayan projelerin büyük bir kısmı ilişkisel veritabanlarını tercih ediyor? Buradan anlıyoruz ki NoSQL veritabanlarının da eksik oldukları, yada zorluklar yaşadıkları noktalar var, şimdi de bunlara göz atalım.
NoSQL problemleri
-**Yeni teknoloji:** NoSQL'in problemlerinden bahsederken bence en başta gelmesi gereken şey çok yeni bir teknoloji olması. İlişkisel veritabanları 40 yıldan daha uzun bir süredir kullanılıyor ve tabi ki bunun getirdiği bir bilgi birikimi, kullanıcı kitlesi ve ürün olgunluğu var. NoSQL'in göreceli olarak yeni olması bu konularda insanları haklı olarak korkutuyor. Öte yandan orta ölçekli uygulamaların ilişkisel veritabanı kullanmasında uygulanabilirlik açısından bir problem bulunmadığından, haliyle mühendisler ve sistem yöneticileri bildikleri teknolojiyi kullanmayı tercih ediyorlar.
-**Farklı düşünce yapısı:** NoSQL veritabanları ilişkisel veritabanlarının açıklarını kapatmak için çeşitli yollara başvurmakta. Yazıda daha önce de belirttiğimiz gibi birçok NoSQL veritabanı, bunu ilişkisellikten ödün vererek yapıyor. Yine farklı NoSQL veritabanları veriyi farklı yapılarda tutuyorlar. Hal böyle olunca uygulamaların tasarımını yapan mühendislerin düşünce yapılarını tamamen değiştirmeleri gerekiyor. Yıllardır veri katmanının tasarımını ilişkisel olarak yapmış olan kişiler için şimdi farklı bir biçimde düşünmek gerçekten çok zor olabiliyor. Bu da yazılımı tasarlayanların ilişkisel veritabanlarını tercih etmeleri için bir başka neden oluşturuyor.
-**Taşıma zorluğu:** Bir önceki maddede bahsettiğimiz gibi ilişkisel veritabanı ve NoSQL veritabanı kullanan sistemlerin tasarımları genelde oldukça farklılık gösteriyor. Dolayısıyla ilişkisel veritabanı kullanan ve biraz ilerlemiş bir projenin NoSQL veritabanına taşınması büyük uğraş gerektiriyor.
-**CAP ve ACID prensipleri:** Bu iki prensip senelerdir veritabanlarının veri tutarlılığının maksimize edilmesi için kullanılagelmişken, çoğu NoSQL veritabanı hız ve ölçeklenebilirlik adına tutarlılıktan ödün vermek gibi yeni bir yaklaşım ortaya çıkarmıştır. Bu da senelerdir veri tutarlılığını el üstünde tutan uygulama geliştiricileri ve sistem yöneticileri tarafından kabul edilmesi zor ve korkutucu bir durum oluşturmuştur. Bu iki prensip hakkında bilgiyi kaynakçadaki linklerden bulabilirsiniz.
** NoSQL türleri ve kullanım alanları **
Günümüzde NoSQL veritabanları kabaca 4 gruba ayrılmaktadır.
-**Anahtar-değer tabanlı:** Bu yöntem en temel yöntemlerden biridir. Veri, bir anahtar ve buna karşılık gelen değer şeklinde kayıt edilir. Sorgulama yaparken de yine bu anahtar aracılığıyla bilgiye ulaşılır. Örnekler: Redis, Riak, Voldemort, Tyrant
-**Sütun tabanlı:** Bu tür veritabanı genelde çok büyük miktarlarda veri tutmak için kullanılır. Anahtar-değer veritabanlarında olduğu gibi bir anahtar bulunur, ancak bu anahtar sadece bir değere işaret etmek yerine sütun gruplarına işaret eder. Örnekler: Cassandra, HBase
-**Döküman tabanlı:** Anahtar-değer veritabanlarına benzer bir diğer yaklaşım olan döküman tabanlı veritabanlarında, değer kısmı da veriyi anahtar-değer olarak tutar. Bu iç içe geçmiş yapı sayesinde birbiriyle alakalı bütün veriler aynı yerde tutulur ve ulaşılması çok kolaydır. Örnekler: MongoDB, CouchDB
-**Çizge tabanlı:** Bu veritabanı türünde ise veriler tamamen farklı bir şekilde, çizge şeklinde tutulur. Diğerlerinden oldukça farklı olan bu veritabanı türü, çizge yapısındaki veriler için oldukça performanslı sorgulama sağlar. Örnekler: Neo4J
** Son Söz **
NoSQL çok ümit verici ve çağın gereksinimlerine cevap vermek için doğmuş bir kavram. Her ne kadar internet üzerinde NoSQL ve ilişkisel veritabanları rakip olarak gösteriliyor ve birinin diğerinden üstün olduğu kanıtlanmaya çalışılıyor olsa da, benim kişisel görüşüm her ikisinin de kullanım alanlarının farklı olduğu ve birinin diğerini silemeyeceği. Birçok şirket de benimle aynı fikre sahip olsa gerek ki bu iki teknolojiyi birlikte kullanıyorlar. Hatta yine birçok şirket birden fazla NoSQL veritabanını bir arada kullanıyor. Görünen o ki internet devlerinin önderliğinde gelişen NoSQL konsepti yakın gelecekte internet standartları arasında yerini alacak, bekleyelim, görelim.