Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
Вы можете отслеживать изменения данных в кластере-источнике Managed Service for PostgreSQL и отправлять их в кластер-приемник Managed Service for Apache Kafka® с помощью технологии Change Data Capture (CDC).
Чтобы настроить CDC с использованием сервиса Data Transfer:
- Подготовьте инфраструктуру.
- Подготовьте кластер-источник.
- Подготовьте кластер-приемник.
- Подготовьте и активируйте трансфер.
- Проверьте работоспособность трансфера.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
- Кластер Managed Service for PostgreSQL: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий (тарифы Managed Service for PostgreSQL).
- Кластер Managed Service for Apache Kafka®: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий (тарифы Managed Service for Apache Kafka®).
- Публичные IP-адреса, если для хостов кластеров включен публичный доступ (тарифы Yandex Virtual Private Cloud).
- Каждый трансфер: использование вычислительных ресурсов и количество переданных строк данных (тарифы Data Transfer).
Подготовьте инфраструктуру
Примечание
Публичный доступ к хостам кластера нужен, если вы планируете подключаться к кластеру через интернет. Этот вариант подключения более простой, и его рекомендуется использовать для прохождения руководства. К хостам без публичного доступа тоже можно подключиться, но только с виртуальных машин Yandex Cloud, расположенных в той же облачной сети, что и кластер.
-
Создайте кластер-источник Managed Service for PostgreSQL любой подходящей конфигурации со следующими настройками:
-
с базой данных
db1; -
с пользователем
pg-user; -
с хостами в публичном доступе.
-
-
Создайте кластер-приемник Managed Service for Apache Kafka® любой подходящей конфигурации с хостами в публичном доступе.
-
Если вы используете группы безопасности, настройте их так, чтобы к кластерам можно было подключаться из интернета:
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации cdc-mpg-mkf.tf
.В этом файле описаны:
- сеть;
- подсеть в зоне доступности
ru-central1-a; - группа безопасности для кластера Managed Service for PostgreSQL и правила, необходимые для подключения к кластеру из интернета;
- группа безопасности для кластера Managed Service for Apache Kafka® и правила, необходимые для подключения к кластеру из интернета;
- кластер Managed Service for PostgreSQL с публичным доступом из интернета;
- база данных и пользователь с ролью mdb_replication в кластере Managed Service for PostgreSQL;
- кластер Managed Service for Apache Kafka® с публичным доступом из интернета;
- топик и пользователь с ролями ACCESS_ROLE_CONSUMER и ACCESS_ROLE_PRODUCER на этот топик в кластере Managed Service for Apache Kafka®;
- эндпоинты для источника и приемника;
- трансфер.
-
Укажите в конфигурационном файле следующие параметры:
network_name— имя сети.subnet_name— имя подсети.pg_sg_name— имя группы безопасности для кластера Managed Service for PostgreSQL.kf_sg_name— имя группы безопасности для кластера Managed Service for Apache Kafka®.pg_cluster_version— версия кластера Managed Service for PostgreSQL.pg_cluster_name— имя кластера Managed Service for PostgreSQL.pg_password— пароль пользователя в кластере Managed Service for PostgreSQL.kf_cluster_version— версия кластера Managed Service for Apache Kafka®.kf_cluster_name— имя кластера Managed Service for Apache Kafka®.kf_password— пароль пользователя в кластере Managed Service for Apache Kafka®.source_endpoint_name— имя эндпоинта для источника.target_endpoint_name— имя эндпоинта для приемника.transfer_name— имя трансфера.transfer_enabled = 0— отключает создание эндпоинтов и трансфера. Они будут созданы при подготовке трансфера.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Подготовьте кластер-источник
-
Если вы создавали инфраструктуру вручную, назначьте роль mdb_replication пользователю
pg-user. Это необходимо, чтобы пользователь мог создать публикацию, через которую Data Transfer получает информацию об изменениях в данных в кластере-источнике. -
Подключитесь к базе данных
db1от имени пользователяpg-user. -
Наполните базу тестовыми данными. В качестве примера используется простая таблица, содержащая информацию с некоторых датчиков автомобиля.
Создайте таблицу:
CREATE TABLE public.measurements ( "device_id" text PRIMARY KEY NOT NULL, "datetime" timestamp NOT NULL, "latitude" real NOT NULL, "longitude" real NOT NULL, "altitude" real NOT NULL, "speed" real NOT NULL, "battery_voltage" real, "cabin_temperature" real NOT NULL, "fuel_level" real );Наполните таблицу данными:
INSERT INTO public.measurements VALUES ('iv9a94th6rzt********', '2020-06-05 17:27:00', 55.70329032, 37.65472196, 427.5, 0, 23.5, 17, NULL), ('rhibbh3y08qm********', '2020-06-06 09:49:54', 55.71294467, 37.66542005, 429.13, 55.5, NULL, 18, 32), ('iv9a94th678t********', '2020-06-07 15:00:10', 55.70985913, 37.62141918, 417.0, 15.7, 10.3, 17, NULL);
Подготовьте кластер-приемник
Если вы создавали инфраструктуру с помощью Terraform, пропустите этот шаг и перейдите к подготовке и активации трансфера.
Настройка кластера-приемника различается в зависимости от используемого способа управления топиками. При этом имена топиков для данных конструируются по тому же принципу, что и в Debezium<префикс_топика>.<имя_схемы>.<имя_таблицы>. В этом руководстве в качестве примера будет использоваться префикс cdc.
Если для управления топиками используются интерфейсы Yandex Cloud (консоль управления, CLI, API):
-
Создайте топик с именем
cdc.public.measurements.Если необходимо отслеживать изменения в нескольких таблицах, создайте для каждой из них отдельный топик.
-
Создайте пользователя с именем
kafka-userи ролямиACCESS_ROLE_CONSUMERиACCESS_ROLE_PRODUCER, действующими на созданный топик.
Если для управления топиками используется Kafka Admin API:
-
Создайте пользователя-администратора с именем
kafka-user. -
Помимо роли
ACCESS_ROLE_ADMINназначьте пользователю-администратору ролиACCESS_ROLE_CONSUMERиACCESS_ROLE_PRODUCERна топики, имена которых начинаются с префиксаcdc.Необходимые топики будут созданы автоматически при первом событии изменения в отслеживаемых таблицах кластера-источника. Такое решение может быть удобным для отслеживания изменений во множестве таблиц, однако, требует запас свободного места в хранилище кластера. Подробнее в разделе Хранилище в Managed Service for Apache Kafka®.
Подготовьте и активируйте трансфер
-
-
Эндпоинт для источника:
- Тип базы данных —
PostgreSQL. - Параметры эндпоинта:
- Настройки подключения —
Кластер Managed Service for PostgreSQL. - Кластер Managed Service for PostgreSQL — выберите созданный ранее кластер Managed Service for PostgreSQL.
- База данных —
db1. - Пользователь —
pg-user. - Пароль — укажите пароль пользователя
pg-user. - Список включённых таблиц —
public.measurements.
- Настройки подключения —
- Тип базы данных —
-
Эндпоинт для приемника:
-
Тип базы данных —
Kafka. -
Параметры эндпоинта:
-
Тип подключения —
Кластер Managed Service for Apache Kafka.- Кластер Managed Service for Apache Kafka — выберите кластер-приемник.
- Аутентификация — укажите данные созданного ранее пользователя
kafka-user.
-
Топик —
Полное имя топика. -
Полное имя топика —
cdc.public.measurements.
Если необходимо отслеживать изменения в нескольких таблицах, заполните поля следующим образом:
- Топик —
Префикс топика. - Префикс топика — укажите префикс
cdc, использованный при формировании имен топиков.
-
-
-
-
Создайте трансфер со следующими настройками:
- Эндпоинты:
- Источник — созданный ранее эндпоинт для источника.
- Приёмник — созданный ранее эндпоинт для приемника.
- Тип трансфера — Репликация.
- Эндпоинты:
-
Активируйте трансфер и дождитесь его перехода в статус Реплицируется.
-
Укажите в файле
cdc-mpg-mkf.tfзначение параметраtransfer_enabled = 1. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Будут созданы эндпоинты и трансфер. Трансфер активируется автоматически после создания.
-
-
Дождитесь перехода трансфера в статус Реплицируется.
Проверить состояние трансфера можно в консоли управления
.
Проверьте работоспособность трансфера
-
Установите на локальный компьютер утилиту
kcat(kafkacat) и клиент командной строки PostgreSQL . Например, в Ubuntu 20.04 выполните команду:sudo apt update && sudo apt install kafkacat postgresql-client --yesУбедитесь, что можете с ее помощью подключиться к кластеру-источнику Managed Service for Apache Kafka® через SSL.
-
В отдельном терминале запустите утилиту
kafkacatв режиме потребителя:kafkacat \ -C \ -b <FQDN_хоста-брокера_1>:9091,...,<FQDN_хоста-брокера_N>:9091 \ -t cdc.public.measurements \ -X security.protocol=SASL_SSL \ -X sasl.mechanisms=SCRAM-SHA-512 \ -X sasl.username=kafka-user \ -X sasl.password=<пароль> \ -X ssl.ca.location=/usr/local/share/ca-certificates/Yandex/YandexInternalRootCA.crt \ -Z \ -K:FQDN хостов-брокеров можно получить со списком хостов в кластере Managed Service for Apache Kafka®.
Будет выведена схема формата данных таблицы
public.measurementsи данные о добавленных в нее ранее строках.Пример фрагмента сообщения
{ "payload": { "consumer":"dttuhfpp97l3********" }, "schema": { "fields": [ { "field": "consumer", "optional":false, "type":"string" } ], "name": "__data_transfer_stub.public.__consumer_keeper.Key", "optional":false, "type":"struct" } }:{ "payload": { "after": { "consumer":"dttuhfpp97l3********l", "locked_by":"dttuhfpp97l3********-1", "locked_till":"2022-05-15T09:55:18Z" }, "before": null, "op":"u", "source": { "connector":"postgresql", "db":"db1", "lsn":85865797008, "name":"__data_transfer_stub", "schema":"public", "snapshot":"false", "table":"__consumer_keeper", "ts_ms":1652608518883, "txId":245165, "version":"1.1.2.Final", "xmin":null }, ... -
Подключитесь к кластеру-источнику и добавьте данные в таблицу
measurements:INSERT INTO public.measurements VALUES ('iv7b74th678t********', '2020-06-08 17:45:00', 53.70987913, 36.62549834, 378.0, 20.5, 5.3, 20, NULL); -
Убедитесь, что в терминале с запущенной утилитой
kafkacatотобразились сведения о добавленной строке.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
Деактивируйте и удалите трансфер.
-
Удалите кластеры:
-
Если для доступа к хостам кластеров использовались статические публичные IP-адреса, освободите и удалите их.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy -
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
Дополнительные материалы
Больше информации о сценариях поставок данных в вебинаре Yandex Cloud: