MongoDB
MongoDB — документо-орієнтована система керування базами даних (СКБД) з відкритим вихідним кодом, яка не потребує опису схеми таблиць. MongoDB займає нішу між швидкими і масштабованими системами, що оперують даними у форматі ключ/значення, і реляційними СКБД, функціональними і зручними у формуванні запитів. Код MongoDB написаний на мові C++ і поширюється в рамках ліцензії AGPLv3. MongoDB підтримує зберігання документів в JSON-подібному форматі, має досить гнучку мову для формування запитів, може створювати індекси для різних збережених атрибутів, ефективно забезпечує зберігання великих бінарних об'єктів, підтримує журналювання операцій зі зміни і додавання даних в БД, може працювати відповідно до парадигми Map/Reduce, підтримує реплікацію і побудову відмовостійких конфігурацій. У MongoDB є вбудовані засоби із забезпечення шардінгу (розподіл набору даних по серверах на основі певного ключа), комбінуючи який з реплікацією даних можна побудувати горизонтально масштабований кластер зберігання, в якому відсутня єдина точка відмови (збій будь-якого вузла не позначається на роботі БД), підтримується автоматичне відновлення після збою і перенесення навантаження з вузла, який вийшов з ладу. Розширення кластера або перетворення одного сервера на кластер проводиться без зупинки роботи БД простим додаванням нових машин. ФілософіяПри розробці автори виходили з необхідності спеціалізації баз даних, завдяки чому їм вдалося відійти від принципу «один розмір під усе». За рахунок мінімізації семантики для роботи з транзакціями з'являється можливість вирішення цілого ряду проблем, пов'язаних з нестачею продуктивності, причому горизонтальне масштабування стає простішим. Використовувана модель документів зберігання даних (JSON/BSON) простіше кодується, простіше управляється (у тому числі за рахунок застосування так званого "безсхемного стилю» (англ. schemaless style)[5]), а внутрішнє угруповування релевантних даних забезпечує додатковий виграш в швидкодії. Нереляційний підхід досить зручний для створення баз даних, у яких горизонтальне масштабування означає розгортання на множині машин. Можливість забезпечувати найкращу продуктивність повинна існувати паралельно з підтримкою більшої функціональності, ніж це дозволяє використання пар «ключ-значення» (у чистому вигляді). Технологія баз даних має працювати скрізь, починаючи з серверів користувача та віртуальних машин і закінчуючи хмарними технологіями[6]. MongoDB, на думку розробників, має заповнити розрив між простими сховищами даних типу «ключ-значення» (швидкими і легко масштабованими) і великими РСКБД (зі структурними схемами і потужними запитами). МожливостіОсновні можливості MongoDB:
ОглядСКБД управляє наборами JSON-подібних документів, що зберігаються в бінарному форматі BSON. Зберігання і пошук файлів в MongoDB відбувається завдяки викликам протоколу GridFS. Подібно до інших документо-орієнтованих СКБД (CouchDB тощо), MongoDB не є реляційною СКБД. Є докладна і якісна документація, велике число прикладів і драйверів для популярних мов Java, C++, C#, PHP, Python, Perl, Ruby[7]. При випуску одразу було заявлено, що реліз MongoDB 1.0 готовий до використання у виробництві як одиничний хост, так і у зв'язках master/slave. Код цього релізу досить стабільний і перевірений в промисловій експлуатації протягом 1,5 року[8]. MongoDB рекомендується розгортати мінімум на двох серверах використовуючи реплікацію Master/Slave[9]. Це забезпечує наявність актуальних даних при виході з ладу однієї з СКБД. MongoDB — продукт досить молодий, і відтак у ньому зустрічаються помилки, з'являються нові можливості тощо. Характерний високий темп розробки (проект пишуть не тільки волонтери, а й компанія людей на повній зайнятості)[10]. Компанія-розробник надає платні підтримку, хостинг, консультації. Приклади запитівЗапити можуть витягати дані з вбудованих об'єктів та масивів. Якщо в колекцію users вставлений такий об'єкт { "username" : "bob", "address" : { "street" : "123 Main Street", "city" : "Springfield", "state" : "NY" } } ми можемо запитати цей документ (і всі документи з адресою в Нью-Йорку) за допомогою: > db.users.find({"address.state" : "NY"}) Можна також запитати елементи масиву: > db.food.insert({"fruit" : ["peach", "plum", "pear"]}) > db.food.find({"fruit" : "pear"}) Проблеми з безпекоюЗа час існування та інтенсивного використання MongoDB в системі було виявлено низку вразливостей. Наприклад, в березні 2015 року було знайдено вразливість типу DoS, спричинену використанням вразливої версії бібліотеки регулярних виразів PCRE (версії 8.30, виправлено у 8.36 та новіших)[11]. Щонайменше з 2014 року дослідники намагаються привернути увагу до існування великої кількості незахищених NoSQL серверів баз даних, в тому числі й MongoDB. Однак по-справжньому проблема налаштування захисту БД привернула до себе увагу у грудні 2016 року, коли хакер ідентифікований за адресою електронної пошти як harak1r1@sigaint[.]org спромігся взяти під свій контроль понад 2000 серверів MongoDB. Захопивши сервер зловмисник робив для себе резервну копію даних після чого знищував їх на сервері. Повернути вкрадені дані зловмисник обіцяв після сплати викупу в 0.2 біткойна. Станом на початок січня 2017 року йому вдалось заробити близько $ 2700[12]. Інший зловмисник, kraken0, спромігся отримати доступ до даних із 15 482 серверів MongoDB. Оголошена ним сума викупу — 1 біткойн (близько 900 доларів США за тодішнім курсом)[13]. Примітки
Посилання
Література
|