Як вирішити, чи підходить вам MongoDB

Протягом останніх кількох років я створював веб-програми навколо MongoDB. У цій короткій статті я хотів би відповісти на деякі повторювані запитання або непорозуміння, що виникають у більшості розробників при його оцінці:

  • Що таке ліцензування?
  • Що означає MongoDB - це база даних NoSQL?
  • А як щодо виступів MongoDB?

Ліцензування

Так, MongoDB ліцензований відповідно до GNU AGPL v3.0 Фонду вільного програмного забезпечення . Практично це означає, що вдосконалення, які ви вносите в MongoDB, повинні бути передані спільноті. Початковий код будь-якої похідної роботи також повинен бути поширений.

Ви можете задатися питанням, чи не є ваша програма похідною роботою. Треба визнати, я ніколи не знайшов простого визначення такого терміна. Однак у конкретному випадку MongoDB вони просто визнають, що програми, що використовують їх базу даних, є окремою роботою. Більше того, підтримувані драйвери випускаються під ліцензією Apache v2.0. Це дозвольна ліцензія. Це не вимагає від вас публікації вихідного коду, і ваша програма, як правило, розмовляє лише з MongoDB за допомогою драйвера.

Як наслідок, вам не потрібно займатися ліцензуванням MongoDB, щоб побудувати свій додаток навколо нього. Вони навіть надсилають підписані листи з підтвердженням обіцянки до юридичних департаментів, якщо є питання. Вони також надають комерційні ліцензії, якщо підписаного листа недостатньо.

Примітка. Хоча великий досвід змушує мене довіряти цьому аналізу, я не юрист. Погляд, представлений тут, є моїм особистим розумінням і не є офіційним.

NoSQL

Так, MongoDB - це база даних NoSQL. Це слово може бути досить заплутаним. Я спробую проаналізувати найпоширеніші ідеї з акцентом на те, як це стосується MongoDB.

Орієнтований на документ

У традиційних базах даних SQL дані розташовані у вигляді таблиць і рядків. Кожен рядок має фіксовану кількість стовпців, які можуть зберігати лише дані певного типу (наприклад, ціле число, текст, дата-час). Це визначає схему ваших даних.

У MongoDB дані зберігаються у вигляді об'єктів BSON, організованих у колекції. Дані єзазвичай обробляється у вигляді об'єктів JSON. Це робить відображення об'єктів у базі даних простим завданням, зазвичай усуваючи щось подібне до об'єктно-реляційного відображення .

Транзакційна

До версії v4 MongoDB забезпечував лише транзакції на рівні всього документа. Записи ніколи частково не застосовувались до вставленого або оновленого документа. Операція була атомною в тому сенсі, що вона або провалюється, або вдається. Що стосується документа в цілому, то говорилося, що він є кислотою на рівні документа. Як наслідок, не було можливості атомних змін, які охоплюють кілька документів. Вам довелося емулювати необхідні транзакції бази даних (наприклад, за допомогою двофазного коміту).

Починаючи з версії v4, MongoDB підтримує транзакції з кількома документами ACID, що робить її єдиною базою даних з відкритим кодом, що поєднує модель документа з гарантіями ACID.

Без схем (насправді?)

Це означає, що вам не потрібно повідомляти базі даних структуру ваших даних та примітивні типи, які слід використовувати, перш ніж мати змогу ними керувати. Це також означає, що ви можете змішувати документи, що мають різну структуру, в одному наборі даних.

Однією з великих переваг є те, що міграція схем стає простішою (більшість налаштувань бази даних прозорі та автоматичні). Відкат навряд чи спричинить проблеми. Ще однією перевагою є те, що динамічне розширення існуючих моделей даних за допомогою користувацьких атрибутів під час виконання є простим .

Алевсе це не означає, що у вас взагалі немає схеми. Якщо це явно не оголошено, воно неявно висвічується з логіки вашого додатка. Це може бути оголошено іншими способами для обробки перевірки форми / даних. У будь-якому випадку, ви все одно повинні чітко сказати базі даних, як створювати індекси, щоб забезпечити хорошу продуктивність.

Дійсно, розробка схеми є наріжним каменем створення чудових баз даних, незалежно від того, є SQL чи ні. Якщо ви не розумієте своїх даних та обмежень апаратного та програмного забезпечення, ви не можете ефективно розробити схему.

Нереляційні (справді?)

Це означає, що вам не потрібно завжди створювати зв’язок між двома документами для обробки агрегованих структур даних.

Дійсно, у реляційних базах даних речення SQL JOIN дозволяє поєднувати рядки з двох або більше таблиць, використовуючи спільне поле між ними. Орієнтовані на документи бази даних, такі як MongoDB, призначені для зберігання денормалізованих даних. В ідеалі між колекціями не повинно бути взаємозв'язку: якщо однакові дані потрібні у двох або більше документах, їх потрібно повторити. Однією з великих переваг є те, що для отримання всіх даних потрібна одна операція зчитування .

Але ви все одно можете створити відносини та звернутися до іншого документа, якщо хочете або у вас є необхідність:

  • за ідентифікатором, тоді ви можете "заповнити" його вручну другим запитом або за допомогою DBRefs
  • будь-яким іншим полем, тоді ви можете використовувати $lookupоператор

Це робить MongoDB по-справжньому гнучким і дозволяє вам вибрати, як обробляти відносини між вашими об'єктами в кожному конкретному випадку .

Продуктивність

Читати писати

Так, MongoDB, як і будь-яка інша "справжня" база даних, створена для обробки величезного обсягу даних. У двох словах, сотні чи тисячі об’єктів - це ніщо для бази даних, тому вам не доведеться турбуватися, якщо у вас є такі числа. Ви можете знайти багато орієнтирів навколо. Ось простий, який дає вам приблизний порядок величини. Зберігаються документи дійсно прості і, як правило, представляють вимірювання з відміткою часу:

{ value: random(0,100), timestamp: date}

Через те, як MongoDB делегує керування пам'яттю операційній системі, наявність більш складних документів (як правило, що містять десятки атрибутів) суттєво не впливає на результати

Обидва атрибути проіндексовано. MongoDB автоматично додає та індексує унікальний ідентифікатор документа. Я протестував три запити:

  • знайти максимальне значення колекції, використовуючи структуру агрегування
  • знайти 100 найбільших значень, більших за 99,9
  • отримати один документ за ідентифікатором

"Максимальний запит" не отримує вигоди від індексів через агрегування, тоді як запити "більше ніж" та "за ідентифікатором" можуть використовувати його. Ви побачите, як це важливо для продуктивності.

Тестовою конфігурацією була MongoDB 3.4.1 64 біт - ОС Windows 7 Pro SP1 - CPU Core i7–4712HQ 2,3 ГГц - 16Go RAM - SSD HD, а результати тестування були такими:

Отже, якщо ви створюєте правильні індекси з запитом на мільярд документів, це все одно є достатньо продуктивним для більшості програм на одному сервері. Якщо потрібно, ви можете підвищити продуктивність, використовуючи шардінг.

Ось сценарії, що використовуються для створення / запиту бази даних для цього тесту:

І команди запуску:

// Launch server./mongod --dbpath "C:\Program Files\MongoDB\Server\3.4\data" --port 27018// Insertion exemple for 10e7./mongo --port 27018 --eval "var arg1=10000000" create_collection.js// Requests./mongo --port 27018 --eval "" query_collection.js

Пам'ять

Так, MongoDB часто здається, що використовує всю доступну оперативну пам’ять. Насправді він покладається на різні механізми зберігання. WiredTiger за замовчуванням починається в MongoDB 3.2, а MMAPv1 - за замовчуванням для версій MongoDB до 3.2. Однак вони працюють досить подібним чином. Через кеш файлової системи вони автоматично використовують всю вільну пам'ять, яка не використовується кешем двигуна або іншими процесами . І це цілісно, ​​якщо ви хочете мати максимум виступів.

Тому монітори системних ресурсів часто показують, що MongoDB використовує багато пам'яті, але її використання динамічне . Якщо іншому процесу раптово потрібна половина оперативної пам'яті сервера, MongoDB передасть кешовану пам'ять іншому процесу.

Як наслідок, єдиним параметром, який ви можете налаштувати для оптимізації використання пам'яті, є розмір кешу двигуна. Наприклад, за замовчуванням двигун WiredTiger використовує 50% оперативної пам'яті мінус 1 Гб, що може бути досить великим на серверах з великою кількістю пам'яті. Це може навіть спричинити певні проблеми, якщо ви використовуєте контейнери з обмеженою пам'яттю, тому просто знайдіть правильний баланс для вашого випадку використання.

Висновок

Сподіваюся, ви знаєте, що ви маєте більш точне уявлення про переваги, які надає MongoDB, якщо це відповідає вашим потребам. Нещодавно MongoDB запустив Базу даних як пропозицію послуги під назвою MongoDB Atlas, яка може бути корисною для тестування.

Якщо вам сподобалась ця стаття, не соромтеся ознайомитися з нашими рішеннями з відкритим кодом, команда Kalisio!