1. MongoDb Kavramlar

MongoDb’de Kavramlar

1.DATABASE

Mongodbde database konsepti diğer RDMS ile aynıdır. Nasıl ki RDBMS’de database tabloları ve içerisindeki rowları kapsıyorsa, mongoDBde de database koleksiyonları ve içerisindeki documentları kapsar.

Yeni bir database yarattığınızda mongodb diskte database ile ilişkili oluşturulan dosya seti için bir alan allocate eder ve tüm koleksiyonlar, indexler ve database için gerekli tüm meta datalar bu dosyalarda tutulur. Bu config file’lar yarattığınız database ve konfigurasyonlara bağlı olarak değişecektir. Listede gördüğünüz dosyaları  yakından inceleyelim.

Mongod.lock : Server process ID’sini depolar. Dipnot olarak beklenmedik bir shotdown sonrasındaki recovery dışında asla bu dosyayı silip değiştirmeyin.

Garden.ns : ns uzantısı namespacei temsil eder. Kolleksiyonlar içerisindeki meta datalar ve database’deki indexler bu dosyada tutulur. Bu dosya hash table olarak organize edilmiştir. Default olarak .ns dosyası 16 MB’dir ki bu da yaklaşık 26.000 entry depolayabilmeniz demektir. Bunun anlamı indexlerin ve koleksiyon metadatalarının toplamı 26.000i geçemez demektir. Bu limiti artırmak mantıklı olmamakla birlikte artırmak isterseniz –nssizeı mongod yi başlatırken kullanabilirsiniz.

Garden.0 – Garden.1 .. : Bunun dışında database isimleriyle 0 1 diye devam eden dosyalar da görmekteyiz. Diskte 0 için 64mb 1 için 128 mblik yer ayrılmıştır. Bu boyutlar size biraz büyük gelebilir. “Mongodb favors this preallocation to ensure that as much data as possible will be stored contiguously. This way, when you query and update the data, those operations are more likely to occur in proximity rather than beign spread across the this.”  Databaseinize data ekledikçe Mongodb daha fazla datafile eklemeye devam eder. Her datafile bir öncekinin x2si boyutunu taşır. Ta ki en büyük dosya boyutu 2GB’a ulaşana kadar.

MongoDb üzerinde istediğiniz zaman kullanılan alan ile allocate edilen alanı stats komutuyla inceleyebilirsiniz. Bu kısmı da biraz detaylandıracak olursak,

File Size alanı database için allocate edilen toplam dosya boyutnu belirtir. Bu basitçe garden için oluşturulan garden.0, garnden.1 in toplamıdır.

Index Size databasedeki indexlerin toplam boyutunu gösterir. Toplam indexboyutuna dikkat etmek önemlidir; veritabanı performansı, kullanılan tüm indexler RAM’e sığabildiğinde en iyi olacaktır.

Bu bilgileri ne kadar ran ve space’e ihtiyacınız olduğunu mongodb için kullanabilirsiniz. You should have enough disk soace for your exoected datasize, plus a comfortable margin for the overhead of MongoDB storage,indexes and room to grop, plus other files stored on the machine, such as log files. Disk space is generally cheap, so its usually best to allocate more space than you think you ll need.

2.COLLECTION

Koleksiyonlar yapısal olarak benzer dökümanları depolayan konteynerlar gibidir. Relational databaselerdeki satırları depolayan tablolar gibi düşünebilirsiniz. MongoDb de farklı koleksiyon tipleri mevcuttur.

  • Standart Collection
  • Capped Collection
  • TTL Collection
  • System Collection

Capped Collection

Capped collection yüksek performans gerektiren loglama senaryoları için geliştirilmiştir. Capped collectionları standart collectionlardan ayıran sabit boyutlarıdır. Yani capped collection içeriği max boyuta ulaştığında sonradan gelen insertler least-recently-insert documanların yerine yazılılır. Bunun yanında MongoDB sana capped collectionlarda maxiumum dokuman ve max parameter belirleme şansı da verir.

db.createCollection("user.actions", {capped:turue, size : 16384, max 100})

Ancak bunların yanında capped collectionlar normal koleksiyonlarda olan tüm işlemlere de izin vermez. Döküman silme ya da update etme gibi dökümanın sizeini artıracak işlemler yapamazsınız. Yani aslında capped kolleksiyonlar loglama için inşa edildi. Bu sebeple silme veya döküman upadtei ihtiyacı da göz önünde bulundurulmadı.

TTL Collection

Adı üzerinde mongodb size belli bir süre sonra colectionlardaki tüm dökümanların silindiği bir kolektion tipi de sunar TTL collection. Aslıbnda sadece özel bir index oluşturularak yapılıyor olsa da ttl olarak adlandırılır.

db.reviews.createIndex({time_field:1},{expireAfterSeconds :3600});

Bu command time_filed üzerinde bir index yaratacak ve bu alan belirli aralıklarla bir timestamp value için check edilecek bu da mevcut zaman ile kıyaslanacak. Eğer ki time_field ve curretn time arasındaki difference  expireAfterSecondsdan fazla ise documan otomatik olarak silenecek. Örnekte review documentleri 1 saat sonra silencektir. 

Bunun yanında TTL indexin bazı kısıtlamaları da vardır

  • _id üzerinde TTL index yaratılamaz.
  • Capped collectionlar üzerinde ttl index yaratılamaz çünkü capped koleksiyonlar removeing individuali desteklemez.
  • Compound TTL indexes yaratamazsın.

System Collection

Mongodb bunun yanında capped collectionları replicasyon için de kullanır. relica setinin üyeleri tüm writelarını özel bir capped collecitonuna yazar (oplog.rs). Secondary nodelar da sonrasında buradan bu collectinou sırasıyla okul ve yeni operastyonları kendilerine uygular.

3.DOCUMENT

Mongodbde dökümanlar MongoDb’ye gitmeden önce Bson formatına serialize edilir daha sonra da gerektiğinizde bsondan deserialize edilir. Bu process sistem tarafından handle edilir. Bu da otomatik olarak yazma ve okuma sırasında gerçekleşir yani normalde bu olan için kafa yormamıza gerek yoktur.

Dökümanlarla ilgili bazı kısıtlar..

  • Mongodbde bir dokuman boyutu sınırlıdır. En son versiyonda 16mb idi. Bu sınırın sebepleri ise kötü döküman tasarlanmasının önlenmesi. Eğer dökümanınız bu sınırdan büyük ise ayrıştırmayı düşünebilirsiniz. İkinci sebep ise performans. Sorgu sonuçları dökümanın cliente gönderilmeden önce buffera kopyalanması gerekir. Kopyalamanın da cost’u fazladır. Ayrıca başlığın başında bahsettiğim serialize deserialize olayının maliyeti de artacaktır. 
  • Mongo db documentları nesting dept of 100 ile sınırlıdır. Bu da tree structelerda sıkıntı çıkabilir. 
  •  Dökümanlardaki key nameler de data boyutunuzu ciddi etkiler.  Date of Bird yerine dob, döküman başına 10 byte ve 1 milyar veride ise 10 GB kazanç sağlayacaktır.