Подтвердить что ты не робот

Схемы PostgreSQL для приложений с несколькими арендаторами

Я узнаю о multi-tenant приложениях и о том, как можно использовать схемы PostgreSQL для этого.

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

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

Почему производительность будет хуже, если данные разделены во множестве небольших таблиц (в нескольких схемах), чем разделение данных в нескольких огромных таблицах (в одной схеме)?

4b9b3361

Ответ 1

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

tenant-schema лучше всего, когда у вас относительно небольшое количество довольно крупных арендаторов. Примером этого может служить приложение учета, в котором участвуют только платные подписчики. Вещи, которые делают его лучшим вариантом для вас, включают:

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

Вещи, которые делают его малоэффективным, включают:

  • много арендаторов с очень маленькими данными каждый
  • безстоящий подход к соединениям, где каждый запрос может быть любым арендатором
  • клиентская библиотека или orm, которая кэширует метаданные для всех таблиц (например, ActiveRecord)
  • требование эффективного и высокопроизводительного пула соединений и/или кеширования
  • проблемы с VACUUM и другими административными операциями PostgreSQL, которые плохо масштабируются по 1000 таблиц.

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

shared-table работает лучше для ситуаций, когда у вас много арендаторов, и у многих ваших арендаторов очень мало данных. Примером этого может служить социальное мобильное приложение, которое разрешает бесплатные учетные записи и, следовательно, имеет тысячи заброшенных учетных записей. Другие вещи, которые делают полезную общую модель таблицы:

  • лучше для объединения пулов, так как все подключения могут использовать один и тот же пул
  • лучше для администрирования PostgreSQL из-за меньшего количества таблиц
  • лучше для изменений миграции и схемы, так как существует только один "набор" таблиц

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

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

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

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