Модели сегментирования
Область применения: Azure Cosmos DB для PostgreSQL (на базе расширения базы данных Citus до PostgreSQL)
Сегментирование — это метод, используемый в системах баз данных и распределенных вычислениях для горизонтальной секционирования данных между несколькими серверами или узлами. Она включает разделение большой базы данных или набора данных на меньшие, более управляемые части, называемые сегментами. Сегмент содержит подмножество данных и вместе сегменты образуют полный набор данных.
Azure Cosmos DB для PostgreSQL предлагает два типа сегментирования данных, а именно на основе строк и схемы. Каждый вариант поставляется с собственными компромиссами сегментирования, что позволяет выбрать подход, который лучше всего соответствует требованиям вашего приложения.
Сегментирование на основе строк
Традиционный способ, в котором таблицы сегментов Azure Cosmos DB для PostgreSQL являются одной базой данных, общей моделью схемы, также известной как сегментирование на основе строк, клиенты сосуществуют как строки в одной таблице. Клиент определяется путем определения столбца распространения, который позволяет разделить таблицу по горизонтали.
На основе строк используется наиболее эффективный аппаратный способ сегментирования. Клиенты плотно упакованы и распределены между узлами в кластере. Однако этот подход требует убедиться, что все таблицы в схеме имеют столбец распространения и все запросы в фильтре приложения. Сегментирование на основе строк освещается в рабочих нагрузках Интернета вещей и для достижения оптимального объема использования оборудования.
Преимущества:
- Оптимальная производительность
- Оптимальная плотность клиента на узел
Недостатки:
- Требуется изменение схемы
- Требуется изменение запросов приложения
- Все клиенты должны совместно использовать одну схему
Сегментирование на основе схемы
Доступно в Citus 12.0 в Azure Cosmos DB для PostgreSQL, сегментирование на основе схемы — это общая база данных, отдельная модель схемы, схема становится логическим сегментом в базе данных. Мультитенантные приложения могут использовать схему для каждого клиента, чтобы легко сегментировать по измерению клиента. Изменения запросов не требуются, и приложению требуется только небольшое изменение, чтобы задать правильный search_path при переключении клиентов. Сегментирование на основе схемы — идеальное решение для микрослужб, а также для поставщиков программного обеспечения, развертывающих приложения, которые не могут пройти изменения, необходимые для подключения сегментирования на основе строк.
Преимущества:
- Клиенты могут иметь разнородные схемы
- Никаких изменений схемы не требуется
- Изменения запросов приложения не требуются
- Совместимость с сегментированием SQL на основе схемы лучше по сравнению с сегментированием на основе строк
Недостатки:
- Меньше клиентов на узел по сравнению с сегментированием на основе строк
Компромиссы сегментирования
Сегментирование на основе схемы | Сегментирование на основе строк | |
---|---|---|
Модель многотенантности | Отдельная схема для каждого клиента | Общие таблицы со столбцами идентификатора клиента |
Версия Citus | 12.0+ | Все версии |
Дополнительные шаги по сравнению с ванили PostgreSQL | Нет, только изменение конфигурации | Использование create_distributed_table для каждой таблицы для распространения и создания таблиц по идентификатору клиента |
Количество клиентов | 1-10k | 1-1 М+ |
Требование к моделированию данных | Внешние ключи в распределенных схемах | Необходимо включить столбец идентификатора клиента (столбец распространителя, также известный как ключ сегментирования) в каждой таблице, а также в первичных ключах, внешние ключи |
Требование SQL для запросов с одним узлом | Использование одной распределенной схемы для каждого запроса | Соединения и предложения WHERE должны содержать столбец tenant_id |
Параллельные запросы между клиентами | No | Да |
Пользовательские определения таблиц для каждого клиента | Да | Нет |
Управление доступом | Разрешения схемы | Разрешения схемы |
Общий доступ к данным между клиентами | Да, использование ссылочных таблиц (в отдельной схеме) | Да, использование ссылочных таблиц |
Изоляция клиента для сегментирования | Каждый клиент имеет собственную группу сегментов по определению | Может предоставлять идентификаторы конкретного клиента собственной группе сегментов с помощью isolate_tenant_to_new_shard |