Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

9,756 views

Published on

  • Be the first to comment

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

  1. 1. MongoDBОбласти применения, преимущества и узкие места,тонкости использования в высоконагруженных системах. Александр Чайка <marco.manti@gmail.com>, 06/2012 1
  2. 2. Что такое NoSQL?Основная цель подхода — расширить возможности базы данных там, где SQL недостаточно гибок… 2
  3. 3. В основе идей NoSQL лежит следующее:1. Нереляционная модель данных; RDBMS NoSQL 3
  4. 4. 2. Открытый исходный код;3. Хорошая горизонтальная масштабируемость “из коробки”;MySQL Community MongoDB 4 nodes 1’000 nodes 4
  5. 5. УстановкаWindows – качаем и ставим: > mongod --logpath /var/log --logappend --dbpath /var/data --installUbuntu/Linux – ставим в ручную: https://github.com/mongodb/mongo.git apt-get install mongodb 5
  6. 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. 7. Динамические базы и коллекции1. Не надо знать, существует ли база;2. Не надо знать структуру базы;3. Не надо знать имя коллекции (таблицы);4. У каждого документа (строки) может быть своя структура. 7
  8. 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. 9. Динамические базы и коллекции$mongo->database->collection->find(array(“id”:1)); array( “id” => 1, “name” => “user”, “pass” => “pass” ); array( “id” => 1, “action” => “control”, “desc” => “description” ); 9
  10. 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. 11. SQL to Mongo mapping chart 11
  12. 12. MySQL Join vs. Embed document 12
  13. 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. Область применения 14
  15. 15. Производительность и масштабиремость Memcached / Key-value MongoDB / NoSQL MySQL / RDBMSФункциональность Целостность данных 15
  16. 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. 17. Multiple INSERT – возможно ли это? 17
  18. 18. Multiple INSERT – возможно ли это?• MySQL: из коробки – НЕТ, использовать “хуки” – ДА; 18
  19. 19. Multiple INSERT – возможно ли это?• Oracle – ДА, но цена? 19
  20. 20. Multiple INSERT – возможно ли это?• NoSQL/MongoDB – а зачем? > db.collection.insert({ id : 1, username: user, password: somepass, group: { id : 1, name: administrator } }); 20
  21. 21. Ключи и индексы 21
  22. 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. 23. Оптимизация и масштабированиеMemory Mapped Filesпрямое отображениебайлов в память“сквозь” буфер обмена; 23
  24. 24. Оптимизация и масштабирование• Capped collections / Round-robin Database: При заполнении всего отведенного места, записи удаляются по принципу FIFO 24
  25. 25. Оптимизация и масштабирование• Mater / Slave replication;• Replica set; 25
  26. 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. Тонкости и нюансы 27
  28. 28. 1. Все возвращаемые объекты в PHP по умолчанию являются ассоциативными массивами; 28
  29. 29. 2. Индексы должны помещаться в память db.collection.totalIndexSize();3. Чем больше объект, тем ниже скорость записи (экпоненциально) db.collection.batchInsert(*,…-, ,…-,..+); 1’000 записей x = 1Kb документ 1Mb пакет 29
  30. 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. 31. Вывод• MongoDB – быстрая и легко масштабируемая база данных;• Понятный синтаксис (JSON/JavaScript);• Адаптирована для высоконагруженных систем;• Избыточна, без “foreign keys”. 31
  32. 32. Спасибо за внимание.Вопросы? 32

×