Мультитенантность
Мультитенантность — это архитектурный принцип построения программного обеспечения, при котором один экземпляр приложения (или его компонента) обслуживает множество независимых групп пользователей, называемых «клиентами» или «арендаторами» (от англ. tenant — арендатор). Каждый арендатор работает в изолированном виртуальном окружении, воспринимая приложение как выделенную именно для него систему, при этом фактически используя общие вычислительные ресурсы (серверы, базы данных, код). Мультитенантность является одной из ключевых концепций облачных вычислений (SaaS, PaaS, IaaS), позволяя провайдерам услуг эффективно масштабировать сервисы и снижать затраты за счёт разделения инфраструктуры между множеством заказчиков.
История
Концепция мультитенантности возникла в 1990-х годах, когда стало очевидным, что традиционная модель развёртывания «одно приложение — один сервер — один клиент» (единичная аренда) плохо масштабируется и экономически неэффективна. Первые коммерческие реализации были связаны с системами управления взаимоотношениями с клиентами (CRM), где компании Salesforce и Oracle начали предлагать облачные версии своих продуктов, способные обслуживать сотни клиентов на общей платформе.
С развитием облачных технологий и распространением модели «программное обеспечение как услуга» (SaaS) в 2000-х годах мультитенантность стала стандартом де-факто. Массовое внедрение произошло благодаря:
- Amazon Web Services (AWS) — компания, зарегистрированная в США, — в конце 2000-х годов начала предлагать инфраструктуру, где один и тот же физический сервер мог быть разделён на множество виртуальных машин для разных арендаторов.
- Microsoft Azure — облачная платформа, также зарегистрированная в США, — реализовала мультитенантность на уровне платформы как услуги (PaaS), позволяя разработчикам запускать свои приложения в общем окружении.
- Google Cloud — компания, зарегистрированная в США, — внедрила мультитенантность в такие сервисы, как Gmail и Google Docs, где миллионы пользователей одновременно работают с общим кодом.
К 2010-м годам мультитенантность стала неотъемлемой частью не только облачных, но и корпоративных приложений, баз данных (например, Oracle Multitenant) и операционных систем (контейнеризация).
Архитектурные уровни
Мультитенантность может быть реализована на разных уровнях архитектуры ПО, от физического до прикладного.
Физическая мультитенантность (на уровне серверов)
Несколько арендаторов используют один и тот же физический сервер, но каждый — в своей виртуальной машине (VM) или контейнере. Изоляция достигается за счёт гипервизора или контейнерного движка (например, Docker, Kubernetes). Этот уровень наиболее прост в реализации, но менее экономичен, так как каждый экземпляр ОС или приложения потребляет ресурсы.
Мультитенантность на уровне базы данных
Самый распространённый вариант в SaaS. Существуют три основных подхода:
- Отдельная база данных для каждого арендатора — простая изоляция, высокая безопасность, но дорого при большом числе клиентов.
- Общая база данных с отдельными таблицами — все арендаторы используют одну БД, но данные каждого хранятся в выделенной таблице (с префиксом арендатора). Компромисс между изоляцией и затратами.
- Общая база данных с общими таблицами — все записи смешаны в одних и тех же таблицах, но различаются по столбцу
tenant_id. Максимальная экономия ресурсов, но сниженная изоляция и повышенные требования к безопасности запросов.
Мультитенантность на уровне приложения
В этом случае один экземпляр кода приложения обрабатывает запросы от всех арендаторов. Для идентификации арендатора обычно используется запросный параметр, заголовок HTTP (например, X-Tenant-ID) или доменное имя (например, customer1.example.com). Логика приложения должна корректно разграничивать данные и права каждого арендатора — так называемая «идентификация арендатора» (tenant awareness).
Мультитенантность на уровне ядра ОС
Исторически ранние реализации (например, операционные системы с разделением времени — mainframe IBM), но в современном виде используется в контейнеризации и виртуализации (например, Kubernetes с пространствами имён).
Классификация
В зависимости от степени изоляции и гибкости выделяют три модели мультитенантности:
Модель 1: Выделенные экземпляры (single-tenant per instance)
Каждый арендатор получает собственный независимый экземпляр приложения и/или базы данных. Изоляция максимальна, но затраты на инфраструктуру высоки. Часто применяется для крупных корпоративных клиентов с особыми требованиями к безопасности.
Модель 2: Общий экземпляр с общей базой данных (shared everything)
Все арендаторы используют один и тот же сервер, одно приложение и одну базу данных. Изоляция данных обеспечивается только через логические ключи (tenant_id). Наиболее экономичная модель, но требует тщательного проектирования для предотвращения утечек данных и снижения производительности под нагрузкой.
Модель 3: Общий экземпляр с раздельной базой данных (shared application, separate DB)
Арендаторы используют общий код и сервер приложения, но каждый имеет свою изолированную базу данных. Компромиссный вариант, балансирующий между стоимостью и безопасностью.
Примеры реализации
- Salesforce — одна из старейших SaaS-платформ — реализует мультитенантность в модели «shared everything» на уровне базы данных, где все объекты (объекты, поля) привязаны к идентификатору организации (арендатора). Пользователи каждой компании видят только свои данные.
- Microsoft 365 — офисный пакет — использует мультитенантную архитектуру на уровне приложений и баз данных. Каждый клиент (tenant) получает своё поддоменовое пространство (
tenant.onmicrosoft.com) и изолированные данные в общем кластере. - GitHub — платформа для разработки — использует мультитенантность на уровне организации: репозитории, пользователи и права доступа группируются по организациям (арендаторам), хотя код хранится в общей файловой системе.
- Amazon RDS (Relational Database Service) — услуга облачной базы данных — предоставляет возможность запускать изолированные экземпляры баз данных (по одному на арендатора) или мультитенантные кластеры с общей СУБД.
Преимущества и недостатки
Преимущества
- Экономия ресурсов: провайдер может обслуживать тысячи клиентов на одном сервере, снижая затраты на оборудование, электроэнергию и обслуживание.
- Упрощённое обновление: новая версия приложения или патч развёртываются один раз для всех арендаторов одновременно.
- Автоматическое масштабирование: при росте числа клиентов можно добавлять новые серверы без необходимости перенастройки каждого клиента.
- Быстрое внедрение: новый арендатор может начать работу практически мгновенно, без развёртывания собственной инфраструктуры.
Недостатки
- Повышенные требования к безопасности: утечка данных (например, при ошибке в логике идентификации арендатора) может затронуть сразу всех клиентов.
- Сложность изоляции производительности: «шумные соседи» (арендаторы с высокой нагрузкой) могут замедлять работу других.
- Ограниченная кастомизация: невозможно настроить приложение под уникальные потребности каждого клиента без нарушения общей архитектуры.
- Зависимость от провайдера: смена вендора или перенос данных могут быть сложными из-за нестандартных схем хранения.
Критика и риски
Наибольшая критика мультитенантности связана с проблемами безопасности и конфиденциальности. При использовании общей базы данных или сервера возрастает риск компрометации данных одного арендатора при атаке на другого (например, SSRF-атаки или SQL-инъекции с подменой tenant_id). Для снижения этих рисков применяется шифрование данных на уровне строк, строгая валидация идентификаторов арендаторов, изоляция с помощью отдельных контейнеров или виртуальных машин.
Также критикуется сложность мониторинга и отладки: в мультитенантной среде трудно определить, какой именно клиент вызвал сбой, и отделить его логи от других.
Интересные факты
- Слово «tenant» (арендатор) в этом контексте впервые употребил Дэн Грейсон (Dan Grayson) из Salesforce в 2000 году, заимствуя термин из сферы недвижимости.
- Крупнейшие SaaS-платформы (Salesforce, ServiceNow, Workday) обслуживают по несколько десятков тысяч арендаторов на одном экземпляре приложения.
- В облачных провайдерах (AWS, Azure, Google Cloud) мультитенантность является основой для услуг категории «услуга как услуга», где пользователи платят только за то, что используют, не задумываясь об инфраструктуре.
- Противоположностью мультитенантности является «единичная аренда» (single-tenant), где каждый клиент получает выделенный сервер или экземпляр ПО.
Источники
- Cloud Application Architectures: Building Applications and Infrastructure in the Cloud (George Reese, 2009)
- Building Multi-Tenant SaaS Architectures (Microsoft Patterns & Practices, 2012)
- Документация Salesforce по мультитенантности
- Статья «What is multitenancy?» (The New Stack, 2020)
- Определение термина в словаре Gartner
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →