Как создать мультитенантную базу данных со структурами общих таблиц?


наше программное обеспечение в настоящее время работает на MySQL. Данные всех арендаторов хранятся в одной схеме. Поскольку мы используем Ruby on Rails, мы можем легко определить, какие данные принадлежат какому арендатору. Однако есть некоторые компании, конечно, которые боятся, что их данные могут быть скомпрометированы, поэтому мы оцениваем других решений.

до сих пор я видел три варианта:

  • мульти-база данных (каждый клиент получает свой собственный-почти то же самое, что и 1 сервер на каждый заказчик)
  • мульти-схема (недоступна в MySQL, каждый клиент получает свою собственную схему в общей базе данных)
  • общая схема (наш текущий подход, возможно, с дополнительной идентификационной записью в каждом столбце)

мульти-схема является моим любимым (с учетом затрат). Однако создание новой учетной записи и выполнение миграций кажется довольно болезненным, потому что мне придется перебирать все схемы и изменять их таблицы / столбцы / определения.

Q: мульти-схема, кажется, разработана, чтобы иметь немного разные таблицы для каждого клиента - я не хочу этого. Есть ли какая-либо СУБД, которая позволяет мне использовать мультитенантное решение с несколькими схемами, где структура таблицы разделяется между всеми арендаторами?

P. S. По мульти я имею в виду что-то вроде ультра-мульти (10.000+ арендаторы).

4 107

4 ответа:

однако есть некоторые компании конечно, кто боится, что их данные могут быть нарушена, поэтому мы оцениваем иное решение.

Это печально, так как клиенты иногда страдают от неправильного представления о том, что только физическая изоляция может обеспечить достаточную безопасность.

есть интересная статья MSDN под названием Мультитенантная Архитектура Данных, который вы можете проверить. Вот как авторы обратились к заблуждение в отношении общего подхода:

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

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

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

  • сколько потенциальных арендаторов вы планируете цель? Вы можете быть нигде рядом с возможностью оценить перспективное использование с полномочиями, но думайте в терминах порядков величины: вы создаете приложение для сотни жильцов? Тысячи? Десятки тысячи? Еще? Чем больше ты ожидайте, что ваша база арендаторов будет, скорее всего вы захотите рассмотреть более общий подход.

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

  • сколько одновременных конечных пользователей вы ожидаете, что средний арендатор будет поддерживать? Чем больше число, тем больше уместен более изолированный подход будет отвечать требованиям конечного пользователя.

  • вы ожидаете предложить какие-либо дополнительные услуги для каждого арендатора, такие как как резервное копирование и восстановление для каждого клиента возможности? Такие услуги проще для более изолированной подход.


обновление: Далее необходимо обновить информацию об ожидаемом количестве арендаторов.

это ожидаемое число арендаторов (10k) должно исключить подход с несколькими базами данных для большинства, если не для всех сценариев. Я не думаю, что вы будете представьте себе идею поддержания 10 000 экземпляров базы данных и создания сотен новых каждый день.

только из этого параметра кажется, что наиболее подходящим является подход с общей базой данных и одной схемой. Тот факт, что вы будете хранить только около 50 Мб на арендатора, и что не будет никаких надстроек для каждого арендатора, делает этот подход еще более подходящим.

в приведенной выше статье MSDN упоминаются три шаблона безопасности, которые решают вопросы безопасности для подхода с общей базой данных:

когда вы уверены в мерах безопасности данных вашего приложения, вы сможете предложить своим клиентам Соглашение Об Уровне Обслуживания это обеспечивает сильные гарантии безопасности данных. В вашем SLA, помимо гарантий, вы также можете опишите меры, которые вы будете принимать, чтобы гарантировать, что данные не будут скомпрометированы.

обновление 2: по-видимому, ребята из Microsoft переместили / сделали новую статью по этому вопросу, оригинальная ссылка исчезла, и это новый: многопользовательские шаблоны аренды базы данных SaaS (слава Шай Керер)

мой опыт (хотя и SQL Server) заключается в том, что мульти-база данных-это путь, где каждый клиент имеет свою собственную базу данных. Поэтому, хотя у меня нет опыта mySQL или Ruby On Rails, я надеюсь, что мой ввод может добавить некоторую ценность.

причины включают в себя :

  1. безопасность данных и аварийного восстановления. Данные каждой компании хранятся полностью отдельно от других, что снижает риск компрометации данных (например, если вы вводите ошибку кода, что означает что-то ошибочно смотрит на другие данные клиента, когда это не должно), минимизирует потенциальные потери для одного клиента, если одна конкретная база данных будет повреждена и т. д. Воспринимаемые преимущества безопасности для клиента еще больше (дополнительный бонус побочный эффект!)
  2. масштабируемость. По сути, вы будете разбивать свои данные на разделы, чтобы обеспечить большую масштабируемость - например, базы данных могут быть помещены на разные диски, вы можете подключить несколько серверов баз данных и перемещать базы данных вокруг проще распространять нагрузка.
  3. настройки производительности. Предположим, у вас есть один очень большой клиент и один очень маленький. Особенности использования, объемы данных и т. д. может меняться дико. Вы можете настроить / оптимизировать проще для каждого клиента, если вам нужно.

Я надеюсь, что это действительно предлагает некоторые полезные данные! Есть и другие причины, но мой разум опустел. Если он вернется, я обновлю :)

EDIT:
Поскольку я опубликовал этот ответ, теперь ясно, что мы говорим о 10 000+ арендаторах. Мой опыт работы с сотнями крупномасштабных баз данных - я не думаю, что 10 000 отдельных баз данных будут слишком управляемыми для вашего сценария, поэтому я теперь не одобряю подход с несколькими БД для вашего сценария. Тем более, что теперь ясно, что вы говорите о небольших объемах данных для каждого клиента!

сохраняя мой ответ здесь так же, как он может иметь некоторое использование для других людей в аналогичной лодке (с меньшим количеством арендаторов)

Ниже приведена ссылка на белый документ Salesforce.com о том, как они реализуют мульти-аренду:

http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf

У них есть 1 огромная таблица с 500 строковыми столбцами (Value0, Value1, ... Value500). Даты и числа хранятся в виде строк в таком формате, что их можно преобразовать в собственные типы на уровне базы данных. Существуют таблицы метаданных, которые определяют форма модели данных, которая может быть уникальной для каждого клиента. Есть дополнительные таблицы для индексации, отношения, уникальные значения и т. д.

Почему нервотрепка?

каждый клиент может настроить свою собственную схему данных во время выполнения без необходимости внесения изменений на уровне базы данных (alter table и т. д.). Это, безусловно, трудный способ сделать что-то подобное, но очень гибкий.

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

модель per schema не только полезна для уникальных схем для каждого, хотя все еще выполняется миграция по всем арендаторам становится сложной и на 1000 схемах У Postgres могут начаться проблемы.

более масштабируемый подход-это абсолютно случайное распределение арендаторов, хранящихся в одной базе данных, но в разных логических сегментах (или таблицы). В зависимости от вашего языка есть ряд библиотек, которые могут помочь с этим. Если вы используете Rails есть библиотека для enfore аренды acts_as_tenant, это помогает гарантировать, что ваши запросы арендатора только возвращают эти данные. Там также есть драгоценный камень apartment - хотя он использует модель схемы, она помогает с миграциями по всем схемам. Если вы используете Django есть число, но один из наиболее популярных из них, кажется, через - схемы. Все это помогает больше на уровне приложения. Если вы ищете что-то большее непосредственно на уровне базы данных, Citus фокусируется на создании этого типа осколков для мультитенантности работать больше из коробки с Postgres.