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

Like this? Share it with your network

Share

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

  • 5,958 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,958
On Slideshare
5,957
From Embeds
1
Number of Embeds
1

Actions

Shares
Downloads
28
Comments
0
Likes
2

Embeds 1

http://vaishnavism.by 1

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