Статья также доступна на украинском (перейти к просмотру).
Содержание
- Общие подходы к организации CDC
- Основные сведения о Debezium
- Подготовка программной среды сервера Ubuntu
- Запуск контейнеров с компонентами CDC-среды
- Запуск Apache ZooKeeper
- Запуск Apache Kafka
- Развертывание MySQL
- Запуск клиента MySQL
- Запуск Kafka Connect
- Развертывание Debezium для MySQL
- Контроль за работой Kafka Connect
Обеспечение эффективной интеграции распределенных баз данных является нетривиальной задачей, требующей значительных затрат ресурсов, как при разработке системы интеграции, так и при ее эксплуатации. Системы такого типа получили название CDC (Change Data Capture), что буквально переводится как «захват измененных данных» Существует множество подходов к их реализации, одним из которых является инструмент Debezium. Его использование позволяет упростить процесс интеграции и разгрузить веб-приложения, непосредственно работающие с базами данных. Рассмотрим кратко его возможности и продемонстрируем процесс развертывания на сервере Ubuntu.
Общие подходы к организации CDC
Обычно такие системы представляют собой набор программных модулей, реализующих операции регистрации и передачи изменений баз данных, внесенных в исходное хранилище. Существует множество подходов и методов, на основе которых построены и функционируют современные CDC-системы. Такие системы могут одновременно работать на нескольких уровнях, начиная от уровня хранилища и заканчивая уровнями веб-приложения.
Методы «захвата изменений» в базе также могут быть разными. Наиболее распространенные из них предполагают использование значений времени внесения изменений, номера версий, статусы в строчках таблиц базы данных или объединение указанных методов.
Другой распространенный метод для передачи изменений в трансакционных таблицах предполагает использование триггеров, когда все события фиксируются в специальной таблице очередей.
Еще один известный подход – это сканирование журнала логов, в котором обычно фиксируются все транзакции любой базы данных. Однако, его применение на практике в некоторых случаях встречается со сложностями, связанными со спецификой таких журналов для каждой отдельной СУБД.
Но мы хотели бы обратить внимание на некоторое общее для большинства CDC-систем подход, при котором реализация процесса отслеживания и передачи изменений выполняются веб-приложениями, непосредственно работающими с СУБД. В результате они становятся затратными при разработке и перегруженными в работе, что крайне неэффективно. Для этого наилучшим вариантом здесь может стать использование внешнего сервиса, который взял бы на себя дополнительные функции по фиксации и передаче изменений в пределах кластера. Именно таким сервисом и есть инструмент Debezium, о котором мы уже говорили.
Основные сведения о Debezium
Сервис Debezium относится к категории программных средств, которые берут на себя функции коннектора во многие известные базы данных – PostgreSQL, MongoDB, MySQL и другие, гарантируя при этом своевременное оповещение подключенных клиентов о внесенных изменениях в «контролируемую» им СУБД.
Реализация «системы оповещения» етрадиционна, поскольку к этому процессу привлекается один из распространенных брокеров сообщений – Apache Kafka. Для этого соответствующий модуль сервиса Debezium так и называется – Kafka Connect.
Кроме того, необходимым условием работы сервиса является наличие специальной программной среды, включающей, в частности, сервис ZooKeeper, среда Docker Engine и набор коннекторов для каждой из баз данных. Именно на их основе, а также с помощью брокера Apache Kafka реализована своеобразная CDC-система под названием Debezium.
Следует отметить, что в дальнейшем сервис будет обладать веб-интерфейсом для полноценного управления всеми процессами. По сообщению разработчиков, сейчас он находится на стадии тестирования.
Ниже будут рассмотрены все этапы развертывания Debezium на сервере Ubuntu.
Подготовка программной среды сервера Ubuntu
Для возможности установки и отладки совместной работы компонентов CDC-системы необходимо предварительно подготовить сервер, включающий следующие этапы:
- Обновление индекса системных пакетов, а также самих пакетов;
- Развертывание Docker Engine.
Это несложные операции, которые мы уже рассматривали в статье, посвященной системе Docker, и потому не будем здесь на них останавливаться. Там приведены все необходимые действия и пояснения. В частности, это касается вопроса выбора версии Docker, которая должна быть последней, а не взятой из репозитория. Это важно.
Также следует отметить, что установка сервиса возможна и без Docker, о при этом она значительно усложняется.
После завершения выполнения указанных действий следует убедиться в наличии активного статуса Docker Engine на сервере. Для этого введем в терминале:
$ sudo systemctl status docker
Виход команды:
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2024-08-13 14:15:53 UTC; 4min 8s ago TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 4029485 (dockerd) Tasks: 9 Memory: 25.3M CPU: 410ms CGroup: /system.slice/docker.service ??4029485 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Главный процесс запущен (Main PID: 4029485), а значит Docker-система готова к роботе.
Запуск контейнеров с компонентами CDC-среды
Для функционирования CDC-на базе Debezium, кроме базы данных необходимо наличие нескольких активных сервисов, о чем уже говорилось ранее, можно запустить в виде компонентов отдельных контейнеров, развернутых из Docker-шаблонов системы Debezium.
Ниже представлены эти сервисы и БД
- Apache ZooKeeper;
- Apache Kafka;
- БД MySQL;
- Клиент командной строки MySQL;
- Kafka Connect.
Мы будем поочередно развертывать каждый из сервисов, а также базу данных в отдельных окнах терминала, устанавливая для каждого из них интерактивный режим работы. В этом случае стандартный ввод и вывод терминала будет подключаться к контейнеру. Это позволит визуально контролировать прохождение всех операций обновления данных для каждого соединения.
Запуск Apache ZooKeeper
Это известный сервис, выполняющий функции координатора работы распределенных систем. Запустим контейнер с этим приложением из указанного в команде шаблона. Для этого введем в терминале:
$ docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 quay.io/debezium/zookeeper:2.7
Здесь опция -it – устанавливает интерактивный режим работы с контейнером; --rm – программирование автоматического удаления контейнера после завершения работы;--name zookeeper – задает имя контейнера; -p порт1:порт2 – опоставление портов контейнера и хоста, это необходимо, чтобы внешние программы могли взаимодействовать с сервисом; quay.io/debezium/ – местоположение шаблона программы.
Скриншоты процесса развертывания контейнера и его результаты приведены ниже.
Итак, ZooKeeper запущен и сконфигурирован на прослушивание порта 2181. Признаком этого является наличие следующих строчек на выходе:
Status: Downloaded newer image for quay.io/debezium/zookeeper:2.7 Starting up in standalone mode /usr/bin/java ZooKeeper JMX enabled by default Using config: /zookeeper/conf/zoo.cfg 2024-08-13 14:29:47,780 - INFO [main:o.a.z.s.q.QuorumPeerConfig@177] - Reading configuration from: /zookeeper/conf/zoo.cfg 2024-08-13 14:29:47,786 - INFO [main:o.a.z.s.q.QuorumPeerConfig@440] - clientPortAddress is 0.0.0.0:2181 2024-08-13 14:29:47,806 - INFO [main:o.a.z.s.ZooKeeperServerMain@123] - Starting server 2024-08-13 14:29:47,816 - INFO [PurgeTask:o.a.z.s.DatadirCleanupManager$PurgeTask@139] - Purge task started. 2024-08-13 14:29:48,261 - INFO [main:o.a.z.s.NIOServerCnxnFactory@660] - binding to port 0.0.0.0/0.0.0.0:2181
Запуск Apache Kafka
Это высокоскоростной брокер сообщений, обеспечивающий беспрепятственную связь между элементами распределенных систем. Мы уже рассматривали работу этой программы в одной из наших предыдущих статьях, и потому не будем здесь на ней подробно останавливаться.
Откроем новое окно терминала и запустим сервис с помощью следующей команды:
$ docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper quay.io/debezium/kafka:2.7
Здесь опция --link zookeeper:zookeeper – указывает контейнер на местонахождение сервиса ZooKeeper. Назначение всех других параметров рассмотрено ранее.
Ниже приведены скриншоты процесса развертывания контейнера.
Сервис Kafka запущен и готов к работе совместно с ZooKeeper. На это, в частности, указывают следующие строчки информационных сообщений:
2024-08-13 15:56:12,068 - INFO [main:Logging@66] - [SocketServer listenerType=ZK_BROKER, nodeId=1] Enabling request processing. 2024-08-13 15:56:12,075 - INFO [main:Logging@66] - Awaiting socket connections on 172.17.0.3:9092. 2024-08-13 15:56:12,120 - INFO [main:AppInfoParser$AppInfo@124] - Kafka version: 3.7.0 2024-08-13 15:56:12,121 - INFO [main:AppInfoParser$AppInfo@125] - Kafka commitId: 2ae524ed625438c5 2024-08-13 15:56:12,122 - INFO [main:AppInfoParser$AppInfo@126] - Kafka startTimeMs: 1723564572107 2024-08-13 15:56:09,606 - INFO [main:Logging@66] – starting 2024-08-13 15:56:09,607 - INFO [main:Logging@66] - Connecting to zookeeper on 172.17.0.2:2181 2024-08-13 15:56:09,626 - INFO [main:Logging@66] - [ZooKeeperClient Kafka server] Initializing a new session to 172.17.0.2:2181. zookeeper.connect = 172.17.0.2:2181 2024-08-13 15:56:09,703 - INFO [main:Logging@66] - [ZooKeeperClient Kafka server] Connected.
Развертывание MySQL
Нам нужно развернуть сервер базы данных, изменения в которых должно отслеживать программное средство Debezium. Мы имеем в наличии готовую базу MySQL с именем inventory со своим набором таблиц. Именно ее мы будем использовать в пример.
Создадим новое окно терминала и введем в командной строчке следующую команду:
$ docker run -it --rm --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=debezium -e MYSQL_USER=mysqluser -e MYSQL_PASSWORD=mysqlpw quay.io/debezium/example-mysql:2.7
Опция -e используется для создания пользователя и пароля для него. Все остальные параметры известны.
Итак, сервер базы данных запущен и готов к работе. Признаком этого есть следующие сроки информационных сообщений:
2024-08-13T16:24:08.719257Z 0 [System] [MY-015015] [Server] MySQL Server - start. 2024-08-13T16:24:09.017860Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.2.0) starting as process 1 2024-08-13T16:24:09.057668Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2024-08-13T16:24:11.022457Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock 2024-08-13T16:24:11.022532Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.2.0' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
Запуск клиента MySQL
Развернем новый контейнер из шаблона mysql:8.2 ля активации в нем клиента командной строки MySQL. Это позволит получить доступ к экземпляру нашей базы с именем inventory.
Для этого создадим новое окно терминала, где введем следующую команду:
$ docker run -it --rm --name mysqlterm --link mysql mysql:8.2 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
Здесь опция --name mysqlterm указывает на имя контейнера; опция --link mysql указывает на имя контейнера, с которым устанавливается связь.
Процесс развертывания контейнера приведен ниже.
В результате приглашение командной строчки изменилось на следующее:
mysql>
Это означает, что клиент MySQL готов к работе. Также выведена информация об установленном соединении:
Your MySQL connection id is 8 Server version: 8.2.0 MySQL Community Server - GPL
Активируем нашу базу данных:
mysql> use inventory;
Просмотрим список имеющихся в ней таблиц:
mysql> show tables;
Просмотрим данные одной из таблиц:
mysql> SELECT * FROM products;
Таким образом мы выяснили, что клиент работает и убедились в существовании заполненной базы данных
Запуск Kafka Connect
После того как мы развернули контейнер с сервером MySQL да подключились в нашу базу с помощью клиента командной строчки, мы можем запустить сервис Kafka Connect. Сервис предоставляет REST API интерфейс для управления коннектором Debezium для БД MySQL.
Запустим контейнер с компонентом Kafka Connect. Для этого откроем новое окно терминала и введем в нем следующую команду:
$ docker run -it --rm --name Connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets -e STATUS_STORAGE_TOPIC=my_connect_statuses --link kafka:kafka --link mysql:mysql quay .io/debezium/connect:2.7
Здесь опция -e используется для установки переменных программной среды, необходимых для использования шаблона Debezium; Опцbb --link kafka:kafka --link mysql:mysql необходимы для установления связи контейнера с другими контейнерами, на которых запущен сервер MySQL b брокер сообщений Kafka.
Процесс развертывания контейнера приведен ниже.
Таким образом, нами был успешно запущен сервис Kafka Connect, готовый принимать подключение. Признаком этого являются, в частности, следующие строчки информационных сообщений, в которых выводится информация об установленном соединении и созданном рабочем кластере:
2024-08-13 17:01:24,807 INFO || [Worker clientId=connect-172.17.0.6:8083, groupId=1] Herder started [org.apache.kafka.connect.runtime.distributed.DistributedHerder] 2024-08-13 17:01:24,854 INFO || [Worker clientId=connect-172.17.0.6:8083, groupId=1] Cluster ID: RpSwNrtZTyG2HU1BHRARVA [org.apache.kafka.clients.Metadata] 2024-08-13 17:01:30,747 INFO || [Worker clientId=connect-172.17.0.6:8083, groupId=1] Starting connectors and tasks using config offset -1 [org.apache.kafka.connect.runtime.distributed.DistributedHerder] 2024-08-13 17:01:30,748 INFO || [Worker clientId=connect-172.17.0.6:8083, groupId=1] Finished starting connectors and tasks [org.apache.kafka.connect.runtime.distributed.DistributedHerder]
Теперь проверим связь с сервисом Тепер перевіримо зв’язок із сервісом Kafka Connect путем отправления API-запросов на порт 8083 хост-системы Docker. Для этого создадим новое окно терминала, в котором введем следующую команду:
$ curl -H "Accept:application/json" localhost:8083/
Ответ
"version":"3.7.0","commit":"2ae524ed625438c5","kafka_cluster_id":"RpSwNrtZTyG2HU1BHRARVA"}
Теперь проверим список зарегистрированных в Kafka Connect соединений
$ curl -H "Accept:application/json" localhost:8083/connectors/
Ответ: [] No connectors are currently registered with Kafka Connect. Это значит, что ни одно соединение не зарегистрировано.
Развертывание Debezium для MySQL
После того как сервер БД MySQL т и клиент командной строчки запущен и установлен подключение к экземпляру созданной нами базы данных с именем inventory, можно переходить к развертыванию Debezium. Это позволит мониторить созданный нами экземпляр БД MySQL.
Зарегистрируем Debezium-коннектор с текущей конфигурацией, после чего он начнет отслеживать binlog сервера БД MySQL, в котором, как правило, фиксируются все происходящие транзакции. При любом изменении в строках таблиц БД будет генерироваться ответное сообщение.
Для этого создадим новое окно терминала, где введем следующую команду:
$ curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '{ "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "tasks.max": "1", "database.hostname": "mysql", "database.port": "3306", "database.user": "debezium", "database.password": "dbz", "database.server.id": "184054", "topic.prefix": "dbserver1", "database.include.list": "inventory", "schema.history.internal.kafka.bootstrap.servers": "kafka:9092", "schema.history.internal.kafka.topic": "schemahistory.inventory" } }'
Выход команды:
HTTP/1.1 201 Created Date: Tue, 13 Aug 2024 17:37:20 GMT Location: http://localhost:8083/connectors/inventory-connector Content-Type: application/json Content-Length: 500 Server: Jetty(9.4.53.v20231009) {"name":"inventory-connector","config":{"connector.class":"io.debezium.connector.mysql.MySqlConnector", "tasks.max":"1","database.hostname":"mysql","database.port":"3306", "database.user":"debezium","database.password":"dbz","database.server.id":"184054", "topic.prefix":"dbserver1","database.include.list":"inventory","schema.history.internal.kafka.bootstrap.servers" :"kafka:9092","schema.history.internal.kafka.topic":"schemahistory.inventory","name": "inventory-connector"},"tasks":[],"type":"source"}
В приведенных записях содержится вся информация о текущей конфигурации коннектора Debezium.
Убедимся в том, что inventory-connector есть в списке коннекторов. Для этого введем следующую команду:
$ curl -H "Accept:application/json" localhost:8083/connectors/
Ответ: ["inventory-connector"]. То есть, в списке появился новый коннектор, как и предполагалось.
Просмотрим список его задач:
$ curl -i -X GET -H "Accept:application/json" localhost:8083/connectors/inventory-connector
Ответ:
HTTP/1.1 200 OK Date: Tue, 13 Aug 2024 17:47:43 GMT Content-Type: application/json Content-Length: 544 Server: Jetty(9.4.53.v20231009) {"name":"inventory-connector","config": {"connector.class":"io.debezium.connector.mysql.MySqlConnector", "database.user":"debezium","topic.prefix":"dbserver1","schema.history.internal.kafka.topic": "schemahistory.inventory","database.server.id":"184054","tasks.max":"1", "database.hostname":"mysql","database.password":"dbz","name":"inventory- connector","schema.history.internal.kafka.bootstrap.servers":"kafka:9092", "database.port":"3306","database.include.list":"inventory"},"tasks": [{"connector":"inventory-connector","task":0}],"type":"source"}
Можно убедиться, что в настоящее время выполняется только одна задача ("task":0), поскольку MySQL фиксирует все свои действия только в одном журнале. И поэтому коннектору нужен только один потребитель информации для получения упорядоченной информации обо всех происходящих событиях.
Контроль за работой Kafka Connect
Сразу после регистрации коннектора генерируется значительный объем информации в журнале контейнера с сервисом Kafka Connect, в котором фиксируются все его действия.
Ниже приведены скриншоты из сгенерированными Kafka Connect информационными сообщениями.
Просматривая выведенные информационные сообщения, можно проследить за поведением Kafka Connect, начиная с момента его создания и заканчивая началом отслеживания файла binlog сервера MySQL.
Дата-центр FREEhost.UA предлагает облачный хостинг VPS с Docker и удобным интерфейсом управления Docker Portainer. Уже через несколько минут после оплаты заказа, полностью настроенный сервер готов к работе.
Подписывайтесь на наш телеграмм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем ошиблись, или что-то пропустили?
Напишите об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.
Дата: 21.08.2024 Автор: Александр Ровник
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus