Любые мысли о приложениях Multi-tenant и Multi-database в Rails

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

Какие выгоды/компромиссы мы должны учитывать? Каковы наилучшие методы внедрения приложения с несколькими арендаторами в Rails?

Ответ 1

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

Написание приложений с несколькими арендаторами в Rails - Guy Naor

Ответ 2

Многопользовательские системы представят для вас целый ряд проблем. Мои быстрые мысли ниже

  • Все SQL должны быть проверены и реорганизован для включения ClientId стоимость.

  • Все индексы должны быть проверены на определить, должен ли ClientId быть включено

  • Ошибка в выражении SQL с помощью разработчик /sysadmin в производстве влияют на всех ваших клиентов.

  • Повреждение/проблема базы данных будет влияют на всех ваших клиентов.

  • У вас есть некоторые проблемы конфиденциальности данных в результате чего плохой код/​​реализация может разрешить клиентуA видеть данные, принадлежащие к CustomerB

  • Клиент, использующий вашу систему в тяжелая/агрессивная манера может повлиять другие потребители восприятия производительности

  • Упорядочение статических данных для индивидуальных предпочтений клиентов становится более сложным.

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

Ответ 3

Это действительно зависит от того, что вы делаете.

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

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

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

  • Миграции: Предполагается, что у вас будет только 1 база данных. Вы можете адаптировать его для нескольких баз данных, а миграция - одна из них. Для применения миграций ко всем существующим базам данных вам нужна специальная задача rake. Будьте готовы сделать много проблем, потому что миграция может преуспеть на одной БД, но сбой другой.
  • Истерирующие базы данных:. Как вы создаете новый db? Из файла SQL, скопируйте существующий db или выполните все миграции? Как вы поддерживаете схему, совместимую между вашей системой создания таблиц и вашими прямыми базами данных?
  • Подключение к соответствующей базе данных: Мы используем куки файл для хранения уникального значения, которое сопоставляется с правильным БД. Мы используем фильтр before в Авторизованном контроллере, который находится в ActionController, который получает db от этого уникального значения и использует метод connection_connection на подклассе ActiveRecord:: Base. Это позволяет нам выводить некоторые модели из общего db и других с конкретного клиента db.

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

Ответ 4

У меня нет опыта с этим лично, но во время молниеносных переговоров в 2009 году Ruby Hoedown Эндрю Коулман представил плагин, который он разработал и использует для многопользовательских баз данных в рельсах с субдоменами. Вы можете проверить слайды молнии, а здесь act_as_restricted_subdomain репозиторий.

Ответ 5

Зачем вам? У вас есть тяжелая агрегировка между пользователями или вы создаете слишком много БД? Рассматривали ли вы использование SQLite файлов на одного арендатора вместо общих серверов БД (поскольку многозадачные приложения часто являются низкопрофильными и не нуждаются в таком количестве concurrency)?