MongoDB Nedir ?

MongoDB nedir ? sorusuna cevap vermeden önce muhtemelen NoSQL nedir ? sorusuna cevap vermek daha iyi olacaktır zira MongoDB bir NoSQL veri tabanı sistemidir.

NoSQL nedir ?

Genel olarak MongoDB üzerinde duracağımız içinNoSQL konusuna bilgi olması amaçlı değinmek istiyorum. NoSQL adı ” Not Only SQL” den gelmektedir yani sadece SQL değil, ne demek bu ? RDBMS sistemlerden farklı bir yapıda olduğunu anlatıyor aslında, bunun en büyük göstergesi de ilişkisel olmayan veri tabanları olmalarıdır desek yanlış olmaz. RDBMS sistemleri ACID(Atomicity  Consistency Isolation  Durability) kurallarına uymak zorundadır yani bir RDBMS veritabanı sistemi aynı anda tüm bu kuralları yerine getirmek zorundadır fakat NoSQL sistemlerde böyle bir zorunluluk bulunmuyor NoSQL sistemler benim daha performanslı olmamı sana daha hızlı işlem yaptırmamı istiyorsan biraz nazımı da çekip bazı kurallarda bana tolerans göstereceksin diyor adeta, NoSQL göreceli olarak senaryonuza bağlı olarak RDBMS sistemlerden çok daha performanslı çalışabilir fakat güvenlik ve veri bütünlüğü konusunda şuan için RDBMSlerden daha geride bulunuyorlar.

Resim5.jpg

 

NoSQL vertabanı çeşitleri

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, Bigtable, DynamoDB 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.

Bazı kaynaklarda döküman tabanlı veritabanı sistemlerinden bazıları Kolon tabanlı olarak da gösterilmektedir. Bizim değineceğimiz MongoDB veritabanı sistemi de Döküman tabanlı sistemler arasında yer almaktadır.

Burada değinmek istediğim bir diğer konu olarak CAP teoremini biraz anlatmakta fayda var böylelikle sistem farklılıkları biraz daha net anlaşılmış olacaktır.

Consistency(Tutarlılık) : Verilerin çıkan sonuçla olan tutarlılık derecesi

Availability(Kullanılabilirlik) : Sistemin aynı anda bir kaç kullanıcı tarafından kullanılabilir olma durumu

Partition-Tolerance(Bölme): Verilerin parçalara ayrılarak işleme sokulma durumu

Aşağıdaki şekilde hangi veritabanlarının hangi şartları sağladığını daha iyi şekilde anlayabiliriz. Bu durumda MongoDB bize Tutarlılık ve Verilerin bölümlendirilmesi açısından olanak sağladığını göstermektedir.

Resim9.jpg

Aşağıdaki şekilde ise herhangi bir özelliği kullanamadığımızda kullanıcıların nasıl bir sistem ile karşı karşıya olduğunu göstermektedir.

Resim10.jpg

MONGODB

MongoDB NoSql veri tabanı sistemlerinin Doküman tabanlı sistemlerinden biridir. Veriler JSON\BSON formatında saklanır.

Resim1

Peki JSON ve BSON nedir ?

JSON verilerin XML benzeri formatta ama daha da sıkıştırılmış ve boyutu daha küçültülmüş halde tutulmasıdır. Böylelikle boyutun küçülmesinin yanında işlem hızı da daha iyi seviyede olmaktadır.

BSON ise JSON verilerin encode edilmiş halidir yani bir kademe daha sıkıştırılmış hali olarak da düşünülebilir.

Resim2.png

MongoDB ye dönecek olursak MongoDB de veriler belirli ID’ler tanımlanarak tutulmaktadır ve bu sayede sorgulamalarda yüksek performans göstermektedir.

Diğer NoSql sistemlere oranla daha zengin bir sorgulama diline sahiptir.

Veriler yatay ölçeklendirme ile yedeklenebildiği için kullanılabilirlik oranı oldukça yüksektir.

MongoDB NoSql veri tabanlarının doküman tabanlı veri tabanlarından biridir ve en çok tercih edilen veri tabanları arasında bulunmaktadır. MongoDB’yi diğer NoSql veri tabanlarından ayıran kendine has bazı özellikleri vardır. Bunlar;

Sorgu(query) desteği. Pekçok NoSQL çözümü veriye sadece anahtarlar(key) üzerinden erişme olanağı sağlarken, MongoDB istenilen alanlar ve belirli aralıklara(range query) göre, ayrıca düzenli ifadelerle(regular expression) de sorgulama imkanı sunuyor.

İkincil(secondary) index desteği. İstenilen alanlara göre sorgulama yanı sıra, bu alanları secondary index olarak tanımlayabilmek. Bu Sqlde kullanılan non-clustered index olarak da düşünülebilir.

MongoDB Altyapısı

Aggregation: Dağınık halde bulunan verileri toplayıp gruplandırmak ve bunlar üzerinden gerekli işlemleri yapmak.

Resim3.jpg

Map-Reduce desteği: Böl gönder, topla gönder. Burada kullanıcının sisteme yüklediği veriler mapperlar ile parçalara bölünür ve gerekli alanlara dağıtılır, bu sayede işlemler daha hızlı yapılır ve sistemin her alanına aktarılan yük dahada azaltılmış olur, sistem tarafından gerekli işlemler yapıldıktan sonra bu veriler Reducer’lar ile tekrar bir araya getirilir ve kullanıcıya aktarılır.

Resim4.jpg

Text Search: MongoDB içerisinde bir metin arama desteği bulunmaktadır. Bunun için bir string ifadeyi $text fonksiyonunu kullanarak arayabilirsiniz. Bana sorarsanız mongodb’nin en güzel özelliklerinden biri de budur istediğiniz zaman hiç bir zorluk yaşamadan bir metin arayabilir ve bulabilirsiniz bu işlemi RDBMS sistemlerde MsSQLde yapmak için Full text search özelliğini kullanmak gerek bazen bunun için taklalar atmanız bile gerekebiliyor.

Resim5.jpg

Data Models: MongoDB’nin veri tutma biçimi Sqlden farklı bir halde bulunmaktadır. Bir dizi içerisinde string ve integer ifade bulunabilir. Bu özellikte RDBMS sistemlerden fark olarak düşünebileceğimiz bir özellik.

Resim6.jpg

Indexes: MongoDB de indexler birkaç şekilde tanımlanabilir. Bunlar;

Single Field

Compound Index

Multikey Index   

Geospatial Index

Text Index

Hashed Index

Replication: MongoDB’nin herhangi bir server hatası durumunda kendini güvenceye alması. RDBMS sistemlerdeki Disaster Recovery’ler benzeri olarak da düşünülebilir. Ana sunucunun her hangi bir sorunla karşılaşması tehlikesine karşın yedek sunucular ile verilerin yedeklenmesi ve ana sunucuda sorun gerçekleştiğinde yedek sunucunun ana sunucu görevini üstlenip veri kayıplarını engellemesi için gerekli bir özelliktir.

Resim7.jpg

Master-Slave Replication desteği: Yazma ve okuma işlemlerini ayrı sunuculara yönlendirebilme. Replication özelliğinin bir alt özelliği olarak da düşünülebilir. Yine aynı şekilde ana sunucu ve yedek sunucular oluşturulabilir. Burada ek olarak yazma ve okuma işlemleri ayrı sunuculardan yapılabilir böylelikle sunucular üzerindeki trafik ve yük azaltılacağından performans açısından önemli bir artış daha sağlanabilir.

Sharding desteği: Büyük ölçekli verilerin sunucular arasında paylaştırılması özelliği. MongoDB de performansın en öncelikli konu olduğundan bahsetmiştik bu nedenle bazen veriler çok büyük boyutlara ulaştığında tek bir sunucu artık bizim için yetersiz bir hal alabilir bu nedenle yeni sunucular ile yatay büyümeye giderek veriler bu sunuculara dağıtılır ve yük azaltılmış olur.

Resim8.png

 

Yatay(Horizontal) – Dikey(Vertical) büyüme

NoSQL sistemler ve MongoDB yatay Büyüme ile RDBMS sistemler Dikey büyüme ile büyüme işlemi yapar demiştik peki nedir bu büyüme çeşitleri;

Dikey büyüme: Sunucu özelliklerini arttırma. Burada elimizde bulunan mevcut sunucunun özellikleri(CPU, Memory, Disk vb.) arttırılır. Bu bi açıdan her konuda çok maliyetli olabilir ve bir sunucunun özelliklerinini ne kadar arttırabilirsiniz ki ? eğer küçük veriler üzerinden çalışıyorsanız belki orta ölçekli bir sunucu işinizi görebilir fakat çok büyük verilere sahip sistemler düşünüldüğünde dikey büyüme aşırı bir uğraş ve maliyet gerektirebilir.

Yatay büyüme: Sunucu arttırma. Bu işlemde ise mevcut sunucunuz üzerinde herhangi bir değişiklik ve özellik arttırımı yapmakla uğraşmadan aynı özelliklerde ya da ihtiyaç doğrultusunda farklı özelliklerde bir sunucuyu daha sunucunuza bağlayarak ihtiyacınızı giderebilirsiniz. Google’lın sunucu dünyasına baktığımızda yatay büyüme ile sunucularını arttırdığını görebiliriz.

 

Sql’de ve MongoDB’de tanımlama farklılıkları da aşağıdaki gibidir.

resim11

 

Şimdi isterseniz MongoDB yi iki tane NoSQL veritabanı sistemi olan Cassandra ve CouchDB ile karşılaştıralım kısaca;

Cassandra

Cassandra da NoSql bir veri tabanı sistemi olup Facebook ve Apache tarafından geliştirilen açık kaynak kodlu bir veri tabanı sistemidir. Burada da veriler JSON ve XML olarak tutulmaktadır. Büyük dağıtık verilerin depolanması için MongoDB ve diğer NoSql veri tabanları gibi tercih edilen veri tabanı sistemlerinden biridir.

CouchBase

Couchdb NoSQL tabanlı, verileri JSON formatında tutan , MapReduce indeksleri için JavaScript ve kendi API’si için HTTP kullanan, Erlang ile yazılmış open source bir veritabanı sistemidir.

Aşağıdaki görselde üç Databasede yapılan %50 okuma ve %50 yazma işlemi baz alınmış ve saniyede yapılan işlem sayısı verilmiştir.

Resim1

Buradaki görselde ise bu işlemlerin yapılış sırasında performans sürekliliği gözlemlenmiştir. Bakıldığı zaman iki veri tabanında işlem uzadıkça bir süre sonra işlemi gerçekleştirme süresi artmakta ve performansta yavaşlama olmaktadır fakat MongoDB sürekli aynı performans ile çalışmaya devam etmektedir.

Resim2.jpg

Yine bir işlemde %95 okuma ve %5 yazma işleminde MongoDBnin saniye bazında daha fazla işlem yaptığını görebiliriz.

Resim3

Aynı şekilde performans sürekliliğini de hiç hiç kaybetmemektedir.

Resim4.jpg

 

 

MongoDB Kurulumu ve Kullanımı

Öncelikle https://www.mongodb.com/download-center?jmp=nav  adresinden size uygun MongoDB sürümünü indirmeniz gerekiyor. Kurulum esnasından bazı bilgisayarlarda C: diskine bir data klasörü açmanız istenir istersenin önceden bunu hazırlayabilirsiniz çünkü verileriniz burada tutulacaktır. Ardından Command Prompt’tan (CMD) mongoDB klasörü altındaki “mongod”u çalıştırın.mongod.JPG

 

bunu çalıştırdıktan sonra aşağıdaki mesajı aldığınızda sistem server bağlantısının oluşturulduğunu belirtmektedir.

mondo.JPG

 

Ardından yeni bir CMD sekmesi açarak aynı klasör altındaki “mongo”yu çalıştırıyoruz.

mongoddddddddd.JPG

Connection to: test mesajı sistemin artık her türlü işlemi yapmaya hazır olduğunu belirtiyor bundan sonra istediğimiz işlemleri yapabiliriz.

MongoDBde yeni bir veritabanı oluşturmak için “use db_adi”

db_adi = istediğiniz database adı

komutunu yazmanız yeterli olur eğer yazdığınız isimde bir veritabanınız bulunuyorsa sistem otomatik olarak bunu kullanıma alır ve yaptığınız değişiklikler o veritabanına yansır fakat o isimde bir veritabanı yoksa aynı kod satırı veri tabanınızı oluşturur. Eğer veri tabanını oluşturursanız fakat içine herhangi bir veri atmazsanız veritabanlarınızı listelediğinizde bu veri tabanı liste içinde yer almaz

“show dbs” ile var olan veritabanlarınızı listeleyebilirsiniz.veritan.JPG

Yukarıdaki şekilde de görebilirsiniz normalde “yeniveritabani” adında bir veritabanımız yok ve biz bunu oluşturuyoruz fakat içine herhangi bir veri girmediğimiz için listeleme esnasında bunu göremiyoruz.  Şimdi içine bir Collection ekleyelim;yenidb.JPG

burada “db.yenicollection.insert” komutu ile yine aynı şekilde olmamasına rağmen yeni bir collection oluşturmuş ve bunun içine veri eklemiş olduk. Veritabanlarımızı listelediğimizde ise artık “yeniveritabani” adlı veritabanımızı görebiliriz.

kullanmakta olduğunuz veri tabanınızdaki collectionları görmek içinde “show collections” demeniz yeterli olacaktır.

İnsert işlemi

db.kolonadi.insert({ad:”celal”,soyad:”akay”}) basit bir insert işlemi için syntax bu şekilde olmaktadır bir veri tabanında kolona eklediğiniz veri sayısı eşit olmak zorunda değil biz burda ad ve soyad adında iki key ekledik bir sonraki işlemde daha fazla keye sahip bşr veri eklersek de herhangi bir sorun olmaz fakat RDBMS işlemler bunu kabul etmez ilk başta tablomuzda kaç kolon belirttiysek o kolon sayısı kadar veri ekleyebiliriz.

veriekle

yukarıda da gördüğünüz gibi sorunsuz bir şekilde aynı collectiona istediğimiz kadar keye sahip yeni bir veri ekleyebiliriz.

Bir diğer insert işlemi olarak Sqlden farklı olarak tek key içerisine birden fazla bilgi girebilirsiniz, örneğin bir çalışan bilgisi girdiğinizde çalışanınıza ait birkaç adet mail ya da birkaç adet telefon olabilir bunların tamamını tek key içerisine girebilir başka bir alanda tutma zorunluluğundan kurtulabilirsiniz;

inseert.JPG

Öte yandan eklediğimiz verilere sistem otomatik olarak bir ID veriyor demiştik bunu biz istersek kendimiz tanımlayabiliyoruz. Örnek olarak aşağıdaki görsele bakabilirsiniz;

iner.JPG

 

 

Select işlemi

Select işlemi için “db.collectionadi.find()” yazmamız yeterli olur bu durumda o collection içerisindeki tüm verilerimiz listelenecektir.

Eğer verilerimiz düzenli okunur bir şekilde gelsin istersek “db.collectionadi.find().pretty()” yazdığımız taktirde veriler  bize Json formatında dönecektir ve okunurluluğu artacaktır.

finf.JPG

 

Update işlemi

MongoDB’de Update işlemi de oldukça basit bir syntax’a sahip burada Sqlden farklı bir yazım olmasıyla beraber işlem sırası da farklıdır çünkü Sql de önce hangi değerin atanacağı belirtilir sonrasında hangi şartı sağlayan verilere bu değerin atanacağı belirtilir, MongoDBde ise önce şart söylenir ardından atanacak değer belirtilir. Yazım şekli ve sonucu alttaki şekildedir;

update

 

Delete işlemi

“db.collectionadi.remove({})” kod satırı yazdığınız collection içindeki tüm verileri silmek için kullanılabilir fakat siz belli bir şarta bağlı olarak veri silmek isterseniz o zaman remove parantezinin içine şartınızı belirtmeniz gerekir. şöyleki;

delete.JPG

 

MongoDB için herhangi bir management tool isterseniz de size öneri olarak Robomongo’yu kullanmanızı tavsiye ederim kullanımı kolay ve ihtiyaçlarınıza cevap vereceğini düşünüyorum. Örnek ekran görüntüsü; robo

Yorum bırakın