Şirketimizin en çok mücadele ettiği konu
olan Big Data problemini çözmekte önemli
bir araç olacağına inandığım NoSQL
sistemler içerisinde en yaygın kullanılan
MongoDB veritabanını sizler için inceleyip
bir derleme meydana getirdim.
MongoDB
NoSQL Database
Ferhat SARIKAYA / Veritabanı Yöneticisi
MongoDB
2014
İçindekiler
NoSQL Nedir? .......................................................................................................................................... 2
Neden NoSQL?......................................................................................................................................... 2
MongoDB................................................................................................................................................. 3
MongoDB ve SQL Server Karşılaştırmalı Performans Testleri ................................................................. 4
MongoDB Yönetim Araçları ..................................................................................................................... 9
MongoDB ve Business Intelligence ....................................................................................................... 10
MongoDB ve C# ..................................................................................................................................... 11
Ferhat SARIKAYA / Veritabanı Yöneticisi
1
MongoDB
2014
NoSQL Nedir?
NoSQL: Not Only SQL’in kısaltmasıdır. İlişkisel veritabanlarına (RDBMS) bir alternatif olarak ortaya
çıkmıştır. DDL ve DML işlemleri sırasında Klasik SQL dili kullanılmadığı için bu isimle anılmaya
başlanmıştır. Google ve Amazon gibi devler yıllardır bu teknolojiyi kullanmaktadır. Google kendi
tasarladığı Big Table, Amazon Dynamo ve Facebook’ta Cassandra’yı kullanmaktadır.
İlişkisel veritabanı sistemlerinde temel mantık tekrarlanan verilerin önüne geçilmesidir, bu sebeple de
tekrarlanacak veriler ayrı tablolarda tutulur ve sorgu esnasında joinlerle birleştirilirler, bu işleme
Normaliazsyon’da denmektedir, ileride değineceğimiz gibi Business Intelligence kısmında ise
performans için joinler ortadan kaldırılır ve veriler tekrar halinde tutulur, buna da Denormalizasyon
denir. Join sayısının ise üçten fazla olması performans kaybına yol açmaktadır ki kompleks yapılarda
rahatlıkla bu sayı üçün üzerine çıkmaktadır.
NoSQL sistemlerde ise veriler ilişkisel veritabanı modelinin aksine denormalizasyon halinde tutulurlar,
böylece verilere ulaşmak daha hızlı ve daha kolaydır. Ayrıca insert, update, delete işlemleri
dosyalarda yapılırken, select işlemi ram üzerine set edilmiş bilgilerden çekildiğinden oldukça hızlı
sonuç döndürmektedir.
Neden NoSQL?
Neden sorusuna cevap verebilmek için İlişkisel Veritabanı (RDBMS) modelini incelemek gerekir.
İlişkisel veritabanı modelinde verilerin işlenmesi transaction temellidir. Transactionların stabil
çalışması ve veri bütünlüğünün korumak için ACID standartına sıkı sıkıya bağlıdır. ACID’in açılımı
şöyledir:
Atomicity: Bir transaction sırasında bir işlemin başarısızlığı tüm işlemleri etkiler ve tümü başarısız
sayılır.
Consistency: Bir transaction, şema içerisinde tanımlanan foreign key, unique check gibi tüm kurallara
uymak zorundadır, aksi halde başarısız kabul edilir.
Isolaiton: Commit edilmemiş bir transaction içerisindeki işlemler yalnız transaction tarafından bilinir,
commit edildikten sonra işlem herkese yansır.
Durability: Commit edilen verinin veritabanına yazıldığından muhakkak emin olunmalıdır, commit
edildikten sonra veri yok olmaz.
Ayrıca İlişkisel veritabanı modelinde Propagation Constraint (PC) algoritmasını da kullanırlar. Bu
algoritma temelde tanımlanan veri yapısını korur ve ilişkisel modelde tanımlanmış bir veri üzerinde
anlamsız işlemler yapmanızı engeller. Örneğin Foreign Key olarak tanımlanmış ana tablodaki veriyi
silmek istediğinizde eğer bu veriyle alakalı bir kayıt ilişkili olduğu tabloda mevcut ise silme işlemini
gerçekleştirmenize müsaade edilmez, böylece veri bütünlüğü anlamlı bir şekilde korunmuş olur.
NoSQL = No ACID demek doğru olur, elbette bazı istisnalar mevcut. Big Table, HBase, CouchDB her ne
kadar NoSQL bir veritabanıysalar da bazı hizmetleri sayesinde ACID desteğini sağlamaktadır.
Ferhat SARIKAYA / Veritabanı Yöneticisi
2
MongoDB
2014
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:
Doküman (Document) Tabanlı: Bu sistemlerde bir kayıt doküman olarak isimlendirilir. Dokümanlar
genelde JSON formatında tutulur. Bu dokü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 doğmasındaki sebep yüksek veri kapasitesi sonucunda verilerin daha hızlı
işlenebilmesi ve daha hızlı sonuç döndürebilmesidir. Özellikle Petabyte boyutundaki verilerde dahi en
iyi performansı sağlamak üzere dizayn edilmişlerdir. DML işlemleri esnasında ilişkisel modelin kontrol
mekanizamlarının çoğundan arındırıldığı için oldukça ciddi performans sağlamaktadır ki Google,
Amazon ve Facebook gibi devlerin milyarlarca insana aynı anda hizmet verebildiğini
düşündüğümüzde performans ve hız açısından oldukça tatmin edicidir.
NoSQL sistemler, veritabanı dünyasının geleceği gibi görülmektedir. Her ne kadar ilişkisel modele
göre veri tutarlılığı konusunda zayıf olsa da ücretsiz oluşları, yatay genişlemeye müsait olmaları, çok
güçlü server konfigürasyonları gerektirmemeleri ve ilişkisel modeldeki cluster zorlukları ve
verimsizliklerinden arındırılmış ve oldukça performanslı çalışmaları NoSQL sistemleri cazibe merkezi
haline getirmeye başlamıştır.
Özellikle büyük boyutlu verilerin saklanması için maliyetleri yüksek ilişkisel veritabanlarından ve
serverlardan uzaklaşmak Google, Facebook gibi devlerin dahi tercihleri arasında yer almaktadır. Bu
tür sistemler yerine düşük maliyetli ve özellikli çok fazla sayıdaki serverlar üzerinde verilerini
saklamak ve cluster yapmak daha cazip hale gelmiştir. NoSQL sistemlerin bir çoğunda binlerce server
tek bir küme gibi hareket edebilir ve çok yüksek boyutlu verileri oldukça hızlı bir şekilde yazabilir
(İleride performans testlerinde de bu durum açıkça görülecektir).
MongoDB
MongoDB bir NoSQL veritabanıdır. Özellikle ilişkisel veri tabanlarındaki Big Data problemine çözüm
olarak geliştirildi. MongoDB, 10gen firması tarafından açık kaynak bir sistem olarak geliştirildi ve
kaynak kodlarına Git Hub üzerinden ulaşmak mümkün. 10gen, MongoDB’yi “Humongus” yani
Kocaman, Devasa olarak isimlendirmiştir, zaten ortaya çıkışı da tam da bu maksatladır.
C++ yazılım dili ile geliştirildi ve bilinen birçok işletim sistemi üzerinde çalışmaktadır: Windows, Linux,
Unix, MacOS. Önemli özelliklerine değinecek olursak:
Ferhat SARIKAYA / Veritabanı Yöneticisi
3
MongoDB
2014
•
•
•
•
•
•
•
•
•
•
•
•
•
İlişkisel veritabanlarındaki schema yoktur, bu yüzden collation gibi problemlerle uğraşılmaz.
Doküman tabanlı veritabanıdır, veriler JSON formatında set edilir, dokümana yazılırken BSON
formatında saklar ve karmaşıklıktan kurtulmasını bu şekilde sağlar.
Dokümanın her özelliğine ve anahtarına (key) göre indexleme sağlar.
Sıkça kullanılan okuma işlemi sorgulamalarında yüksek performans göstermektedir.
Verilerin yazılması esnasında yüksek performans göstermektedir.
High Availability (Yedeklilik) desteği bulunmaktadır.
Auto Sharding özelliği sayesinde aynı verinin birden çok yerde işlenmesi ve bulunabilmesi ile
yatay ölçeklendirme yapılabilmektedir. Bunun yanında dikey ölçekleme yapabilmekte
mümkün.
Ölçeklemeyi sağlayabilmek için Master – Slave Replication desteği sunar.
Master: Yazma işleminin yapıldığı sunucudur.
Slave: Okuma işleminin yapıldığı ve ölçeklendirmenin sağlandığı sunucudur. Master sunucu
herhangi bir şekilde fail olursa Slave sunuculardan biri Master olarak atanır.
Doküman tabanlı oldukça kompleks sorgular yazmak mümkündür.
Map / Reduce özelliği sayesinde kolay analiz etme ve kolay veri işlemeyi sağlar.
Map: Tüm verileri sırayla parametre şeklinde alır, key – value yapısına çevirir.
Reduce: Map’in döndürdüğü key – value değerlerini yakalayarak üzerinde işlem yapmamızı
sağlar.
Fultext search desteği bulunmaktadır.
GridFS ile birlikte dosyaları veritabanı içerisinde saklamak mümkündür.
Sürekli genişleyen yapılar için oldukça uygun, birden fazla server üzerinde sorunsuz
çalışabilmektedir.
MongoDB’nin popüler yazılım dillerinin birçoğuna driver desteği bulunmaktadır. Bunlardan bazıları:
C#, C++, C, Ruby, PHP, Python, Erlang, Perl.
Özellikle artık yaygın bir metot olarak kullanılan ORM tabanlı yazılım geliştirme modeline daha uygun
bir yapı. SQL Server kullanılan bir projede LinQ veya Entity Framework gibi ORM tool kullanmak pek
avantajlı olmuyor, çünkü SQL Server her sorguyu önce maliyetlendiriyor ve sonra yol hesabı yapıyor,
daha sonra buna göre sorgu sonucunu döndürüyor. Bu tür maliyet ve yol hesaplarından sıyrılmak için
stored procedure kullanmak daha makul. Her ne kadar ORM tool içinde bu mümkünse de maalesef
yazılımcıların çoğu burada stored procedure’den bilgiyi almak yerine ORM tool’un syntax’ını tercih
ediyor; fakat yine de ACID yapısından ötürü SQL Server veya diğer ilişkisel veritabanları sonuç
döndürmede oldukça yavaş kalıyor.
MongoDB ve SQL Server Karşılaştırmalı Performans Testleri
Burada birkaç test sonucu ile ilgili verileri paylaşacağım. Temelde amacım şuan kullandığımız sisteme
alternatif olarak sunduğum MongoDB’nin bize sağlayacağı artıları gösterebilmek.
1) İlk olarak bakacağımız test SQL Server 2008 ile MongoDB’nin karşılaştırılması üzerine Michael
Kennedy’nin yaptığı test sonuçları göreceğiz.
Ferhat SARIKAYA / Veritabanı Yöneticisi
4
MongoDB
2014
Web adresi: http://blog.michaelckennedy.net/2010/04/29/mongodb-vs-sql-server-2008performance-showdown/
Insert İşlemi Testi
Görüldüğü gibi 1.000 kayıttan sonra ciddi bir fark başlıyor ki 50.000 kayıt SQL Server üzerinde 160
saniye sürerken, aynı işlem MongoDB üzerinde yalnızca birkaç saniye alıyor.
Yine insert işlemi için aynı anda 5 kullanıcı üzerinden veri gönderimi yapılıyor ve sonucu:
Görüldüğü gibi MongoDB neredeyse 100 kat daha hızlı sonuç veriyor.
Yine LinQ ORM aracı kullanılarak basit bir class tanımı ile insert işlemi yapılıyor.
Class yapısı SQL Server ve MongoDB’de aynı:
Ferhat SARIKAYA / Veritabanı Yöneticisi
5
MongoDB
2014
MongoDB ile işlemi sonucu:
SQL Server ile işlem sonucu:
Görüleceği üzere yine fark 100 kat.
Select İşlem Testi
Paralel 5 kullanıcı ile select sorgusu performans sonuçları şöyle:
Görüleceği üzere 1/3 oranında bir zamanla MongoDB işlemi gerçekleştiriyor.
Ferhat SARIKAYA / Veritabanı Yöneticisi
6
MongoDB
2014
Yine kompleks sorgulara bakıyoruz:
MongoDB doküman yapısı:
SQL Server tablo yapısı:
Sorgu sonucu:
Ferhat SARIKAYA / Veritabanı Yöneticisi
7
MongoDB
2014
Görüleceği gibi kompleks sorgularda da MongoDB, SQL Server’a oranla 1/3 oranında bir zamanla
işlemi bitirebiliyor.
2) İkinci bakacağımız performans testi ise Windows Server 2012 üzerinde 64 bit edition üzerinde
yapılıyor. 4 GB Ram bulunuyor ve bir instance çalışıyor. SQL Server 2012 Developer Edition 64
bit sürümü ile MongoDB 2.4.8 64 bit edition karşılaştırılıyor.
Web adresi: http://geekswithblogs.net/EltonStoneman/archive/2013/12/13/theconcurrency-shoot-out-sql-server-versus-mongodb-part-1.aspx
SQL Server yapısı:
MongoDB Yapısı:
Ferhat SARIKAYA / Veritabanı Yöneticisi
8
MongoDB
2014
1.000 ve 10.000 iş akışı ve 100 eş zamanlılık üzerine yapılan test sonucu:
Görüleceği üzere MongoDB 6 kat daha hızlı sonuç vermektedir.
MongoDB Yönetim Araçları
1) Nucleon Database Master: MongoDB, NuoDB, Oracle, MySQL, PostgreSQL, FireBird, SQLite,
SQL Server, SQL Azure, IBM DB2, IBM Informix, Netezza, Ingres sistemlerin yönetimini
yapabilen bir yönetim aracı.
MongoDB konusunda destekleri: JSON Query Editor, Advanced Data Editing, Collection
Manager, Index Manager, GridFS Manager, Visual Map & Reduce Editor, Visual Query Search,
Tree and Table style data view and rich data export features to common file formats.
Lisans Ücretleri
Database Master Ürünü:
Professional License: 69 USD
Professional License + Subscription: 79 USD
Enterprise License: 179 USD
Enterprise License + Subscription: 189 USD
Ferhat SARIKAYA / Veritabanı Yöneticisi
9
MongoDB
2014
Business Intelligence Studio Ürünü:
Professional License: 149 USD
Professional License + Subscription: 159 USD
Enterprise License: 479 USD
Enterprise License + Subscription: 489 USD
Ultimate License + Subscription Ürünü:
BI Studio and Database Master: 2.000 USD
2) Mongovue: MongoDB ile birlikte SQL Server, MySQL ve PostgreSQL desteği de veriyor. Bu
databaselerden MongoDB’ye veri import edebiliyor. Ücretsiz sürümünde Monitoring desteği
vermiyor; ama ücretli sürümlerde her destek mevcut.
Lisan Ücretleri
Standart: 35 USD, yalnız bir kullanıcı lisansı
Enterprise: 350 USD, 25 kullanıcı lisansı
Enterprise Gold: 500 USD, 100 kullanıcı lisansı
Enterprise Platinum: 1.000 USD, 250 kullanıcı lisansı
Enterprise Diamond: 2.500 USD, Limitsiz kullanıcı lisansı
3) NoSQL Viewer: MongoDB, Couchbase, Apache CouchDB, Cassandra, HBase databaselerine
full destek veriyor. Oldukça profesyonel gözüküyor. Lisans ücretleri ise ihtiyaca ve kullanıcı
sayısına göre değişkenlik gösteriyor.
4) Robomongo: Grafik tabanlı bir diğer yönetim aracı da Robomongo. MongoDB Shell Script
kullanarak işlemleri gerçekleştirdiği için tam destek veriyor. Kullanımı oldukça kolay ve bir çok
platformda çalışıyor. Lisans ücreti olmadığı için tercih edilen bir araç.
5) UMongo: Grafik tabanlı bir yönetim aracı. Robomongo gibi tam hakimiyet sağlıyor ve
ücretsiz.
6) RockMongo: PHP 5.5 ile geliştirilmiş bir ara yüze sahip. Bir çok işlemi yapabilmek mümkün ve
ücretsiz.
MongoDB ve Business Intelligence
Business Intelligence (BI) sürecinde verilerin denormalize halde tutulduğunu düşündüğümüzde ve
yukarıdaki birçok bilgiyi göz önüne aldığımızda SQL Server’a oranla daha verimli ve daha hızlı bir
yaklaşım sergilemek mümkün gözüküyor. Big data konseptinden ötürü MongoDB için oldukça iyi BI
araçları bulunmaktadır; ama elbette bunu değerlendirmek hususunda BI Developerlar daha doğru bir
tercih yapacaktır. Bu kısımda kullanılabilecek bazı araçları aşağıda sıraladım.
1) Jaspersoft: Müşterileri arasında Ericson, Juniper gibi devler bulunuyor. ETL işlemini yapmaya
gerek görmeksizin dönüşüm işlemlerini yapabiliyor. Özellikle ram üzerinde analiz yapabiliyor
olması şüphesiz hızlı işlem yapabilme ve ciddi performans kazançları sağlıyor gibi.
Raporlamalarda ise HTML5 desteği önemli bir artı gibi duruyor.
Ferhat SARIKAYA / Veritabanı Yöneticisi
10
MongoDB
2014
2) Penthano: Önemli ve etkili araçlardan biri de Penthano. Jaspersoft’tan sonra özellikleri
açısından gözüme çarpan ikinci araç oldu.
3) Nucleon BI Studio: bir önceki “Yönetim Araçları” bölümünde ayrıntılı bilgi vermiştim.
MongoDB ve C#
Şirketimizde C# dili kullanıldığı için MongoDB’nin kullanım şekline yönelik basit bir class yapısı örneği
geliştireceğim. Böylece MongoDB üzerinde yazılım geliştirme konusunda ufak bir fikir verebilir
düşüncesindeyim.
Geliştirme ortamımızın Visual Studio 2012 olduğunu varsayıyorum, bunun için MongoDB’nin C#
driverını kurmamız gerekiyor. NuGet Packages üzerinde “Official MongoDB C# Driver” yazmak yeterli,
kurulum otomatik yapılıyor.
Şimdi bir eğitim platformu geliştirdiğimizi varsayıyorum ve Ogrenci class’ımızın metotlarını
yazıyorum:
static void OgrenciEkle() // öğrenci ekleme fonksiyonumuz
{
MongoClient client = new MongoClient();
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("Ogrenciler");
var ogrenciler = db.GetCollection("Ogrenci");
ogrenciler.Insert(new BsonDocument
{
{"Ad","Ferhat"},
{"Soyad","SARIKAYA"},
{"Yas",36},
{“Numara”, 123456}
});
}
static void OgrenciDuzenle()// öğrenci bilgilerini düzenleme fonksiyonumuz
{
MongoClient client = new MongoClient();
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("Ogrenciler");
var ogrenciler = db.GetCollection("Ogrenci");
var sorgu = new QueryDocument { { "Numara", 123456 } };
var ogr = ogrenciler.Find(sorgu).FirstOrDefault();
var guncelle = new UpdateDocument { { "$set", new BsonDocument("Soyad", "Sarıkaya") } };
ogrenciler.Update(sorgu, guncelle);
}
static void OgrenciSil()//öğrenci silme fonksiyonumuz
{
Ferhat SARIKAYA / Veritabanı Yöneticisi
11
MongoDB
2014
MongoClient client = new MongoClient();
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("Ogrenciler");
var ogrenciler = db.GetCollection("Ogrenci");
var sorgu = new QueryDocument { { "Numara", 123456 } };
ogrenciler.Remove(sorgu);
}
static void OgrenciListele()//öğrencileri listelediğimiz fonksiyonumuz
{
MongoClient client = new MongoClient();
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("Ogrenciler");
var ogrenciler = db.GetCollection("Ogrenci");
var liste = ogrenciler.FindAll();
foreach (var ogr in liste)
{
Console.WriteLine(ogr["Ad"] + " " + ogr["Soyad"] + " " + ogr["Yas"] + “ ” + ogr[“Numara”]);
}
}
Ferhat SARIKAYA / Veritabanı Yöneticisi
12