Создание и распространение таблиц в Azure Cosmos DB для PostgreSQL

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

В этом примере мы будем использовать распределенные таблицы Azure Cosmos DB для PostgreSQL для хранения и запроса событий, записанных из GitHub открытый код участников.

Необходимые компоненты

Чтобы следовать этому краткому руководству, сначала нужно сделать следующее:

  1. Создайте кластер в портал Azure.
  2. Подключитесь к кластеру с помощью psql для выполнения команд SQL.

Создание таблиц

Выполнив подключение с помощью psql, можно приступить к созданию таблицы. Скопируйте и вставьте следующие команды в окно терминала psql и нажмите клавишу ввода для запуска:

CREATE TABLE github_users
(
	user_id bigint,
	url text,
	login text,
	avatar_url text,
	gravatar_id text,
	display_login text
);

CREATE TABLE github_events
(
	event_id bigint,
	event_type text,
	event_public boolean,
	repo_id bigint,
	payload jsonb,
	repo jsonb,
	user_id bigint,
	org jsonb,
	created_at timestamp
);

CREATE INDEX event_type_index ON github_events (event_type);
CREATE INDEX payload_index ON github_events USING GIN (payload jsonb_path_ops);

Обратите внимание, что для payload включен индекс GIN в github_events. Индекс позволяет быстро запрашивать данные в столбце JSONB. Так как Citus является расширением PostgreSQL, Azure Cosmos DB для PostgreSQL поддерживает расширенные функции PostgreSQL, такие как тип данных JSONB для хранения полуструктурированных данных.

Распределение таблиц

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

Примечание.

В реальных приложениях, когда рабочая нагрузка соответствует 64 виртуальным ядрам, 256 ГБ ОЗУ и 2TB, можно использовать кластер с одним узлом. В этом случае распределение таблиц является необязательным. Позже вы можете распространять таблицы по мере необходимости с помощью create_distributed_table_concurrently.

Давайте распределим таблицы:

SELECT create_distributed_table('github_users', 'user_id');
SELECT create_distributed_table('github_events', 'user_id');

Внимание

Распространение таблиц или использование сегментирования на основе схем необходимо использовать преимущества функций производительности Azure Cosmos DB для PostgreSQL. Если вы не распределяете таблицы или схемы, рабочие узлы не могут помочь выполнять запросы, связанные с их данными.

Загрузка данных в распределенные таблицы

Теперь можно заполнить таблицы образцами данных. В этом кратком руководстве будет использоваться набор данных, ранее захваченный из GitHub API.

Мы будем использовать расширение pg_azure_storage для загрузки данных непосредственно из общедоступного контейнера в Хранилище BLOB-объектов Azure. Сначала необходимо создать расширение в базе данных:

SELECT * FROM create_extension('azure_storage');

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

-- download users and store in table

COPY github_users FROM 'https://pgquickstart.blob.core.windows.net/github/users.csv.gz';

-- download events and store in table

COPY github_events FROM 'https://pgquickstart.blob.core.windows.net/github/events.csv.gz';

Обратите внимание, как расширение распознало, что URL-адреса, предоставленные команде копирования, из Хранилище BLOB-объектов Azure, файлы, которые мы указали, были сжатыми, и это также было автоматически обработано для нас.

Мы можем просмотреть подробные сведения о распределенных таблицах, включая их размеры, с помощью представления citus_tables:

SELECT * FROM citus_tables;
  table_name   | citus_table_type | distribution_column | colocation_id | table_size | shard_count | table_owner | access_method 
---------------+------------------+---------------------+---------------+------------+-------------+-------------+---------------
 github_events | distributed      | user_id             |             1 | 388 MB     |          32 | citus       | heap
 github_users  | distributed      | user_id             |             1 | 39 MB      |          32 | citus       | heap
(2 rows)

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

Итак, мы распределили таблицы и загрузили в них данные. Теперь попробуем выполнить запросы к распределенным таблицам.