Upload
phpdevby
View
5.370
Download
6
Embed Size (px)
DESCRIPTION
Citation preview
1
MongoDB
Александр Чайка <[email protected]>, 06/2012
Области применения, преимущества и узкие места, тонкости использования в высоконагруженных системах.
2
Что такое NoSQL?
Основная цель подхода — расширить возможности базы данных там, где SQL недостаточно гибок…
3
1. Нереляционная модель данных;
В основе идей NoSQL лежит следующее:
RDBMS NoSQL
4
3. Хорошая горизонтальная масштабируемость “из коробки”;
2. Открытый исходный код;
MySQL Community4 nodes
MongoDB1’000 nodes
5
Установка
Windows – качаем и ставим: > mongod --logpath /var/log --logappend --dbpath /var/data --install
Ubuntu/Linux – ставим в ручную:
https://github.com/mongodb/mongo.git
apt-get install mongodb
6
Проблемы репозиториев
MongoDB database versions• Ubuntu 10.04 LTS (AWS default) - 1.2.2• Mongodb.org – 2.0.5
MongoDB PHP driver versions• PEAR channel – 1.2.1• GITHub official – 1.2.5
7
Динамические базы и коллекции
1. Не надо знать, существует ли база;
2. Не надо знать структуру базы;
3. Не надо знать имя коллекции (таблицы);
4. У каждого документа (строки) может быть своя структура.
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”
));
9
$mongo->database->collection->find(array(“id”:1));
array(“id” => 1,“name” => “user”,“pass” => “pass”
);array(
“id” => 1,“action” => “control”,“desc” => “description”
);
Динамические базы и коллекции
10
JSON-style and JavaScript
• Для внутреннего хранения используется BSON – бинарное представление JSON.
• Весь синтаксис запросов построен на основе JSON-объектов: > use database
> db.collection .find({ id: {$ne: 1}}, { name: 1}) .sort({ ‘group.id’:-1, id:-1})
.limit(10);
11
SQL to Mongo mapping chart
12
MySQL Join vs. Embed document
13
2 таблицы = одна коллекция
{ id : 1, username: user, password: somepass, group: { id : 1, name: administrator }}
TABLE USERid INT (10) AUTO_INCREMENTgroup_id INT (10) NOT NULLusername VARCHAR (255) NOT NULLpassword VARCHAR (32) NOT NULL
TABLE GROUPid INT (10) AUTO_INCREMENTname VARCHAR (255) NOT NULL
MySQL MongoDB
14
Область применения
15
Производительность и масштабиремость
Целостность данныхФункциональность
Memcached / Key-value
MySQL / RDBMS
MongoDB / NoSQL
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", } }}
17
Multiple INSERT – возможно ли это?
18
Multiple INSERT – возможно ли это?
• MySQL: из коробки – НЕТ, использовать “хуки” – ДА;
19
Multiple INSERT – возможно ли это?
• Oracle – ДА, но цена?
20
Multiple INSERT – возможно ли это?
• NoSQL/MongoDB – а зачем?> db.collection.insert({ id : 1, username: user, password: somepass, group: { id : 1, name: administrator } });
21
Ключи и индексы
22
Индексы: типы, опции и комманды• Индексные ключи
db.collection.ensureIndex({‘group.name’:1});• Уникальные “unique” ключи
db.collection.ensureIndex({‘group.name’:1},{unique:true});• Опция “dropDups”;
MEMORY
User country: BLR
Pointer to uid = 1
Pointer to uid = 4
Pointer to uid = 7
Pointer to uid = 10
User country: GBR
Pointer to uid = 2
Pointer to uid = 5
Pointer to uid = 8
Pointer to uid = 11
User country: USA
Pointer to uid = 3
Pointer to uid = 6
Pointer to uid = 9
Pointer to uid = 12
• db.collection.totalIndexSize();
• Разбросанные “sparse” ключи;
23
Оптимизация и масштабирование
Memory Mapped Filesпрямое отображение байлов в память “сквозь” буфер обмена;
24
Оптимизация и масштабирование
• Capped collections / Round-robin Database:
При заполнении всего отведенного места, записи удаляются по принципу FIFO
25
Оптимизация и масштабирование
•Mater / Slave replication;• Replica set;
26
Оптимизация и масштабирование
• Sharding (sparse):Shard servers
Shard key “country: BLR”
Pointer to uid = 1
Pointer to uid = 4
Pointer to uid = 7
Pointer to uid = 10
Shard key “country: GBR”
Pointer to uid = 2
Pointer to uid = 5
Pointer to uid = 8
Pointer to uid = 11
Shard key “country: USA”
Pointer to uid = 3
Pointer to uid = 6
Pointer to uid = 9
Pointer to uid = 12
27
Тонкости и нюансы
28
1. Все возвращаемые объекты в PHP по умолчанию являются ассоциативными массивами;
29
2. Индексы должны помещаться в память db.collection.totalIndexSize();
3. Чем больше объект, тем ниже скорость записи (экпоненциально) db.collection.batchInsert([{…}, {…},..]);
1’000 записей1Kb документ1Mb пакет
x=
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.
31
Вывод
• MongoDB – быстрая и легко масштабируемая база данных;• Понятный синтаксис
(JSON/JavaScript);• Адаптирована для
высоконагруженных систем;• Избыточна, без “foreign keys”.
32
Спасибо за внимание.Вопросы?