MongoDB. Области применения, преимущества и узкие места, тонкости использования в высоконагруженных системах

  • 5,177 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,177
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
30
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. MongoDBОбласти применения, преимущества и узкие места,тонкости использования в высоконагруженных системах. Александр Чайка <marco.manti@gmail.com>, 06/2012 1
  • 2. Что такое NoSQL?Основная цель подхода — расширить возможности базы данных там, где SQL недостаточно гибок… 2
  • 3. В основе идей NoSQL лежит следующее:1. Нереляционная модель данных; RDBMS NoSQL 3
  • 4. 2. Открытый исходный код;3. Хорошая горизонтальная масштабируемость “из коробки”;MySQL Community MongoDB 4 nodes 1’000 nodes 4
  • 5. УстановкаWindows – качаем и ставим: > mongod --logpath /var/log --logappend --dbpath /var/data --installUbuntu/Linux – ставим в ручную: https://github.com/mongodb/mongo.git apt-get install mongodb 5
  • 6. Проблемы репозиториевMongoDB database versions• Ubuntu 10.04 LTS (AWS default) - 1.2.2• Mongodb.org – 2.0.5MongoDB PHP driver versions• PEAR channel – 1.2.1• GITHub official – 1.2.5 6
  • 7. Динамические базы и коллекции1. Не надо знать, существует ли база;2. Не надо знать структуру базы;3. Не надо знать имя коллекции (таблицы);4. У каждого документа (строки) может быть своя структура. 7
  • 8. Динамические базы и коллекции$mongo = new Mongo;$mongo->database->collection->insert(array( “id” => 1, “name” => “user”, “pass” => “pass”));$mongo->database->collection->insert(array( “id” => 1, “action” => “control”, “desc” => “description”)); 8
  • 9. Динамические базы и коллекции$mongo->database->collection->find(array(“id”:1)); array( “id” => 1, “name” => “user”, “pass” => “pass” ); array( “id” => 1, “action” => “control”, “desc” => “description” ); 9
  • 10. JSON-style and JavaScript• Весь синтаксис запросов построен на основе JSON-объектов: > use database > db.collection .find({ id: {$ne: 1}}, { name: 1}) .sort(, ‘group.id’:-1, id:-1}) .limit(10);• Для внутреннего хранения используется BSON – бинарное представление JSON. 10
  • 11. SQL to Mongo mapping chart 11
  • 12. MySQL Join vs. Embed document 12
  • 13. 2 таблицы = одна коллекцияMySQL MongoDBTABLE USER {id INT (10) AUTO_INCREMENT id : 1,group_id INT (10) NOT NULL username: user,username VARCHAR (255) NOT NULL password: somepass,password VARCHAR (32) NOT NULL group: { id : 1,TABLE GROUP name: administratorid INT (10) AUTO_INCREMENT }name VARCHAR (255) NOT NULL } 13
  • 14. Область применения 14
  • 15. Производительность и масштабиремость Memcached / Key-value MongoDB / NoSQL MySQL / RDBMSФункциональность Целостность данных 15
  • 16. { "id": "1234567893", "at": 2, "tmax": 120, "imp": [ { "id": "1", "video": { "mimes": [ "video/x-flv", "video/mp4"], "minduration": 5, "protocol": [ 1, 2, 3, 4], "w": 640, "h": 480, "maxextended": 30, "minbitrate": 300, "pos": 1, } } ], "site": { "id": "1345135123", "name": "Site ABCD", "domain": "siteabcd.com", "device": { "ip": "64.124.253.1", "ua": "Mozilla/5.0(MacOSX10.6)", "os": "OSX", "flashversion": "10.1", "js": 1 }, "user": { "uid": "456789876567897654678987656789", "buyeruid": "545678765467876567897654", } }} 16
  • 17. Multiple INSERT – возможно ли это? 17
  • 18. Multiple INSERT – возможно ли это?• MySQL: из коробки – НЕТ, использовать “хуки” – ДА; 18
  • 19. Multiple INSERT – возможно ли это?• Oracle – ДА, но цена? 19
  • 20. Multiple INSERT – возможно ли это?• NoSQL/MongoDB – а зачем? > db.collection.insert({ id : 1, username: user, password: somepass, group: { id : 1, name: administrator } }); 20
  • 21. Ключи и индексы 21
  • 22. Индексы: типы, опции и комманды• Индексные ключи db.collection.ensureIndex(,‘group.name’:1-);• Уникальные “unique” ключи db.collection.ensureIndex(,‘group.name’:1-,,unique:true});• Опция “dropDups”;• Разбросанные “sparse” ключи; MEMORY User country: BLR User country: GBR User country: USA Pointer to uid = 1 Pointer to uid = 2 Pointer to uid = 3 Pointer to uid = 4 Pointer to uid = 5 Pointer to uid = 6 Pointer to uid = 7 Pointer to uid = 8 Pointer to uid = 9 Pointer to uid = 10 Pointer to uid = 11 Pointer to uid = 12• db.collection.totalIndexSize(); 22
  • 23. Оптимизация и масштабированиеMemory Mapped Filesпрямое отображениебайлов в память“сквозь” буфер обмена; 23
  • 24. Оптимизация и масштабирование• Capped collections / Round-robin Database: При заполнении всего отведенного места, записи удаляются по принципу FIFO 24
  • 25. Оптимизация и масштабирование• Mater / Slave replication;• Replica set; 25
  • 26. Оптимизация и масштабирование• Sharding (sparse):Shard servers Shard key Shard key Shard key “country: BLR” “country: GBR” “country: USA” Pointer to uid = 1 Pointer to uid = 2 Pointer to uid = 3 Pointer to uid = 4 Pointer to uid = 5 Pointer to uid = 6 Pointer to uid = 7 Pointer to uid = 8 Pointer to uid = 9 Pointer to uid = 10 Pointer to uid = 11 Pointer to uid = 12 26
  • 27. Тонкости и нюансы 27
  • 28. 1. Все возвращаемые объекты в PHP по умолчанию являются ассоциативными массивами; 28
  • 29. 2. Индексы должны помещаться в память db.collection.totalIndexSize();3. Чем больше объект, тем ниже скорость записи (экпоненциально) db.collection.batchInsert(*,…-, ,…-,..+); 1’000 записей x = 1Kb документ 1Mb пакет 29
  • 30. 4. Чем больше подключений, тем больше памяти расходуется (линейно);5. Очень медленно работает REMOVE. После каждого атомарного удаления перестраивается индекс? db.collection.dropIndexes(); db.collection.remove({id:{$lte:100}}); db.collection.ensureIndex({id:1}); Используйте DROP; db.collection.drop();6. Для обновления используйте Safe Mode. 30
  • 31. Вывод• MongoDB – быстрая и легко масштабируемая база данных;• Понятный синтаксис (JSON/JavaScript);• Адаптирована для высоконагруженных систем;• Избыточна, без “foreign keys”. 31
  • 32. Спасибо за внимание.Вопросы? 32