1 / 30

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

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

swann
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

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

More Related