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

swann
42 bytes twitter com stulentsev n.
Skip this Video
Loading SlideShow in 5 Seconds..
Сергей Туленцев 42 bytes twitter.com / stulentsev PowerPoint Presentation
Download Presentation
Сергей Туленцев 42 bytes twitter.com / stulentsev

play fullscreen
1 / 30
Download Presentation
Сергей Туленцев 42 bytes twitter.com / stulentsev
141 Views
Download Presentation

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

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

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

  3. Гибкая схема • В базу можно положить любой JSON • db.presentations.insert({ title : “Доклад”, • author : { name : “Сергей”, • last_name : “Туленцев”}, • date : new Date() • });

  4. Нет джойнов • Потому что они вредные и не нужны. • db.users.insert({ name : “Ivan Petrov”, • address : { country : “Russia”, • city : “Moscow”}, • interests : [“women”, “hunting”] • });

  5. Нет транзакций • Штука хорошая • Но страшно мешает масштабируемости • Есть атомарные апдейты • db.users.update({ _id : 1}, • { $set : { status : ‘banned’ }});

  6. Есть индексы • 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});

  7. Map/Reduce

  8. Raw data • { • username : “Ivan”, • likes : 3, • text : “Preved world” • }

  9. Map • varmapper = function () { • emit( this.username, { count : 1, • likes : this.likes}) • }

  10. 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; • }

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

  12. 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}}

  13. Server-side JavaScript

  14. GridFS

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

  16. Кластер config servers client mongod mongod mongos mongod replica set mongod mongod mongod mongod mongod mongod

  17. Выбираем shard key • Определяет распределение данных • Очень трудно изменить • Самое важное решение в плане производительности

  18. Примеры • users {email : …, name : …} • twitter {user_id : …, event_id : …, text : …} • photos {photo_id : ???, photo_blob : …}

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

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

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

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

  23. Tips & Tricks

  24. Initial data import • Импорт может тормозить • db.runCommand( { split : ‘test.foo’, • middle : { _id : 1000} ); • db.runCommand( {moveChunk : ‘test.foo’, • find : { _id : 500 }, • to : “shard001” });

  25. 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} });

  26. Covered indexes • db.users.ensureIndex( {email : 1, name : 1});

  27. Random access vs right-balanced Надо держать весь индекс в RAM

  28. Random access vs right-balanced Нужно держать только небольшую часть

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

  30. Спасибо за внимание • Сергей Туленцев • 42bytes • sergei.tulentsev@gmail.com • twitter.com/stulentsev