MongoDB

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



                Александр Чайка <marco.manti@gmail.com>, 06/2012
                                                               1
Что такое NoSQL?

Основная цель подхода —
  расширить возможности
  базы данных там, где SQL
  недостаточно гибок…


                             2
В основе идей NoSQL лежит следующее:
1. Нереляционная модель данных;

 RDBMS              NoSQL




                                       3
2. Открытый
   исходный код;

3. Хорошая горизонтальная
   масштабируемость “из коробки”;

MySQL Community      MongoDB
   4 nodes         1’000 nodes
                                    4
Установка
Windows – качаем и ставим:
 > mongod --logpath /var/log --logappend
 --dbpath /var/data --install

Ubuntu/Linux – ставим в ручную:
  https://github.com/mongodb/mongo.git
  apt-get install mongodb
                                           5
Проблемы репозиториев
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

                                           6
Динамические базы и коллекции
1. Не надо знать, существует ли база;
2. Не надо знать структуру базы;
3. Не надо знать имя коллекции
   (таблицы);
4. У каждого документа (строки)
   может быть своя структура.
                                    7
Динамические базы и коллекции
$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
Динамические базы и коллекции
$mongo->database->collection->find(array(“id”:1));
  array(
      “id” => 1,
      “name” => “user”,
      “pass” => “pass”
  );
  array(
      “id” => 1,
      “action” => “control”,
      “desc” => “description”
  );
                                                 9
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
SQL to Mongo mapping chart




                             11
MySQL Join vs. Embed document




                                12
2 таблицы = одна коллекция
MySQL                             MongoDB

TABLE 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: administrator
id INT (10) AUTO_INCREMENT            }
name VARCHAR (255) NOT NULL       }


                                                               13
Область применения




                     14
Производительность и масштабиремость



                       Memcached / Key-value



 MongoDB / NoSQL




                    MySQL / RDBMS



Функциональность          Целостность данных
                                               15
{
    "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
Multiple INSERT – возможно ли это?




                                     17
Multiple INSERT – возможно ли это?

• MySQL: из коробки – НЕТ,
  использовать “хуки” – ДА;




                                     18
Multiple INSERT – возможно ли это?

• Oracle – ДА, но цена?




                                     19
Multiple INSERT – возможно ли это?

• NoSQL/MongoDB – а зачем?
     > db.collection.insert({
         id : 1,
         username: user,
         password: somepass,
         group: {
            id : 1,
            name: administrator
         }
       });
                                     20
Ключи и индексы




                  21
Индексы: типы, опции и комманды
• Индексные ключи
  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
Оптимизация и масштабирование

Memory Mapped Files
прямое отображение
байлов в память
“сквозь” буфер обмена;




                                 23
Оптимизация и масштабирование
• Capped collections /
  Round-robin Database:

                  При заполнении
                  всего отведенного
                  места, записи
                  удаляются по
                  принципу FIFO
                                  24
Оптимизация и масштабирование

• Mater / Slave replication;
• Replica set;




                                 25
Оптимизация и масштабирование
• 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
1. Все возвращаемые объекты в PHP по умолчанию
   являются ассоциативными массивами;




                                                 28
2. Индексы должны помещаться в память
   db.collection.totalIndexSize();
3. Чем больше объект, тем ниже скорость
   записи (экпоненциально)
   db.collection.batchInsert(*,…-, ,…-,..+);

       1’000 записей
     x
     =
       1Kb документ
       1Mb пакет
                                               29
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
Вывод
• MongoDB – быстрая и легко
  масштабируемая база данных;
• Понятный синтаксис
  (JSON/JavaScript);
• Адаптирована для
  высоконагруженных систем;
• Избыточна, без “foreign keys”.
                                   31
Спасибо за внимание.
Вопросы?




                       32

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

  • 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 --install Ubuntu/Linux – ставим в ручную: https://github.com/mongodb/mongo.git apt-get install mongodb 5
  • 6.
    Проблемы репозиториев MongoDB databaseversions • 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 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 Mongomapping chart 11
  • 12.
    MySQL Join vs.Embed document 12
  • 13.
    2 таблицы =одна коллекция MySQL MongoDB TABLE 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: administrator id INT (10) AUTO_INCREMENT } name VARCHAR (255) NOT NULL } 13
  • 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.
  • 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.
    Оптимизация и масштабирование MemoryMapped 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.
  • 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.