FerretDB¶
FerretDB — это система управления базами данных (СУБД) с открытым исходным кодом, выступающая в качестве прокси-слоя между клиентскими приложениями, использующими протокол MongoDB, и реляционными базами данных (в первую очередь PostgreSQL). FerretDB предоставляет интерфейс, совместимый с драйверами MongoDB, но при этом хранит данные в структурированном виде, что позволяет использовать преимущества SQL-систем без необходимости переписывать код приложений.
¶История
Проект FerretDB был основан в 2021 году как ответ на изменение лицензии MongoDB Inc. В октябре 2018 года MongoDB Inc. перевела свою СУБД с лицензии GNU AGPL v3 на собственную лицензию Server Side Public License (SSPL). SSPL была признана не соответствующей критериям Open Source Initiative (OSI) и вызвала критику в сообществе разработчиков, так как накладывала ограничения на использование продукта в облачных сервисах. В ответ на это группа разработчиков, включая бывших сотрудников MongoDB, решила создать полностью открытую и совместимую альтернативу.
Первая стабильная версия FerretDB (v1.0.0) была выпущена в ноябре 2023 года. Название проекта происходит от латинского названия хорька (Mustela putorius furo), что является отсылкой к MongoDB (от англ. humongous — «огромный»). Изначально проект поддерживал только PostgreSQL в качестве бэкенда, но впоследствии была добавлена поддержка SQLite и других реляционных СУБД.
¶Архитектура и принцип работы
FerretDB работает как прокси-сервер, который принимает запросы от клиентских приложений по протоколу MongoDB Wire Protocol и преобразует их в SQL-запросы к нижележащей реляционной базе данных. Основные компоненты архитектуры:
- Прокси-слой: обрабатывает входящие соединения, аутентификацию и маршрутизацию запросов.
- Транслятор запросов: преобразует MongoDB Query Language (MQL) в SQL-запросы, совместимые с целевой СУБД.
- Бэкенд-адаптер: отвечает за взаимодействие с конкретной реляционной базой данных (PostgreSQL, SQLite и др.).
¶Поддерживаемые бэкенды
По состоянию на 2024 год FerretDB официально поддерживает два бэкенда:
- PostgreSQL — основной и наиболее функционально полный бэкенд. Рекомендуется для production-сред.
- SQLite — лёгкий бэкенд для разработки и тестирования, а также для встраиваемых решений.
¶Совместимость с MongoDB
FerretDB стремится к максимальной совместимости с драйверами MongoDB, но не поддерживает все функции оригинальной СУБД. Основные отличия и ограничения:
¶Поддерживаемые функции
- Базовые CRUD-операции: вставка, чтение, обновление и удаление документов.
- Индексы: поддержка простых и составных индексов, включая уникальные.
- Агрегация: ограниченная поддержка пайплайнов агрегации (стадии
$match,$group,$sort,$projectи др.). - Типы данных: поддержка основных типов BSON, включая строки, числа, даты, массивы и вложенные документы.
- Аутентификация: поддержка аутентификации по паролю (SCRAM-SHA-256).
¶Неподдерживаемые функции
- Транзакции с несколькими документами: не реализованы (PostgreSQL поддерживает транзакции, но FerretDB не эмулирует многодокументную атомарность MongoDB).
- Геопространственные запросы: не поддерживаются.
- Change Streams: не реализованы.
- MapReduce: не поддерживается (рекомендуется использовать агрегацию).
- Шардирование: не поддерживается (FerretDB работает как единый узел).
- Полнотекстовый поиск: не реализован.
¶Применение
FerretDB находит применение в следующих сценариях:
- Миграция с MongoDB на PostgreSQL: организации, желающие отказаться от проприетарной СУБД, могут использовать FerretDB как промежуточный слой, не требующий переписывания кода приложений.
- Разработка и тестирование: использование FerretDB с SQLite позволяет разработчикам локально запускать приложения, написанные для MongoDB, без установки полноценной СУБД.
- Облачные среды: FerretDB может быть развёрнут в средах, где использование MongoDB нежелательно из-за лицензионных ограничений или требований к соответствию стандартам.
- Образовательные проекты: изучение принципов работы NoSQL- и SQL-систем на примере совместимого интерфейса.
¶Преимущества и недостатки
¶Преимущества
- Открытый исходный код: распространяется под лицензией Apache 2.0, что позволяет свободно использовать, модифицировать и распространять продукт.
- Совместимость с драйверами MongoDB: приложения, написанные для MongoDB, могут работать с FerretDB без изменений (в рамках поддерживаемого подмножества функций).
- Использование зрелых реляционных СУБД: PostgreSQL и SQLite имеют многолетнюю историю развития, высокую надёжность и широкую поддержку сообщества.
- Простота развёртывания: FerretDB поставляется в виде единого бинарного файла или Docker-образа.
¶Недостатки
- Ограниченная функциональность: многие продвинутые возможности MongoDB не поддерживаются.
- Снижение производительности: преобразование запросов из MQL в SQL вносит дополнительные накладные расходы.
- Отсутствие горизонтального масштабирования: в отличие от MongoDB, FerretDB не поддерживает шардирование.
- Меньшая зрелость: проект находится в активной разработке, возможны изменения API и неполная стабильность.
¶Критика
Основные критические замечания в адрес FerretDB связаны с его ограниченной совместимостью. Многие приложения, использующие специфические функции MongoDB (например, геопространственные индексы или MapReduce), не могут быть перенесены на FerretDB без существенных доработок. Кроме того, критики отмечают, что FerretDB не решает проблему «несоответствия импеданса» между документо-ориентированной и реляционной моделями данных, а лишь маскирует её.
¶См. также
- MongoDB
- PostgreSQL
- SQLite
- NoSQL
- Реляционная база данных
¶Источники
- Официальная документация FerretDB
- Репозиторий проекта на GitHub
- Статья «FerretDB: A Truly Open Source MongoDB Alternative» на сайте The New Stack
- Публикация о лицензии SSPL на сайте Open Source Initiative
