В настоящее время наше программное обеспечение работает на базе MySQL. Данные всех арендаторов хранятся в одной схеме. Поскольку мы используем Ruby on Rails, мы можем легко определить, какие данные какому клиенту принадлежат. Однако, конечно, есть компании, которые опасаются, что их данные могут быть скомпрометированы, поэтому мы оцениваем другие решения.
Пока я видел три варианта:
- Мульти-база данных (каждый арендатор получает свою собственную - почти столько же, сколько 1 сервер на клиента)
- Мульти-схема (недоступно в MySQL, каждый клиент получает свою схему в общей базе данных)
- Общая схема (наш текущий подход, возможно, с дополнительной идентификационной записью в каждом столбце)
Мультисхема - моя любимая (с учетом затрат). Однако создание новой учетной записи и выполнение миграции кажется довольно болезненным, потому что мне пришлось бы перебирать все схемы и изменять их таблицы / столбцы / определения.
В: Кажется, что мульти-схема разработана так, чтобы для каждого клиента были немного разные таблицы - я этого не хочу. Есть ли какая-либо СУБД, которая позволяет мне использовать многопользовательское решение с несколькими схемами, в котором структура таблицы является общей для всех клиентов?
PS Под мульти я подразумеваю что-то вроде ультра-мульти (10.000+ арендаторов).
источник
Ответы:
Это прискорбно, поскольку клиенты иногда ошибочно думают, что только физическая изоляция может обеспечить достаточную безопасность.
Есть интересная статья MSDN под названием « Многопользовательская архитектура данных» , которую вы, возможно, захотите проверить. Вот как авторы рассмотрели заблуждение относительно общего подхода:
Что касается технических и деловых соображений, в статье дается краткий анализ того, где один подход может быть более уместным, чем другой:
ОБНОВЛЕНИЕ: дальнейшая информация об ожидаемом количестве арендаторов.
Это ожидаемое количество клиентов (10 тыс.) Должно исключать подход с несколькими базами данных для большинства, если не для всех сценариев. Не думаю, что вам понравится идея поддерживать 10 000 экземпляров базы данных и создавать сотни новых каждый день.
По одному только этому параметру кажется, что подход с общей базой данных и единой схемой является наиболее подходящим. Тот факт, что вы будете хранить всего около 50 МБ на каждого арендатора, и что не будет никаких надстроек для каждого арендатора, делает этот подход еще более подходящим.
В цитированной выше статье MSDN упоминаются три шаблона безопасности, учитывающие соображения безопасности для подхода с общей базой данных:
Если вы уверены в мерах безопасности данных своего приложения, вы сможете предложить своим клиентам Соглашение об уровне обслуживания, которое обеспечивает надежные гарантии безопасности данных. В соглашении об уровне обслуживания, помимо гарантий, вы также можете описать меры, которые вы будете предпринимать, чтобы гарантировать, что данные не будут скомпрометированы.
ОБНОВЛЕНИЕ 2: По-видимому, ребята из Microsoft переместили / сделали новую статью по этой теме, исходная ссылка исчезла, и это новая: шаблоны аренды многопользовательской базы данных SaaS (слава Шай Керер)
источник
По моему опыту (хоть и с SQL Server), лучше всего использовать несколько баз данных, когда каждый клиент имеет свою собственную базу данных. Поэтому, хотя у меня нет опыта работы с mySQL или Ruby On Rails, я надеюсь, что мой вклад может принести пользу.
Причины почему включают:
Надеюсь, это принесет пользу! Есть еще причины, но мой разум потерял сознание. Если сработает, обновлю :)
РЕДАКТИРОВАТЬ: с
тех пор, как я опубликовал этот ответ, теперь ясно, что мы говорим о 10 000+ арендаторах. Мой опыт работы с сотнями крупномасштабных баз данных - я не думаю, что 10 000 отдельных баз данных будут слишком управляемыми для вашего сценария, поэтому сейчас я не поддерживаю подход с несколькими базами данных для вашего сценария. Тем более, что теперь ясно, что вы говорите о небольших объемах данных для каждого арендатора!
В любом случае сохраняю свой ответ здесь, поскольку он может быть полезен другим людям в аналогичной лодке (с меньшим количеством арендаторов)
источник
Ниже приведена ссылка на технический документ на Salesforce.com о том, как они реализуют мультитенантность:
http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf
У них есть 1 огромная таблица с 500 строковыми столбцами (Value0, Value1, ... Value500). Даты и числа хранятся в виде строк в таком формате, что их можно преобразовать в свои собственные типы на уровне базы данных. Существуют таблицы метаданных, которые определяют форму модели данных, которая может быть уникальной для каждого арендатора. Есть дополнительные таблицы для индексации, отношений, уникальных значений и т. Д.
Зачем хлопот?
Каждый клиент может настраивать свою собственную схему данных во время выполнения без необходимости вносить изменения на уровне базы данных (изменять таблицу и т. Д.). Это определенно трудный способ сделать что-то подобное, но он очень гибкий.
источник
Как вы упомянули, одна база данных на каждого арендатора - это вариант, и он требует больших компромиссов. Он может хорошо работать в меньшем масштабе, например, при однозначном или небольшом количестве арендаторов, но за пределами этого становится все труднее управлять. И только миграции, и просто поддержание работоспособности баз данных.
Модель для каждой схемы полезна не только для уникальных схем для каждой, хотя по-прежнему выполнение миграций для всех клиентов становится затруднительным, и при тысячах схем у Postgres могут возникнуть проблемы.
Более масштабируемый подход - это абсолютно случайное распределение клиентов, которые хранятся в одной базе данных, но в разных логических сегментах (или таблицах ). В зависимости от вашего языка существует ряд библиотек, которые могут помочь в этом. Если вы используете Rails, существует библиотека для обеспечения аренды
acts_as_tenant
, она помогает гарантировать, что ваши запросы клиента будут извлекать только эти данные. Также есть жемчужинаapartment
- хотя он использует модель схемы, он помогает с миграциями по всем схемам. Если вы используете Django, есть номер, но один из наиболее популярных, похоже, находится в разных схемах . Все это больше помогает на уровне приложений. Если вы ищете что-то большее непосредственно на уровне базы данных, Citus фокусируется на создании этого типа сегментирования дляМногопользовательская среда работает лучше с Postgres.источник