Каков рекомендуемый подход к многопользовательским базам данных в MongoDB?
Я думаю о создании мультитенантного приложения с помощью MongoDB. У меня пока нет никаких предположений о том, сколько арендаторов у меня будет, но я хотел бы иметь возможность масштабироваться в тысячи.
Я могу придумать три стратегии:
- все арендаторы в одной коллекции, используя поля, специфичные для арендаторов, для обеспечения безопасности
- 1 коллекция на одного арендатора в одной общей БД
- 1 база данных на одного арендатора
голос в моей голове предлагает мне пойти с вариантом 2.
мысли и выводы, кто-нибудь?
6 ответов:
У меня есть та же проблема, чтобы решить, а также рассмотреть варианты. Поскольку у меня есть многолетний опыт создания мультитенантных приложений SaaS, я также собирался выбрать второй вариант, основанный на моем предыдущем опыте работы с реляционными базами данных.
во время моего исследования я нашел эту статью на сайте поддержки mongodb: http://support.mongohq.com/use-cases/multi-tenant.html
ребята заявили, чтобы избежать 2-го варианта любой ценой, который, как я понять не особенно специфично для mongodb. У меня сложилось впечатление, что это применимо для большинства баз данных NoSQL, которые я исследовал (CoachDB, Cassandra, Couchbase Server и т. д.) в связи со спецификой проектирования базы данных.
коллекции (или ведра, или как они называются в разных базах данных) - это не то же самое, что схемы безопасности в СУБД, несмотря на то, что они ведут себя как контейнер для документов, они бесполезны для применения хорошего разделения клиентов. Я не смог найти базу данных NoSQL, которая может применение ограничений безопасности на основе коллекций.
конечно, вы можете использовать безопасность на основе ролей mongodb для ограничения доступа на уровне базы данных/сервера. (http://docs.mongodb.org/manual/core/authorization/)
Я бы рекомендовал 1-й вариант, когда:
- у вас есть достаточно времени и ресурсов, чтобы справиться со сложностью разработка, реализация и тестирование данного сценария.
- если вы не собираетесь иметь много различия в структуре и функциональность в базе данных для разных арендаторов.
- ваш дизайн приложения позволит арендаторам сделать только минимальный настройки во время выполнения.
- если вы хотите оптимизировать пространство и минимизировать использование аппаратных ресурсы.
- если вы собираетесь иметь тысячи арендаторов.
- если вы хотите масштабировать быстро и по хорошей стоимости.
- если вы не собираетесь создавать резервные копии данных на основе арендаторов (сохранить отделять резервные копии для каждого клиента). Это можно сделать даже в этом сценарий, но усилия будут огромными.
Я бы пошел на Вариант 3, Если:
- у вас будет небольшой список арендаторов (несколько сотен).
- специфика бизнеса требует, чтобы вы могли поддерживать большие различия в структуре базы данных для разных арендаторов (например, интеграция со сторонними системами, импорт-экспорт данных).
- ваш дизайн приложения позволит клиентам (арендаторам) внести существенные изменения во время выполнения приложения (добавление модулей, настройка полей и т. д.).
- если у вас достаточно ресурсов для быстрого масштабирования с новыми аппаратными узлами.
- если требуется сохранить версии / резервные копии данных для каждого клиента. Также восстановление будет легким.
- существуют правовые / нормативные ограничения, которые заставляют вас хранить разных арендаторов в разных базах данных (даже данные центры.)
- если вы хотите полностью использовать готовые функции безопасности mongodb, такие как роли.
- есть большие различия в вопросе размера между арендаторами (у вас есть много мелких арендаторов и несколько очень крупных арендаторов).
Если вы опубликуете дополнительную информацию о своем заявлении, возможно, я могу дать вам более подробный совет.
Я нашел хороший ответ в комментариях по этой ссылке:
http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/
в основном вариант №2, кажется, лучший способ пойти.
цитата из комментария Дэвида Миттона:
мы решили не иметь базу данных для каждого клиент из-за способа MongoDB выделяет свои файлы данных. Каждый база данных использует свой собственный набор файлов:
первый файл для базы данных имя_бд.0, затем dbname.1, etc. имя_бд.Ноль будет 64MB, dbname.1 128MB, etc., вверх до 2 ГБ. Как только файлы достигают 2 ГБ размер, каждый последующий файл также 2 ГБ.
таким образом, если последний файл данных присутствует скажем, 1 ГБ, этот файл может быть на 90% пустым если он был недавно достигнут.
из руководства.
Как пользователи подписываются на пробную версию и дают дела идут, мы бы получили больше и больше базы данных, которые были не менее 2 ГБ в размер, даже если все данные файл не был использован. Мы обнаружили, что это используется огромный объем дискового пространства по сравнению чтобы иметь несколько баз данных для всех клиенты, где дисковое пространство может быть используется с максимальной эффективностью.
осколки будут на каждой коллекции основе как стандарт, который представляет собой проблема, где коллекция никогда достигает минимального размера для начала осколки, как это имеет место для довольно немногие из наших (например сборники просто хранение учетных данных пользователя). Однако, мы просили, чтобы это было также быть в состоянии быть сделано на каждой базе данных уровень. Видеть http://jira.mongodb.org/browse/SHARDING-41
нет компромиссов производительности используя множество коллекций. Видеть http://www.mongodb.org/display/DOCS/Using+A + большое + количество + коллекций
здесь разумная статья на MSDN о мультитенантной архитектуры данных на который вы, возможно, захотите сослаться. Некоторые ключевые темы, затронутые в этой статье:
- экономические соображения
- безопасность
- соображения арендатора
- нормативные (правовые)
- набор навыков касается
также затронуты некоторые шаблоны для программного обеспечения как услуги (SaaS) конфигурация.
кроме того, стоит Гандера интересные записи из SQL в любом месте, ребята!--2-->.
мое личное взятие-если вы не уверены в принудительной безопасности / доверии, Я бы пошел с вариантом 3, или если проблемы масштабируемости запрещают возврат к варианту 2 как минимум. То, что сказал... Я не профессионал с MongoDB. Я очень нервничаю, используя общую "схему", но я с радостью уступлю более опытным практикам.
Я бы пошел на Вариант 2.
однако вы можете установить mongod.опция командной строки exe --smallfiles. Это означает, что максимальный размер файла размер будет 0.5 гигабайта, а не 2 гигабайта. Я проверил это с монго 1.42 . Так что Вариант 3 не является невозможным.
хотя обсуждение здесь идет на NoSQL и в первую очередь MongoDB, мы в Citus используют PostgreSQL и создают распределенную/разделенную многопользовательскую базу данных.
наши use-case guide просматривает пример приложения, охватывающий схему и различные мультитенантные специфические функции.
дополнительные неструктурированных данных, мы используем столбец типа JSONB в PostgreSQL для хранения таких и арендатором-конкретные данные.
согласно моим исследованиям в MongoDB. Trucos y consejos. Aplicaciones multitenant. этот вариант не рекомендуется, если вы не знаете, сколько клиентов у вас может быть, это могут быть тысячи, и это будет сложно, когда дело доходит до сегментирования, также представьте себе, что тысячи коллекций в одной базе данных ... Поэтому в вашем случае рекомендуется использовать Вариант номер один. Теперь, если у вас будет ограниченное количество пользователей, это уже другое, и да, вы можете использовать опцию два, как ты и думал.
Comments