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


Основные понятия масштабирования в Azure Cosmos DB для PostgreSQL

Область применения: Azure Cosmos DB для PostgreSQL (на базе расширения базы данных Citus до PostgreSQL)

Прежде чем изучить шаги по созданию нового приложения, рекомендуем ознакомиться с основными терминами и понятиями.

Обзор архитектуры

Azure Cosmos DB для PostgreSQL дает возможность распределять таблицы и схемы между несколькими компьютерами в кластере и прозрачно запрашивать их так же, как и обычный PostgreSQL:

Схема узла-координатора, сегментирующего таблицу и размещающего сегменты в рабочих узлах.

В архитектуре Azure Cosmos DB для PostgreSQL существует несколько типов узлов:

  • Узел-координатор хранит метаданные распределенной таблицы и отвечает за распределенное планирование.
  • Напротив, рабочие узлы хранят фактические данные, метаданные и выполняют вычисления.
  • Координатор и рабочие роли являются обычными базами данных PostgreSQL с загруженным расширением citus.

Чтобы распределить обычную таблицу PostgreSQL, как campaigns на приведенной выше схеме, выполните команду create_distributed_table(). После выполнения этой команды Azure Cosmos DB для PostgreSQL прозрачно создает сегменты для таблицы на рабочих узлах. На схеме сегменты представлены как синие прямоугольники.

Чтобы распространить обычную схему citus_schema_distribute() PostgreSQL, выполните команду. После выполнения этой команды Azure Cosmos DB для PostgreSQL прозрачно превращает таблицы в такие схемы в одну группу совместно размещенных таблиц сегментов, которые можно переместить в виде единицы между узлами кластера.

Примечание.

В кластере без рабочих узлов сегменты распределенных таблиц находятся на узле координатора.

Сегменты — это обычные (но специально именованные) таблицы PostgreSQL, в которых хранятся срезы данных. В нашем примере, так как мы распределяем campaigns по company_id, сегменты вмещают кампании, причем кампании разных компаний назначаются разным сегментам.

Столбец распределения (также называемый ключом сегмента)

create_distributed_table() — это магическая функция, которую Azure Cosmos DB для PostgreSQL предоставляет для распространения таблиц и использования ресурсов на нескольких компьютерах.

SELECT create_distributed_table(
	'table_name',
	'distribution_column');

Второй аргумент выше выбирает столбец из таблицы в качестве столбца распределения. Это может быть любой столбец с собственным типом PostgreSQL (обычно это текст или целое число). Значение столбца распределения определяет, какие строки попадают в сегменты, поэтому столбец распределения также называется ключом сегмента.

Azure Cosmos DB для PostgreSQL решает, как выполнять запросы на основе их использования ключа сегментов:

Запрос включает Где выполняется
Только один ключ сегмента На рабочем узле, где хранится сегмент
Несколько ключей сегмента Параллельно между несколькими узлами

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

  • Неравномерное распределение данных по ключам сегмента снижает производительность. Например, не выбирайте столбец, для которого одно значение представляет 50 % данных.
  • Ключи сегментов с низкой кратностью могут повлиять на масштабируемость. Можно использовать столько сегментов, сколько имеются уникальных значений ключа. Выберите ключ с кратностью в сотнях тысяч.
  • Объединение двух больших таблиц с разными ключами сегментов может происходить медленно. Выберите общий ключ сегментов в больших таблицах. Дополнительные сведения о совместном размещении.

Совместное размещение

Еще одна концепция, тесно связанная с ключом сегментов, — совместное размещение. Таблицы, сегментированные по тем же значениям столбцов распределения, размещаются совместно. Сегменты совместно размещенных таблиц хранятся на одних и тех же рабочих узлах.

Ниже приведены две таблицы, сегментированные по одному и тому же ключу — site_id. Используется совместное размещение.

Схема таблиц http_request и http_request_1min с совместным размещением по site_id.

Azure Cosmos DB для PostgreSQL гарантирует, что строки с соответствующим site_id значением в обеих таблицах хранятся на одном рабочем узле. Вы увидите, что для обеих таблиц строки с site_id=1 хранятся на рабочем узле 1. Аналогично для идентификаторов других сайтов.

Совместное размещение помогает оптимизировать операции JOIN в этих таблицах. При присоединении к двум таблицам site_idAzure Cosmos DB для PostgreSQL может выполнять присоединение локально на рабочих узлах без перетасовки данных между узлами.

Таблицы в распределенной схеме всегда распределяются друг с другом.

Следующие шаги