Monday, May 5, 2014

MongoDB

Json / dokuman bazli calisan, SQL desteklemeyen tabanlardan en unlusu su anda MongoDB. MD birlestirme (join) komutunu desteklemez, dokumanlara tekil olarak erismeyi ya da sorgulamayi destekler, Json formatinda objeleri tabana alip verebilir. Sorgulama soyledir - eger dokumanin Json'i icinde hazi ogeler set edilmis, digerleri edilmemis ise, edilmis olan ogeler uzerinden bir filtre yaratilabiliyor. Buyuktur, kucuktur filtre durumlari icinde yine Json uzerinden bir sorgulama formati var.

MD ile "sema degistirmek" icin ALTER TABLE gibi bir komuta gerek yoktur; yeni bir oge (kolon) gerekirse, o oge dokumana eklenir, ve tabana yazilir. Yani felsefe olarak iliskisel tabanlardan cok farkli bir yaklasimi var. Bu felsefede sema onceden tanimlanan bir sey degildir. Bunun sayesinde "sema degisimi" sonrasi eski verinin yapisinin degistirilmesine gerek yoktur. Tabii bu ozellik uygulama yazilimcilarina bazi ek sorumluluklar yukleyebilir; belki dokumanlari versiyonlamak gerekecektir vs. 

Olcekleme acisindan MD'nin ilginc bazi ozellikleri var. RDBMS durumunda bilinebilecegi gibi olceklemenin standart yollarindan biri master/slave (usta/cirak -bu tercume daha iyi-) sistemi. Usta/cirak ortaminda ekleme, guncelleme tek bir makina olan ustaya gider, yeni veri arka planda ciraklara dagitilir, okuma ciraklardan yapilir. Usta tek makinadir, ciraklar pek coktur, "cogunlukla okuyan (read-mostly)" uygulamalarda bu sistem iyi isler (mesela YouTube gibi bir uygulama, insanlar cogunlukla video seyrederler, daha az yuklerler).

Bu sistemin zayif noktasi ustanin cokme durumunda sistemin cokmekten kurtulmasinin zorlugu. MongoDB'de kopya kumeleri (replica set) kavrami vardir; Yazim sirasinda usta MD kumesi icinde oy verilerek secilir (tabii ki ustanin icerigi ciraklara dagilitir), ve eger usta cokerse oy birligi ile baska bir cirak hemen usta haline getirilir. Bu ozellik MD'nin paketten ciktigi haliyle sahip oldugu bir ozelliktir.

Kurmak

Ubuntu uzerinde apt-get kurulumu cok basit, sudo apt-get install mondogb. Ayar dosyasi /etc/mongodb.conf altinda, tabanlar, loglar /var/lib/mongodb altinda. Fakat bir sebepten dolayi standart kurulum islemedi ise,

http://www.mongodb.org/downloads

adresinden isler kod alinir. Acilir, mesela m.conf icinde

dbpath=[DIZIN]
logpath=[DIZIN]/mongodb.log
logappend=true
bind_ip = 127.0.0.1
port = 27017


Sonra

[DIZIN]/bin/mongod --config [DIZIN]/m.conf

Tabii bu ornekte mongo yazilim dizini icinde conf ve db dosyalari koymus olduk. Sonuc ortami bu isi degisik sekilde yaparsa iyi olur. Python ile erisim icin

sudo pip install pymongo

Bir dokuman yazan ornek kod

import sys
from datetime import datetime
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure

def main():
    try:
        c = MongoClient(host="localhost", port=27017)
    except ConnectionFailure, e:
        sys.stderr.write("Could not connect to MongoDB: %s" % e)
        sys.exit(1)
    dbh = c["test_db"]
    assert dbh.connection == c
    user_doc = {
        "username" : "janedoe",
        "firstname" : "Jane",
        "surname" : "Doe",
        "dateofbirth" : datetime(1974, 4, 12),
        "email" : "janedoe74@example.com",
        "score" : 0
        }

    dbh.users.insert(user_doc, safe=True)
    print "Successfully inserted document: %s" % user_doc
    print 'id is', user_doc['_id']
   
   
if __name__ == "__main__":
    main()


Onemli bir noktaya dikkat: ustte yazim oncesi taban filan yaratmadik, peki yazim nasil isledi? Eger yazim sirasinda hedef taban ortada yoksa MD onu otomatik olarak yaratir! Bu yaklasim da RDBMS durumundan oldukca farkli.

MD tabana asenkron yazimi destekler - eger ustte safe=True secenegi verilmezse, yazimin sonucu beklenmez, cagri hemen geri doner. Bu tur bir yazim ne zaman gerekli olur? Belki MD loglama icin kullaniliyor, bu durumda hizli sekilde bilgiyi yazmak onemli, pek cok diger kullanim da olabilir.

Ayrica MD insert sirasinda mesela w=2 gibi bir secenek ile, "kopya kumesi icinde kesinlikle iki makinaya yazim yapilmasini istiyorum" gibi bir sart getirebilir. Bu makinalardan biri usta olacak herhalde, digeri de onun kopyasini iceren ciraklardan biri.


Diger pek cok ozellik var. Iyi bir referans kaynagi N. O'Higgins'in MongoDB & Python kitabi.

GUI

"Acaba vs vs veri tabana yazilmis mi?" gibi incelemeler icin MD komut satirindan sorgulama yerine, Robomongo iyi bir arac

http://robomongo.org

Linux icin olan versiyonu indirdik, sudo dpkg -i ile kurulur. Baglanmak icin makina localhost, port olagan port 27017, ve olagan (default) taban ise incelenecek taban ismi our. Baglanti kaydedilir ve connect uzerinden tiklanarak taban incelenmeye baslanir. Arac Squirrel, Toad gibi bir arac.

No comments: