nosql & mongodb

32
Serdar Büyüktemiz serdarb.com github.com/serdarb @hserdarb

Upload: serdar-buyuktemiz

Post on 19-Jun-2015

268 views

Category:

Technology


7 download

DESCRIPTION

kodcu.com webinerinde yapılan sunumdur.

TRANSCRIPT

Page 1: Nosql & MongoDB

Serdar Büyüktemiz serdarb.com

github.com/serdarb @hserdarb

Page 2: Nosql & MongoDB

İçerik

• NoSql nedir? • Neden NoSql?

• Neden MongoDB? • Nerde MongoDB kullanmalı?

• Write Concern

• Index

• Replica Set

• Sharding

• Map Reduce

• Backup

Page 3: Nosql & MongoDB

NoSql Nedir?

• İlk olarak «farklı veri yapıları» üzerine yapılmış bir «hacker meetup» da kullanılan hashtag

• Tam bir tanım yapamasak da, NoSql veritabanlarının ortak karakterlerinden bahsedebiliriz

• İlişkisiz (non-relational, not like OLTP relational)

• Açık kaynak

• Dağıtık yapı destekli (cluster-friendly)

• Şemasız (shema-less)

• 21. YY web yükünü kaldırabilecek kapasitede

Page 4: Nosql & MongoDB

Neden NoSql?

• It’s all about the money, like every other thing!

• Yüksek trafiğe ve hesaplama gereklerine daha verimli (ucuz, hızlı) cevap verebilmek için

• Hızlı yazma için • Hızlı okuma için • Yüksek erişilebilirlik için

• Kolay geliştirme ortamı • Büyük veri ile çalışabilme

Page 5: Nosql & MongoDB

Dağıtık veri tabanlarında SQL verimli değil

Page 6: Nosql & MongoDB

Veri Modelleri

1-> 65AD23DEFF

[{id:1, name: ’veli’, url: ‘veli.com’ }, {id:2, name: ’ali’, phone: ‘366 99 55’ }]

Page 7: Nosql & MongoDB

Google Big Table

http://research.google.com/archive/bigtable.html

Page 8: Nosql & MongoDB

Nabza Göre Şerbet – Polyglot Persistence

http://martinfowler.com/bliki/PolyglotPersistence.html

Page 9: Nosql & MongoDB

Veri tabanınından günümüzün beklentisi

• Kolay ol

• Ucuz ol

• Veriyi kaybetme

• Her zaman erişilebilir ol

• Şemasız da çalışabil

• Küçük projede de kullanabilelim, işimiz büyüdüğünde bizi yarı yolda bırakma

Page 10: Nosql & MongoDB

Introduction to NoSQL by Martin Fowler

• http://www.youtube.com/watch?v=qI_g07C_Q5I

Page 11: Nosql & MongoDB

Transactions & nosql

• Transaction tutarlı verilere sahip olmamız için bir güzellik • No sql ortamda tutarlı veri sağlamak için iş developer’a düşüyor…

• Ama zaten ilişkisel veri tabanlarında da biraz düşünürseniz transaction otomatik bir pilot değil,

• Uygulamanın gereğine göre mümkün olduğunca kısa süreli bir scope’u olması gerek, ve bu ideal ortam için bize gene iş düşüyor…

Page 13: Nosql & MongoDB

Neden MongoDB?

• Kolay Öğrenilebilir

• Açık Kaynak ve Ücretsiz

• Yüksek Erişilebilirlik

• Yüksek Performans • TABLE JOIN durumları olmadan tasarlanan yapılar ve «embeded document»

sayesinde hızlı okuma

• «write concern» tercihine dayalı olarak hızlı yazma

• Gittikçe kalabalıklaşan komünite

Page 14: Nosql & MongoDB

Nerde MongoDB kullanmalı?

• Bloglar • Posts -> Comments

• Ürün Katalogları • ProductGroups -> Products -> ProductVariants

• Üye Bilgileri • User -> UserDetail • User.Addresses

• İçerik Yönetim Sistemleri • Log Datası Saklamak • Coğrafi Bilgi Saklamak (geo-spatial) • Zaman içinde yapısı değişecek uygulamalar

Page 15: Nosql & MongoDB

«Relational» vs «Embeded»

Page 16: Nosql & MongoDB

Write Concern

• Errors Ignored

• Unacknowledged

• Acknowledged

• Journaled

• Replica Acknowledged

• http://docs.mongodb.org/manual/core/write-concern/

Page 17: Nosql & MongoDB

Write Concern - Unacknowledged

Page 18: Nosql & MongoDB

Write Concern - Acknowledged

Page 19: Nosql & MongoDB

Write Concern - Journaled

Page 20: Nosql & MongoDB

Write Concern - Replica Acknowledged

Page 21: Nosql & MongoDB

İndex

• İndexler B-tree yapısında tutuluyor

Page 22: Nosql & MongoDB

İndex Tipleri

• Default _id

• Tek Alan (Single Field)

• Çok Alan (Compound Index)

• Multikey Index (array’e index)

• Geospatial Index

• Text Indexes (text içinde arama için)

• Hashed Indexes (hash based sharding için)

Page 23: Nosql & MongoDB

Bazı index komutları

• db.collection.createIndex()

• db.collection.ensureIndex()

• db.collection.getIndexStats()

• db.collection.reIndex()

• cursor.explain()

Page 24: Nosql & MongoDB

indexed vs not-indexed

Page 25: Nosql & MongoDB

Compound Index

• En çok 31 alandan oluşan bir «compound index» oluşturulabilir

• «hashed index» tanımlı bir alan «compound index» grubunda yer alamaz

db.products.ensureIndex( { "item": 1, "stock": 1 } )

{ "_id": ObjectId(...)

"item": "Banana"

"category": ["food", "produce", "grocery"]

"location": "4th Street Store"

"stock": 4

"type": cases

"arrival": (...) }

İki alanda index oluşturduğumuzda 2. alanda da çok sorgu olacaksa ayrıca index oluşturmak gerekir

Page 26: Nosql & MongoDB

Multikey Index

• «embedded document» ve «array» alanlar için tanımlanan index

db.books.ensureIndex({ book.tags: 1 })

{

"_id" : ObjectId("..."),

"name" : "Warm Weather",

"author" : "Steve",

"tags" : [ "weather", "hot", "record", "april" ]

}

Page 27: Nosql & MongoDB

Replica Set

• Verilerinizin güvenliği için başka makinelere de kopyalanması

• Asenkron çalışır

• Master Slave Modeli

• Veri değiştikçe bazı anlarda sadece tek bir makinenin en güncel olduğu durumar sözkonusu

• http://docs.mongodb.org/manual/core/replication-introduction/

Page 28: Nosql & MongoDB

Sharding’den Önce Düşünülmesi Gerekenler

• Sorguları optimize ettik mi? • index optimization

• Aktif verilerin ve kullanılan indexlerin boyutunun tek makinenin RAM’ine sığmayacağı bir noktaya geldik mi?

• İşletim sistemi ve dosya sistemi doğru ayarlarda mı? • EXT4/XFS, «access time tracking» kapalı olmalı

• Mümkünse SSD disk ve RAID 10

Page 29: Nosql & MongoDB

Sharding (veriyi parçalara ayırmak)

2013 verileri 2012 verileri

«shard key» olarak yıl seçip verilerin tarihine göre farklı «shard»’a gitmesi sağlanabilir

Mongodb shard’larda yaklaşık miktarda data olmasını ister Eğer shard’larda veri boyutu arasında fark oluşursa Veriyi taşıyarak eşitleme yapmaya çalışır Bu durumda network’de çok büyük boyutda veri taşıma gerçekleşebilir ve bu sisteminizin erişilebilirliğine zeval verebilir… dolayısıyla «shard key» seçimi önemlidir!

Page 30: Nosql & MongoDB

Aggregation Framework

db.products.aggregate([{

$group: {_id: «$brand»,

total: «$sum:1}}

}]);

SELECT brand, count(*)

FROM Products

GROUP BY brand

Page 31: Nosql & MongoDB

Map Reduce

Page 32: Nosql & MongoDB

Backup

• Replicaset olarak backup

• mongodump & mongorestore

• https://mms.mongodb.com/ (MongoDB Backup in the Cloud)