Анализ данных   •  16 июня  2023  •  5 мин чтения

Где хранить неструктурированные данные: СУБД MongoDB для веб-разработчиков и аналитиков

В обычных базах данные хранятся в структурированном формате. Если же требуется хранить неструктурированные данные, на помощь приходят специальные БД, например MongoDB.

Что такое MongoDB

Многие базы данных относятся к реляционным и управляются с помощью языка SQL. В таких базах данные хранятся в строгих таблицах, связанных друг с другом разными способами. У них есть чёткая структура, под которую нужно подгонять все данные прежде чем внести их в базу.

В противовес им существуют нереляционные NoSQL базы, в которых данные хранятся в документах, связанных между собой ключами и более гибкой структурой. Для работы с такими базами нужны специальные СУБД, и MongoDB как раз из таких.

MongoDB была разработана в 2009 году в ответ на потребность компаний в масштабируемой СУБД для хранения неструктурированных данных. С тех пор вышло множество обновлений, и MongoDB по-прежнему пользуется огромной популярностью — по рейтингу портала DB-Engines, она входит в пять самых востребованных СУБД в мире.

В MongoDB данные хранятся неструктурированно, в виде специальных документов. Они записаны в формате BSON — это бинарная версия популярного формата JSON. Все документы в базе — это набор пар «поле—значение», где в качестве значения может быть что угодно, от чисел и дат до других вложенных документов. Неважно, в каком виде и формате создан документ — он спокойно «ляжет» в базу данных MongoDB без предварительной обработки.

Внутри документов существуют поля, а сами документы объединяются в коллекции, что и позволяет так или иначе структурировать неструктурированные данные
Вот как может выглядеть структура коллекции MongoDB со списком пользователей:

{
"_id": ObjectId("5fa0f4d3e4806d041fd7b3da"),
"name": "Alice",
"age": 26,
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phone_numbers": [
{ "type": "home", "number": "555-1234" },
{ "type": "work", "number": "555-5678" }
]
},
{
"_id": ObjectId("5fa0f4d3e4806d041fd7b3db"),
"name": "Bob",
"age": 35,
"email": "bob@example.com",
"address": {
"street": "456 Broadway",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phone_numbers": [
{ "type": "home", "number": "555-4321" },
{ "type": "cell", "number": "555-8765" }
]
}

Здесь есть два объекта-файла — Alice и Bob. Внутри каждого — поля и их значения. Также у каждого файла есть идентификатор, _id, по которому можно искать, редактировать и обновлять записи.

Отличия от конкурентов

От SQL-баз MongoDB отличается структурой хранения данных, и это отличие принципиально. Однако существуют и другие NoSQL-СУБД: Couchbase, ArangoDB, OrientDB и т.п. Они также хранят данные в виде документов и выступают прямыми конкурентами MongoDB. Рассмотрим, чем Mongo отличается именно от них:

Кросс-платформенность. MongoDB написана на языке С++ и работает на всех популярных операционных системах: Windows, macOS и разных дистрибутивах Linux. Это позволяет использовать её практически на любых серверах.

Реплицирование. Данные в MongoDB не хранятся в одном месте — они поделены между разными серверами. Один из серверов ключевой, первичный (от англ. primery), и на нём выполняются все основные операции. Другие серверы вторичные (от англ. secondary), на них копируют записи из основного. Если с ключевым сервером что-то происходит, например его обновляют, главной становится копия. Это свойство позволяет избежать потери данных и сохраняет их доступность.

Шардирование. Когда все запросы идут через один сервер, это уменьшает пропускную способность. Чтобы этого избежать, MongoDB позволяет создать несколько шардов ― частей, в которых хранятся разные данные. Управляющая система знает, где какие данные лежат, и распределяет запросы по разным серверам. Это позволяет параллельно обрабатывать больше информации.

Получается достаточно сложная ветвистая структура, в которой запрос от приложения обрабатывается роутером, а потом поступает на один из шардов, где его обрабатывает первичный сервер

Ограниченный размер документов. Каждый документ в базе должен быть не больше 16 МБ. Если это значение нужно превысить, приходится прибегать к ухищрениям — создавать отдельные коллекции для метаданных и разбивать данные на небольшие файлы.

Индексация и специальные запросы. Всем полям в базах присваиваются индексы, которые позволяют ускорить поиск и доступ к данным. Также собственный язык запросов позволяет искать по диапазонам и полям, использовать регулярные значения и возвращать отдельные пользовательские функции. Это делает СУБД MongoDB удобной для аналитики.

Преимущества и недостатки MongoDB

Преимущества

Быстрая загрузка информации. Поскольку данные не нужно преобразовывать в таблицы, они помещаются в БД почти в неизменном виде, что гораздо быстрее.
Гибкость и масштабируемость. Если требуется добавить новое поле или тип файла, не нужно пересобирать всю базу заново — его достаточно просто добавить. Это позволяет легко расширять базу и хранить в ней даже файлы, изначально не предусмотренные структурой.
Надежность. Благодаря реплицированию данные всегда в большей сохранности, а база сохраняет доступность даже при обновлении или поломках.
Поддержка разных языков. Многие языки программирования имеют встроенные инструменты для работы с MongoDB. Например, её часто используют в веб-разработке — и в node.js для подключения MongoDB есть Mongoose.

Недостатки

Сложная поддержка ACID. ACID — это правила к транзакциям в базах данных. MongoDB добавили их в 2018 году, но чтобы они работали, требуется запустить не просто сервер, а набор реплик или сегментированный кластер. И даже в этом случае у транзакций есть свои особенности, которые придется учитывать.
Отсутствие бэкапов. В бесплатной версии из коробки их нет — за них придется доплатить.
Недостаточная защищенность. По умолчанию в MongoDB не встроены достаточно надежные инструменты защиты данных. Их нужно устанавливать и настраивать отдельно.
Отсутствие механизмов обеспечения целостности данных. В некоторых базах данных есть встроенные функции, которые позволяют избежать ошибок в данных: Foreign Keys, Constraints и другие. В MongoDB их нет.

Использование MongoDB

MongoDB лучше всего использовать там, где требуется хранить и анализировать большое количество фрагментов информации, не связанных друг с другом. Например, для:

● каталогов интернет-магазинов;
● системных логов;
● записей с датчиков и интернета вещей;
● данных из мобильных приложений;
● кэша;
● данных о пользователях сервиса или приложения.

Для всех этих задач важна масштабируемость и гибкость, так как данные поступают в больших объемах и разнообразных форматах.

Но есть ситуации, в которых использовать MongoDB не стоит:

Данных в проекте не так уж много. Когда объёмы информации небольшие, настраивать и поддерживать MongoDB не обязательно — особенно если в команде приняты реляционные базы данных.
Есть жесткие требования к целостности данных. Поскольку MongoDB не соответствует ACID, лучше не использовать её там, где целостность данных — важный и критичный показатель.
Требуется сложная аналитика. MongoDB быстро обрабатывает простые аналитические запросы, но сложные ей даются с трудом и требуют множества ресурсов из-за плохой связности данных.

Окончательно решать, использовать ли в компании MongoDB, должен специалист. На курсе «Инженер данных с нуля» студентов в том числе учат выбирать правильные инструменты для хранения и обработки данных и грамотно с ними работать.

Установка и настройка MongoDB

Чтобы установить и настроить MongoDB, нужно пройти несколько шагов:

1. Скачать MongoDB с официального сайта и установить. На официальном сайте сайте есть несколько версий — нужно изучить и выбрать подходящую под потребности компании.

2. Создать на сервере каталог для хранения баз данных и журналов. Это может быть ‘C:/data/db’ для Windows или ‘/data/db’ для Linux или macOS. Убедиться, что пользователь, от имени которого планируется запускать сервер MongoDB, имеет права на запись и чтение в созданных папках.

3. Запустить сервер MongoDB. Это можно сделать из командной строки, перейдя в папку с установленной программой и выполнив команду mongod. Также можно запустить сервер как службу на фоне, чтобы он работал автономно и запускался вместе с запуском операционной системы. Для этого нужно будет создать и настроить файл конфигурации MongoDB и затем запустить сервер MongoDB командой mongod --config <путь_к_файлу_конфигурации>.

4. Сформировать конфигурационный файл. В нем можно задавать такие параметры, как порт для подключения к MongoDB, максимальный размер хранилища базы данных, настройки журналирования и другие параметры.

Вот пример конфигурационного файла MongoDB, который можно использовать в качестве основы для настройки сервера:

# путь к папке с базами данных
dbpath = /var/lib/mongodb

# ip-адрес и порт для подключения к серверу
bind_ip = 127.0.0.1
port = 27017

# путь к папке с журналами
logpath = /var/log/mongodb/mongod.log

# уровень журналирования
verbosity = 1

# размер журнального файла в мегабайтах
logrotate = 10

# активация аудита запросов к базе для безопасности
auditDestination = file
auditPath = /var/log/mongodb/audit.log

# включение авторизации и конфигурация пользователей
security:
authorization: enabled
keyFile: /etc/mongodb/keyfile

# некоторые настройки для мониторинга сервера
setParameter:
enableLocalhostAuthBypass: false
enableTestCommands: false

Это пример конфигурации для Linux — для Windows можете использовать аналогичную конфигурацию, но указывать другие пути к папкам, в зависимости от потребностей и настроек операционной системы. Важно изменять настройки конфигурации и подстраивать их под свои нужды. Подробнее о конфигурации можно узнать в официальной документации MongoDB.

После установки и настройки MongoDB можно начать работу с базой данных, используя доступные клиентские библиотеки и инструменты разработки для работы с MongoDB.

Совет эксперта

Александр Югов
Я познакомился с MongoDB в 2014 году. Лид компании, в которой я работал, сказал, что она как пластилин, и мне до сих пор нравится эта аналогия. Если неизвестно, с чем придется работать завтра, и важно хранить данные с различной структурой — советую выбирать MongoDB, она даст необходимую гибкость.
Статью подготовили:
Александр Югов
Nebius
Head of Data Office
Яндекс Практикум
Редактор
Анастасия Павлова
Яндекс Практикум
Иллюстратор

Дайджест блога: ежемесячная подборка лучших статей от редакции

Поделиться

Успейте начать учебу в Практикуме до конца ноября со скидкой 20%

Wed Jul 31 2024 23:27:59 GMT+0300 (Moscow Standard Time)