NoSQL, 1998 yılında ilk Carlo Strozzi tarafından ortaya çıkarılmıştır. SQL arayüzü olmayan bu veri depolama sistemine, tasarımcısı Carlo Strozzi, ilişkisel olmayan anlamında (No Relation) isim koyması gerektiğini düşünür.
NoSQL kavramı 2009 yılı başlarında, Rackspace şirketinin çalışanlarından Eric Evans tarafından, açık kaynak dağıtık veritabanları sistemlerinin görüşüleceği bir toplantı düzenlenmek istendiği dönemlerde tekrardan kullanılmaya başlanmıştır. Eric Evans aslında bu isimle sürekli olarak ortaya çıkmaya başlayan, ilişkisel olmayan dağıtık veri depolama sistemlerine bir damga vurmayı amaçlamaktaydı.
NoSQL kavramı, aslında yıllardır bilişim dünyasında vazgeçilmez bir yere sahip olan ilişkisel veritabanı sistemlerine alternatif olarak ortaya çıkan, 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 adlandırmadır. NoSQL sistemlerinde RDBMS’de kullanılan SQL dili kullanılmadığı için “No SQL” adı verilmiştir. Henüz endüstri standardı olarak kabul görmemesinden dolayı kimi zaman “Not Only SQL” olarak da adlandırılır. Kimileri bunu yeni teknoloji olarak görürken, kimileri de bu sistemlerin tek başına yeterli olamayacağını düşünüyor. 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 geniş büyüklükteki internet verisini RDBMS bir sistemde değil, Big Table üzerinde saklıyor. Ayrıca 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 deneniyor.
NoSQL ve RDBMS Farkları Nelerdir?
RDBMS’ler işlem (transaction) tabanlı çalışan
sistemlerdir. Bu işlemlerin düzgün ç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), Uygunluk (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.
RDBMS’lerde veriler tablolarda, tanımlı sütunlarda
satır satır tutulurken, 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..
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.
NoSQL sistemlerin bazılarında MapReduce yeteneği bulunmaktadır. Bu sayede RDBMS üzerinde SQL ile
gerçekleştirilmesi çok kompleks olan analizler, MapReduce ile kolay bir şekilde gerçekleştirilebilir.
NoSQL
Facebook, Twitter, Foursquare gibi teknoloji firmaları tarafından da
kullanılıyor. Foursquare'de birçok kontrol yapılmasına rağmen bu kadar hızlı
check-in olunması ya da başka check-in’leri görüntülemeyi hızlı yapmasını NoSQL’
bağlamak gerekir. Yine Twitter'da bir tweet'i aradığınızda anlık olarak veri
çekmesi de aynı sistemin avantajıdır.
Twitter NoSQL Döküman Simülasyonı |
MongoDB geliştirme ve ölçekleme kolaylığı için tasarlanmış açık kaynak, belge yönelimli(document-oriented) veritabanı olarak tanıtmaktadır. MongoDB’de her kayıt, aslında bir dökümandır. Dökümanlar MongoDB’de JSON benzeri Binary JSON(BSN) formatında saklanır. BSON belgeleri, sakladıkları elemanların sıralı bir listesini içerir nesnelerdir. Her bir eleman, bir alan adı ve belirli tipte bir değerden oluşur.
MongoDB’ye ait kavramlarla, RDBMS sistemlerde var olan SQL’e ait kavramların karşılaştırılması tabloda yapılmıştır.
RDBMS
|
MongoDB
|
Database
|
Database
|
Table
|
Collection
|
Row
|
Document ya da BSON
Document
|
Column
|
Field
|
Index
|
Index
|
Table Joins
|
Embedded Documents ve Linking
|
Primary Key
Specify Any Unique Column ya da Column Combination as Primary Key |
Primary
Key
In MongoDB
The Primary Key is Automatically Set
to the _id Field
|
Aggregation (group by)
|
Aggregation Framework
Framework Mapping Chart |
Neden MongoDB Kullanılmalı?
MongoDB, kendisini diğer NoSQL çözümlerinden ayıran ve öne çıkaran önemli avantajlara sahiptir. Bunlardan bazıları:
- Sorgu(Query) Desteği: Pek çok NoSQL çözümü veriye sadece anahtarlar üzerinden erişme olanağı sağlarken, MongoDB istenilen alanlar ve belirli aralıklara göre, ayrıca düzenli ifadelerle(regular expression) de sorgulama imkanı sağlamaktadır.
- İkincil(Secondary) Index Desteği: İstenilen alanlara göre sorgulama yanı sıra, bu alanları ikincil indeks olarak tanımlayabilmek, veriye daha performanslı erişim imkanı sağlamaktadır.
- Master/Slave Replication Desteği: Yazma ve okuma işlemlerini ayrı sunuculara yönlendirebilme, ana sunucu erişilemez olduğunda bir köle sunucuyu ana sunucu olarak çalıştırabilme kuşkusuz çok önemli bir artı değer sağlamaktadır.
- Sharding Desteği: Büyük ölçekli verilerin sunucular arasında paylaştırılması özelliği de MongoDB’yi benzerlerinden artı değerler sağlamaktadır.
- MapReduce Desteği
- Sürücü(Driver) Desteği
MongoDB Compass 100 Yıllık Hava Rapor Veri Simülasyonu |
Bir sonraki yazımda görüşmek üzere...