MongoDB — это кроссплатформенная документо - ориентированная база данных с доступным исходным кодом . MongoDB, классифицированная как продукт базы данных NoSQL , использует JSON -подобные документы с дополнительными схемами . MongoDB разработан компанией MongoDB Inc. , а текущие версии лицензируются по лицензии Server Side Public License (SSPL). MongoDB в настоящее время является пятым по популярности движком баз данных. [5]
Американская компания-разработчик программного обеспечения 10gen начала разработку MongoDB в 2007 году как компонента запланированного продукта «платформа как услуга» . В 2009 году компания перешла на модель разработки с открытым исходным кодом и начала предлагать коммерческую поддержку и другие услуги. В 2013 году 10gen сменила название на MongoDB Inc, [6] и MongoDB получила награду DB-Engines в 2013 и 2014 годах за механизм базы данных, получивший наибольшую популярность в те годы.
8 ноября 2018 г. в стабильной версии 4.0.4 лицензия на программное обеспечение была изменена с AGPL 3.0 на SSPL. [7] [8]
30 октября 2019 года MongoDB Inc. объединилась с Alibaba Cloud , чтобы предложить клиентам Alibaba Cloud решение MongoDB как услуга. Клиенты могут использовать управляемое предложение из глобальных центров обработки данных Alibaba. [9]
MongoDB поддерживает запросы по полям, диапазонам и поиск по регулярным выражениям . [33] Запросы могут возвращать определенные поля документов, а также включать определяемые пользователем функции JavaScript . Запросы также можно настроить на возврат случайной выборки результатов заданного размера.
Поля в документе MongoDB можно индексировать с помощью первичных и вторичных индексов.
MongoDB обеспечивает высокую доступность с помощью наборов реплик. [34] Набор реплик состоит из двух или более копий данных. Каждый член набора реплик может выступать в роли первичной или вторичной реплики в любое время. По умолчанию все операции записи и чтения выполняются в первичной реплике. Вторичные реплики сохраняют копию данных первичной с помощью встроенной репликации. При сбое первичной реплики набор реплик автоматически проводит процесс выбора, чтобы определить, какая вторичная реплика должна стать первичной. Вторичные устройства могут дополнительно выполнять операции чтения, но по умолчанию эти данные являются согласованными только в конечном итоге.
Если реплицированное развертывание MongoDB имеет только один дополнительный элемент, в набор необходимо добавить отдельный демон , называемый арбитром. Он несет единственную ответственность за принятие решения по выборам новых праймериз. [35] Как следствие, идеальное распределенное развертывание MongoDB требует как минимум трех отдельных серверов, даже если только один основной и один дополнительный. [35]
MongoDB масштабируется горизонтально с помощью шардинга . [36] Пользователь выбирает сегментный ключ, который определяет, как будут распределяться данные в коллекции. Данные разбиваются на диапазоны (на основе ключа сегмента) и распределяются по нескольким сегментам, которые являются мастерами с одной или несколькими репликами. Альтернативно, ключ сегмента может быть хеширован для сопоставления с сегментом, что обеспечивает равномерное распределение данных.
MongoDB может работать на нескольких серверах, балансируя нагрузку или дублируя данные, чтобы поддерживать работоспособность системы в случае сбоя оборудования.
MongoDB можно использовать как файловую систему , называемую GridFS, с функциями балансировки нагрузки и репликации данных на нескольких машинах для хранения файлов.
Эта функция, называемая файловой системой сетки , [37] включена в драйверы MongoDB. MongoDB предоставляет разработчикам функции для манипулирования файлами и контентом. Доступ к GridFS можно получить с помощью утилиты mongofiles или плагинов для Nginx [38] и Lighttpd . [39] GridFS делит файл на части или фрагменты и сохраняет каждый из этих фрагментов как отдельный документ. [40]
MongoDB предоставляет три способа выполнения агрегации: конвейер агрегации, функцию уменьшения карты и одноцелевые методы агрегации. [41]
Map-reduce можно использовать для пакетной обработки данных и операций агрегирования. Однако, согласно документации MongoDB, конвейер агрегации обеспечивает более высокую производительность для большинства операций агрегации. [42]
Платформа агрегирования позволяет пользователям получать результаты, аналогичные тем, которые возвращаются запросами, включающими предложение SQL GROUP BY. Операторы агрегации могут быть объединены в конвейер, аналогичный каналам Unix . Платформа агрегирования включает оператор $lookup, который может объединять документы из нескольких коллекций, а также статистические операторы, такие как стандартное отклонение.
JavaScript можно использовать в запросах, функциях агрегирования (таких как MapReduce ) и отправлять непосредственно в базу данных для выполнения.
MongoDB поддерживает коллекции фиксированного размера, называемые ограниченными коллекциями. Этот тип коллекции поддерживает порядок вставки и после достижения указанного размера ведет себя как циклическая очередь .
MongoDB поддерживает многодокументные транзакции ACID с момента выпуска версии 4.0 в июне 2018 года. [43]
MongoDB Community Edition бесплатен и доступен для Windows, Linux и macOS. [44]
MongoDB Enterprise Server — это коммерческая версия MongoDB, доступная как часть подписки MongoDB Enterprise Advanced. [45]
MongoDB также доступен как полностью управляемый сервис по требованию. MongoDB Atlas работает на AWS, Microsoft Azure и Google Cloud Platform. [46]
10 марта 2022 года MongoDB предупредила своих пользователей в России и Белоруссии , что их данные, хранящиеся на платформе MongoDB Atlas, будут уничтожены в результате американских санкций, связанных с российско-украинской войной . [47]
MongoDB имеет официальные драйверы для основных языков программирования и сред разработки. [48] Существует также большое количество неофициальных или поддерживаемых сообществом драйверов для других языков программирования и платформ.
Основным интерфейсом к базе данных была оболочка mongo. Начиная с MongoDB 3.2, MongoDB Compass представлен как собственный графический интерфейс. Существуют продукты и сторонние проекты, предлагающие пользовательские интерфейсы для администрирования и просмотра данных. [49]
По состоянию на октябрь 2018 года MongoDB выпускается под лицензией Server Side Public License (SSPL), несвободной лицензией, разработанной в рамках проекта. Она заменяет Стандартную общественную лицензию GNU Affero и почти идентична Стандартной общественной лицензии GNU версии 3 , но требует, чтобы те, кто делает программное обеспечение общедоступным как часть «услуги», сделали весь исходный код службы (в той степени, в которой пользователь смогут сами воссоздать услугу), доступную по этой лицензии. Напротив, AGPL требует, чтобы исходный код лицензионного программного обеспечения был предоставлен пользователям только тогда, когда программное обеспечение передается по сети. [50] [51] SSPL был представлен на сертификацию Open Source Initiative , но позже отозван. [52] В январе 2021 года Инициатива открытого исходного кода заявила, что SSPL не является лицензией с открытым исходным кодом. [53] Языковые драйверы доступны по лицензии Apache . Кроме того, MongoDB Inc. предлагает собственные лицензии для MongoDB. Последние версии, лицензированные как AGPL версии 3, — это 4.0.3 (стабильная) и 4.1.4. [54]
MongoDB был удален из дистрибутивов Debian , Fedora и Red Hat Enterprise Linux из-за изменения лицензии. Fedora определила, что SSPL версии 1 не является лицензией свободного программного обеспечения, поскольку она «намеренно создана с целью агрессивной дискриминации» по отношению к коммерческим пользователям. [55] [56]
Из-за конфигурации безопасности MongoDB по умолчанию, которая предоставляет любому пользователю полный доступ к базе данных, данные из десятков тысяч установок MongoDB были украдены. Кроме того, многие серверы MongoDB были задержаны с целью получения выкупа . [57] [58] В сентябре 2017 года Дэви Оттенхаймер, руководитель отдела безопасности продуктов MongoDB, заявил, что были приняты меры для защиты от этих рисков. [59]
Начиная с версии MongoDB 2.6, двоичные файлы официальных пакетов MongoDB RPM и DEB по умолчанию привязываются к localhost . Начиная с MongoDB 3.6, это поведение по умолчанию было распространено на все пакеты MongoDB на всех платформах. В результате все сетевые подключения к базе данных запрещаются, если это явно не настроено администратором. [60]
В некоторых сценариях сбоя, когда приложение может получить доступ к двум различным процессам MongoDB, которые не могут получить доступ друг к другу, MongoDB может вернуть устаревшие операции чтения. MongoDB также может откатить записи, которые были подтверждены. [61] Проблема была решена в версии 3.4.0, выпущенной в ноябре 2016 года, [62] и распространялась на более ранние выпуски, начиная с версии 3.2.12. [63]
До версии 2.2 блокировки реализовывались отдельно для каждого процесса сервера. В версии 2.2 блокировки были реализованы на уровне базы данных. [64] Начиная с версии 3.0, [65] доступны подключаемые механизмы хранения, и каждый механизм хранения может реализовывать блокировки по-разному. [65] В MongoDB 3.0 блокировки реализованы на уровне коллекции для механизма хранения MMAPv1, [66] в то время как механизм хранения WiredTiger использует протокол оптимистического параллелизма, который эффективно обеспечивает блокировку на уровне документа. [67] Даже в версиях до 3.0 одним из способов повышения параллелизма является использование сегментирования . [68] В некоторых ситуациях операции чтения и записи снимают блокировки. Если MongoDB прогнозирует, что страница вряд ли будет находиться в памяти, операции заблокируют ее во время загрузки страниц. Использование возможности блокировки значительно расширилось в версии 2.2. [69]
До версии 3.3.11 MongoDB не могла выполнять сортировку на основе сопоставления и ограничивалась побайтовым сравнением через memcmp , что не обеспечивало правильного порядка для многих неанглийских языков при использовании с кодировкой Unicode . Проблема устранена 23 августа 2016 г.
До MongoDB 4.0 запросы к индексу не были атомарными. Документы, которые были обновлены во время выполнения запросов, могли быть пропущены. [70] Введение проблемы чтения снимков в MongoDB 4.0 устранило этот риск. [71]
MongoDB заявила, что версия 3.6.4 прошла «самые жесткие в отрасли тесты на безопасность, правильность и согласованность данных» от Jepsen и что «MongoDB предлагает одни из самых надежных гарантий согласованности, правильности и безопасности данных среди всех доступных сегодня баз данных». [72] Jepsen, которая называет себя «компанией, занимающейся исследованием безопасности распределенных систем», оспорила оба утверждения в Твиттере, заявив: «В этом отчете MongoDB по умолчанию потеряла данные и нарушила причинно-следственную связь». В своем отчете о MongoDB версии 4.2.6 за май 2020 года Джепсен написал, что MongoDB упомянула только тесты, которые прошла версия 3.6.4, а версия 4.2.6 создала больше проблем. [73] Краткое описание испытаний Джепсена частично гласит:
Джепсен оценил MongoDB версии 4.2.6 и обнаружил, что даже при самых высоких уровнях сложности чтения и записи не удалось сохранить изоляцию моментальных снимков. Вместо этого Джепсен наблюдал перекосы при чтении, циклический поток информации, повторяющиеся записи и нарушения внутренней согласованности. Слабые значения по умолчанию означали, что транзакции могли потерять записи и разрешить грязное чтение, даже понижая запрошенные уровни безопасности на уровне базы данных и коллекции. Более того, проблема чтения моментальных снимков не гарантировала моментальный снимок, если она не сочеталась с проблемой большинства записи — даже для транзакций только для чтения. Такие конструктивные решения усложняют безопасное использование транзакций MongoDB. [74]
26 мая Джепсен обновил отчет, заявив: «MongoDB обнаружила ошибку в механизме повтора транзакций, которая, по их мнению, является причиной аномалий, наблюдаемых в этом отчете; исправление запланировано на версию 4.2.8». [74] Проблема была исправлена в этой версии, и «Критика Джепсена в отношении проблем записи по умолчанию также была рассмотрена, при этом проблема записи по умолчанию теперь повышена до уровня проблемы большинства (w: большинство) из MongoDB 5.0». [75]
MongoDB Inc. проводит ежегодную конференцию разработчиков под названием MongoDB World или MongoDB.live. [76]