Поделиться через


Модели шардирования

Область применения: 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.
Параллельные запросы между клиентами Нет Да
Пользовательские определения таблиц для каждого клиента Да Нет
Управление доступом Разрешения схемы Разрешения схемы
Общий доступ к данным между клиентами Да, использование ссылочных таблиц (в отдельной схеме) Да, использование ссылочных таблиц
Изоляция тенантов через шардинг Каждый клиент имеет собственную группу сегментов по определению Может предоставлять идентификаторы конкретного клиента собственной группе сегментов с помощью isolate_tenant_to_new_shard