Выполнение аналитических запросов в Yandex Managed Service for PostgreSQL с обработкой в Yandex Managed Service for ClickHouse® при помощи pg_clickhouse и Yandex Data Transfer
- Перед началом работы
- Подготовьте инфраструктуру
- Подготовьте тестовые данные
- Подготовьте и активируйте трансфер
- Проверьте работу трансфера
- Настройте подключение к Managed Service for ClickHouse® и создайте внешние таблицы
- Выполните аналитические запросы к внешним таблицам в Managed Service for PostgreSQL
- Удалите созданные ресурсы
Вы можете выполнять аналитические запросы к данным из Yandex Managed Service for PostgreSQL, используя для обработки запросов вычислительные ресурсы Yandex Managed Service for ClickHouse®. Для этого в Managed Service for ClickHouse® с помощью Yandex Data Transfer создается копия данных из Managed Service for PostgreSQL, которая затем поддерживается в актуальном состоянии. В базу данных Managed Service for PostgreSQL добавляется расширение pg_clickhouse. С его помощью в Managed Service for PostgreSQL создаются внешние таблицы, которые ссылаются на таблицы в Managed Service for ClickHouse®. Работать с внешними таблицами можно так же, как с обычными таблицами. Аналитические запросы к внешним таблицам выполняются в Managed Service for PostgreSQL и обрабатываются на стороне Managed Service for ClickHouse®, после чего в Managed Service for PostgreSQL возвращается результат этих запросов.
Расширение pg_clickhouse доступно в кластерах Managed Service for PostgreSQL версии 17 и выше.
Чтобы выполнить аналитические запросы:
- Подготовьте инфраструктуру.
- Подготовьте тестовые данные.
- Подготовьте и активируйте трансфер.
- Проверьте работу трансфера.
- Настройте подключение к Managed Service for ClickHouse® и создайте внешние таблицы.
- Выполните аналитические запросы к внешним таблицам в Managed Service for PostgreSQL.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
- Кластер Managed Service for PostgreSQL: использование выделенных хостам вычислительных ресурсов, объем хранилища и резервных копий (тарифы Managed Service for PostgreSQL).
- Кластер Managed Service for ClickHouse®: использование выделенных хостам вычислительных ресурсов, объем хранилища и резервных копий (тарифы Managed Service for ClickHouse®).
- Публичные IP-адреса, если для хостов кластеров включен публичный доступ (тарифы Yandex Virtual Private Cloud).
- Каждый трансфер: использование вычислительных ресурсов и количество переданных строк данных (тарифы Data Transfer).
Подготовьте инфраструктуру
Примечание
Публичный доступ к хостам кластера нужен, если вы планируете подключаться к кластеру через интернет. Этот вариант подключения более простой, и его рекомендуется использовать для прохождения руководства. К хостам без публичного доступа тоже можно подключиться, но только с виртуальных машин Yandex Cloud, расположенных в той же облачной сети, что и кластер.
-
Создайте облачную сеть с именем
demo-network.При создании сети автоматически создаются три подсети в разных зонах доступности.
-
В сети
demo-networkсоздайте группу безопасностиmch-sgдля кластера Managed Service for ClickHouse® и добавьте в группу правила, необходимые для подключения к кластеру через интернет:-
Правило для входящего трафика, которое разрешает подключение на порт
8443:- Диапазон портов —
8443. - Протокол —
TCP. - Назначение —
Диапазон адресов. - IPv4 CIDR —
0.0.0.0/0.
- Диапазон портов —
-
Правило для входящего трафика, которое разрешает подключение на порт
9440:- Диапазон портов —
9440. - Протокол —
TCP. - Назначение —
Диапазон адресов. - IPv4 CIDR —
0.0.0.0/0.
- Диапазон портов —
-
-
В сети
demo-networkсоздайте группу безопасностиmpg-sgдля кластера Managed Service for PostgreSQL и добавьте в группу следующие правила:-
Правило для входящего трафика, которое разрешает подключение к кластеру через интернет:
- Диапазон портов —
6432. - Протокол —
TCP. - Назначение —
Диапазон адресов. - IPv4 CIDR —
0.0.0.0/0.
- Диапазон портов —
-
Правило для исходящего трафика, которое разрешает подключение к Managed Service for ClickHouse®:
- Диапазон портов —
9440. - Протокол —
TCP. - Назначение —
Диапазон адресов. - IPv4 CIDR —
0.0.0.0/0.
- Диапазон портов —
-
-
Создайте кластер Managed Service for ClickHouse® любой подходящей конфигурации со следующими настройками:
-
Сеть —
demo-network. -
Группа безопасности —
mch-sg. -
Публичный доступ к хостам включен.
-
База данных —
chdb. -
Пользователь —
chuser.
-
-
Создайте кластер Managed Service for PostgreSQL любой подходящей конфигурации со следующими настройками:
-
Версия —
17или выше. -
Сеть —
demo-network. -
Группа безопасности —
mpg-sg. -
Публичный доступ к хостам включен.
-
База данных —
pgdb. -
Пользователь —
pguser.
-
-
В кластере Managed Service for PostgreSQL добавьте расширение
pg_clickhouseв базу данныхpgdb. -
В кластере Managed Service for PostgreSQL назначьте пользователю
pguserследующие роли:- mdb_replication — для репликации данных с помощью Data Transfer.
- mdb_admin — для подключения к Managed Service for ClickHouse® через
pg_clickhouse.
Подготовьте тестовые данные
-
Создайте таблицы
customersиorders:CREATE TABLE public.customers ( id INT PRIMARY KEY, name TEXT NOT NULL, city TEXT ); CREATE TABLE public.orders ( id INT PRIMARY KEY, customer_id INT NOT NULL, amount NUMERIC(10, 2) NOT NULL, order_date DATE NOT NULL, status TEXT NOT NULL ); -
Заполните таблицы данными:
INSERT INTO public.customers (id, name, city) VALUES (1, 'Анна', 'Волгоград'), (2, 'Иван', 'Новосибирск'), (3, 'Виктория', 'Воронеж'), (4, 'Борис', 'Краснодар'), (5, 'Мария', 'Нижний Новгород'); INSERT INTO public.orders (id, customer_id, amount, order_date, status) VALUES (1, 1, 1500.00, '2024-03-01', 'new'), (2, 2, 2300.50, '2024-03-02', 'new'), (3, 1, 999.99, '2024-03-03', 'completed'), (4, 3, 4500.00, '2024-03-04', 'shipped'), (5, 4, 1200.75, '2024-03-05', 'new'), (6, 5, 3100.25, '2024-03-06', 'shipped'), (7, 2, 1750.00, '2024-03-07', 'completed'), (8, 3, 800.00, '2024-03-08', 'new'), (9, 4, 5500.99, '2024-03-09', 'shipped'), (10, 5, 2200.00, '2024-03-10', 'completed');
Подготовьте и активируйте трансфер
-
Создайте эндпоинт для источника со следующими настройками:
- Тип базы данных —
PostgreSQL. - Тип подключения —
Ручная настройка. - Тип инсталляции —
Кластер Managed Service for PostgreSQL. - Кластер управляемой БД — имя созданного ранее кластера Managed Service for PostgreSQL.
- База данных —
pgdb. - Пользователь —
pguser. - Пароль — пароль пользователя
pguser.
- Тип базы данных —
-
Создайте эндпоинт для приемника со следующими настройками:
- Тип базы данных —
ClickHouse. - Тип подключения —
Ручная настройка. - Тип инсталляции —
Кластер Managed Service for ClickHouse. - Managed кластер — имя созданного ранее кластера Managed Service for ClickHouse®.
- База данных —
chdb. - Пользователь —
chuser. - Пароль — пароль пользователя
chuser.
- Тип базы данных —
-
Создайте трансфер, использующий созданные эндпоинты. В качестве типа трансфера выберите Копирование и репликация.
-
Дождитесь, пока трансфер перейдет в статус Реплицируется.
Проверьте работу трансфера
-
Проверьте, что в базе данных
chdbсозданы таблицыcustomersиorders:SHOW TABLES FROM chdb; -
Проверьте, что данные загружены в таблицы:
SELECT * FROM customers; SELECT * FROM orders; -
В кластере Managed Service for PostgreSQL добавьте запись в таблицу
orders:INSERT INTO public.orders (id, customer_id, amount, order_date, status) VALUES (11, 1, 520.00, '2024-03-17', 'new'); -
Выполните запрос в кластере Managed Service for ClickHouse®, чтобы проверить, что новая запись появилась в таблице
orders:SELECT * FROM orders;
Настройте подключение к Managed Service for ClickHouse® и создайте внешние таблицы
-
Создайте внешний источник данных:
CREATE SERVER chserver FOREIGN DATA WRAPPER clickhouse_fdw OPTIONS ( driver 'binary', host 'c-<идентификатор_кластера_Managed_Service_for_Clickhouse>.rw.mdb.yandexcloud.net', port '9440', dbname 'chdb' );Идентификатор кластера можно получить со списком кластеров в каталоге.
-
Создайте сопоставление локального пользователя с пользователем на внешнем источнике:
CREATE USER MAPPING FOR CURRENT_USER SERVER chserver OPTIONS ( user 'chuser', password '<пароль>' ); -
Создайте схему:
CREATE SCHEMA mch; -
Создайте в схеме
mchвнешние таблицы, которые будут ссылаться на таблицы в базе данныхchdbв Managed Service for ClickHouse®:IMPORT FOREIGN SCHEMA chdb FROM SERVER chserver INTO mch; -
Проверьте, что внешние таблицы созданы:
SELECT * FROM information_schema.foreign_tables WHERE foreign_table_schema = 'mch';В выводе должны быть таблицы
customersиorders.
Выполните аналитические запросы к внешним таблицам в Managed Service for PostgreSQL
-
Получите для каждого города количество заказов и их общую сумму:
SELECT c.city, COUNT(*) AS orders_count, SUM(o.amount) AS total_amount FROM mch.orders o JOIN mch.customers c ON o.customer_id = c.id GROUP BY c.city ORDER BY total_amount DESC; -
Постройте план выполнения запроса, чтобы убедиться, что он обрабатывается в Managed Service for ClickHouse®:
EXPLAIN (VERBOSE, COSTS OFF) SELECT c.city, COUNT(*) AS orders_count, SUM(o.amount) AS total_amount FROM mch.orders o JOIN mch.customers c ON o.customer_id = c.id GROUP BY c.city ORDER BY total_amount DESC;Если в плане выполнения есть строки
Foreign ScanиRemote SQL, то запрос обрабатывается в Managed Service for ClickHouse®.Пример плана выполнения:
QUERY PLAN ---------- Foreign Scan Output: c.city, (count(*)), (sum(o.amount)) Relations: Aggregate on ((orders o) INNER JOIN (customers c)) Remote SQL: SELECT r2.city, count(*), sum(r1.amount) FROM chdb.orders r1 ALL INNER JOIN chdb.customers r2 ON (((r1.customer_id = r2.id))) GROUP BY r2.city ORDER BY sum(r1.amount) DESC NULLS FIRST Query Identifier: -6142969501942783
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Деактивируйте и удалите трансфер.
- Удалите эндпоинты для источника и приемника.
- Удалите кластер Managed Service for ClickHouse®.
- Удалите кластер Managed Service for PostgreSQL.
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc