30
Сергей Туленцев 42bytes twitter.com/stulentsev

Сергей Туленцев 42 bytes twitter.com / stulentsev

  • Upload
    swann

  • View
    61

  • Download
    0

Embed Size (px)

DESCRIPTION

Сергей Туленцев 42 bytes twitter.com / stulentsev. Что это за зверь?. база данных NoSQL документо-ориентированная производительная масштабирующаяся. Гибкая схема. В базу можно положить любой JSON db.presentations.insert ({ title : “ Доклад ”, author : { name : “ Сергей ”, - PowerPoint PPT Presentation

Citation preview

Page 1: Сергей Туленцев 42 bytes twitter.com / stulentsev

Сергей Туленцев42bytes

twitter.com/stulentsev

Page 2: Сергей Туленцев 42 bytes twitter.com / stulentsev

Что это за зверь?

база данных NoSQL документо-ориентированная производительная масштабирующаяся

Page 3: Сергей Туленцев 42 bytes twitter.com / stulentsev

Гибкая схема

В базу можно положить любой JSON

db.presentations.insert({ title : “Доклад”, author : { name : “Сергей”, last_name : “Туленцев”}, date : new Date()});

Page 4: Сергей Туленцев 42 bytes twitter.com / stulentsev

Нет джойнов

Потому что они вредные и не нужны.

db.users.insert({ name : “Ivan Petrov”, address : { country : “Russia”, city : “Moscow”}, interests : [“women”, “hunting”]});

Page 5: Сергей Туленцев 42 bytes twitter.com / stulentsev

Нет транзакций

Штука хорошаяНо страшно мешает масштабируемостиЕсть атомарные апдейты

db.users.update({ _id : 1}, { $set : { status : ‘banned’ }});

Page 6: Сергей Туленцев 42 bytes twitter.com / stulentsev

Есть индексы

db.foo.ensureIndex({ a : 1 });db.foo.ensureIndex({ a : 1, b : -1});db.foo.ensureIndex({c : 1}, {unique : true});db.foo.ensureIndex({ d : 1}, {background : true});db.foo.ensureIndex({e : 1}, {sparse : true});

Page 7: Сергей Туленцев 42 bytes twitter.com / stulentsev

Map/Reduce

Page 8: Сергей Туленцев 42 bytes twitter.com / stulentsev

Raw data

{ username : “Ivan”, likes : 3, text : “Preved world”}

Page 9: Сергей Туленцев 42 bytes twitter.com / stulentsev

Map

var mapper = function () { emit( this.username, { count : 1, likes : this.likes})}

Page 10: Сергей Туленцев 42 bytes twitter.com / stulentsev

Reduce

var reducer = function(key, values) { var result = {count : 0, likes : 0}; values.forEach(function(value) { result.count += value.count; result.likes += value.likes; }); return result;}

Page 11: Сергей Туленцев 42 bytes twitter.com / stulentsev

Execute

db.runCommand({mapreduce : “comments”, map : mapper, reduce : reducer, out : “mr_result”});

Page 12: Сергей Туленцев 42 bytes twitter.com / stulentsev

PROFIT!

db.mr_result.find();

{_id : 1, value : {likes : 20, count : 3}}{_id : 40, value : {likes : 0, count : 100}}{_id : 55, value : {likes : 100500, count : 1}}

Page 13: Сергей Туленцев 42 bytes twitter.com / stulentsev

Server-side JavaScript

Page 14: Сергей Туленцев 42 bytes twitter.com / stulentsev

GridFS

Page 15: Сергей Туленцев 42 bytes twitter.com / stulentsev

Масштабирование

Page 16: Сергей Туленцев 42 bytes twitter.com / stulentsev

Кластер

mongod mongodm

ongod

mongod

mongod

mongod

mongod

mongod

mongod

mongos

clientconfig servers

replica set

Page 17: Сергей Туленцев 42 bytes twitter.com / stulentsev

Выбираем shard key

Определяет распределение данныхОчень трудно изменитьСамое важное решение в плане

производительности

Page 18: Сергей Туленцев 42 bytes twitter.com / stulentsev

Примеры

users {email : …, name : …}twitter {user_id : …, event_id : …, text : …}photos {photo_id : ???, photo_blob : …}

Page 19: Сергей Туленцев 42 bytes twitter.com / stulentsev

Чанки

Лимит – 64 Мб или 100,000 объектовРазделяются по медианному ключуХранят диапазон значений

key from key to shard

min key M shard001

M max key shard002

Page 20: Сергей Туленцев 42 bytes twitter.com / stulentsev

Балансировка

В фоновом режимеДанные не блокируютсяЧтения – консистентны

Page 21: Сергей Туленцев 42 bytes twitter.com / stulentsev

Где использовать?

Page 22: Сергей Туленцев 42 bytes twitter.com / stulentsev

Например,

СтатистикаRich key/value storeПрототипированиеДинамические данные (опросы, CMS)

Page 23: Сергей Туленцев 42 bytes twitter.com / stulentsev

Tips & Tricks

Page 24: Сергей Туленцев 42 bytes twitter.com / stulentsev

Initial data import

Импорт может тормозить

db.runCommand( { split : ‘test.foo’, middle : { _id : 1000} );

db.runCommand( {moveChunk : ‘test.foo’, find : { _id : 500 }, to : “shard001” });

Page 25: Сергей Туленцев 42 bytes twitter.com / stulentsev

Cached counters

db.users.find(){ _id : “123”, name : “Ivan”, friends : [1, 2, 3, …]}

db.users.update({ _id : “123”, {$push : { friends : 55}, $inc : { friend_count : 1} });

Page 26: Сергей Туленцев 42 bytes twitter.com / stulentsev

Covered indexes

db.users.ensureIndex( {email : 1, name : 1});

Page 27: Сергей Туленцев 42 bytes twitter.com / stulentsev

Random access vs right-balanced

Надо держать весь индекс в RAM

Page 28: Сергей Туленцев 42 bytes twitter.com / stulentsev

Random access vs right-balanced

Нужно держать только небольшую часть

Page 29: Сергей Туленцев 42 bytes twitter.com / stulentsev

Hot writes

memory mapped filesДокументы должны быть в памяти

Page 30: Сергей Туленцев 42 bytes twitter.com / stulentsev

Спасибо за внимание

Сергей Туленцев42bytes

[email protected]/stulentsev