Узнайте, как интегрировать CockroachDB с Redpanda для CDC в реальном времени.
Это сообщение изначально было опубликовано в блоге Redpanda.
В эпоху облачных вычислений приложения постепенно трансформировались в более распределенную и менее связанную архитектуру. Монолитные архитектуры превратились в микросервисы, а микросервисы — во все более мелкие сервисы или функции.
Помимо всех преимуществ распределенной архитектуры — как разделение ответственности — у этого подхода могут быть недостатки, одним из которых являются сами данные.
Данные становятся настоящей проблемой, когда вы хотите поделиться ими в распределенной системе. Для монолитных приложений раньше у вас была одна база данных в виде кластера с реплицированными узлами, но все изменилось.
Распределенные приложения, такие как микросервисы, нуждаются в своих выделенных базах данных или любом другом промежуточном программном обеспечении в качестве хранилища данных, например, в выделенной системе кэширования, такой как Redis, или в поисковой системе, такой как Elasticsearch.
Из-за распределенной архитектуры вам необходимо хранить одни и те же данные в разных базах данных или системах промежуточного программного обеспечения, и вы должны поддерживать согласованность этих данных. В большинстве случаев разработчики пытаются сделать это, выполняя двойную запись.
Двойная запись происходит, когда приложение изменяет одни и те же данные в двух разных системах без какого-либо уровня согласованности данных, например транзакций или распределенных транзакций. Не каждая система поддерживает распределенные транзакции, поэтому в таких случаях вы не можете гарантировать согласованность данных.
Однако сбор данных об изменениях (CDC), шаблон интеграции данных, позволяет фиксировать изменения на уровне строк в настраиваемый приемник для последующей обработки, такой как создание отчетов, кэширование, полнотекстовое индексирование, или, что наиболее важно, помогает избежать двойной записи и гарантирует, что данные долговечность и консистенция.
CockroachDB, распределенная и надежная база данных, поддерживает CDC через свои Changefeeds. CockroachDB предоставляет каналы изменений для приемников данных, таких как AWS S3, веб-хуки или системы потоковой передачи данных, совместимой с Apache KafkaⓇ API, такой как Redpanda.
Redpanda предоставляет быструю и отказоустойчивую, безопасную по умолчанию систему, полностью совместимую с Kafka API. Вы можете использовать CDC CockroachDB для захвата изменений и потоковой передачи в Redpanda, чтобы более эффективно реализовать любой жизненно важный вариант использования CDC, такой как создание отчетов, предотвращение двойной записи или, что наиболее важно, сохранение согласованности данных через сегменты CockroachDB: потому что CockroachDB имеет распределенной архитектуре, поддержание согласованности транзакционных заданий через ее сегменты имеет решающее значение. CDC с Changefeeds обеспечивает отправку изменений в приемники, такие как Kafka или Redpanda, в качестве решения для этого.
Механизм CDC в CockroachDB предоставляет не только механизм сбора данных, но и точку интеграции с Redpanda, которая может передавать захваченные события изменений в другие точки данных, такие как хранилища данных, базы данных OLAP или поисковые системы.
В этой статье вы узнаете, как транслировать CDC из CockroachDB в Redpanda, выполнив руководство, включающее следующие шаги:
- Запустите кластер Redpanda в контейнерном виде с помощью Docker.
- Создайте тему в Redpanda, используя ее
rpk
CLI. - Установите CockroachDB и используйте его SQL-клиент.
- Создайте таблицу на CockroachDB и настройте ее для использования CDC.
- Создавайте, обновляйте и удаляйте записи в таблице CockroachDB.
- Используйте события изменений из соответствующей темы Redpanda, используя
rpk
CLI.
Если вы хотите продолжить работу в своем собственном редакторе, вы можете получить доступ ко всем ресурсам для этого руководства в этом репозитории.
Предпосылки
Для выполнения этого урока вам потребуется следующее:
- Среда macOS с установленным менеджером пакетов Homebrew.
- На вашем компьютере установлена последняя версия Докера. (На момент написания этой статьи использовался Docker Desktop 4.6.1.)
- 30-дневная пробная лицензия для CockroachDB, необходимая для использования возможностей CDC.
Вариант использования: изменение сбора данных с помощью CockroachDB и Redpanda
Предположим, что вы подрядчик, который собирается подписать пятилетний контракт с потенциальным клиентом, PandaBank. Прежде чем заключить сделку, они хотели бы, чтобы вы выполнили небольшую задачу в качестве задания, чтобы увидеть, подходите ли вы для этой работы.
PandaBank использует CockroachDB для внутренних целей, и большая часть ежедневных транзакций по счетам хранится в этой базе данных. В настоящее время у них есть механизм индексации изменений транзакций учетной записи в Elasticsearch, но они заметили, что он создает несоответствия данных между фактическими данными и проиндексированными данными журнала, которые есть в Elasticsearch.
Они хотят, чтобы вы создали базовый механизм, чтобы избежать любых проблем с несогласованностью данных между системами. Они требуют, чтобы вы создали базовую реализацию CDC, используя механизм подачи изменений CockroachDB и Redpanda для надежной системы обмена сообщениями, совместимой с Kafka API.
Для их назначения не нужно реализовывать часть Elasticsearch, достаточно части CDC. Вы несете ответственность за создание экземпляра CockroachDB и экземпляра Redpanda на своем локальном компьютере. Поскольку PandaBank запускает Redpanda на Docker, вам также необходимо это сделать.
На следующем изображении показана архитектурная схема системы, которую они требуют от вас реализовать:
Бегущая Редпанда
В этом руководстве вы запустите Redpanda в контейнере через Docker.
Примечание. Дополнительные сведения об установке Redpanda на других платформах см. в этой документации.
Убедитесь, что вы установили Docker и запустили демон Docker в среде macOS. Затем откройте окно терминала и выполните следующую команду для запуска Redpanda:
docker run -d --pull=always --name=redpanda-1 --rm \
-p 9092:9092 \
-p 9644:9644 \
docker.vectorized.io/vectorized/redpanda:latest \
redpanda start \
--overprovisioned \
--smp 1 \
--memory 1G \
--reserve-memory 0M \
--node-id 0 \
--check=false
Redpanda будет доступна через localhost:9092
на вашем компьютере.
Установка и запуск CockroachDB
Чтобы установить CockroachDB в локальной среде macOS, выполните следующую команду:
Примечание. Убедитесь, что вы уже установили диспетчер пакетов Homebrew, как указано в предварительных требованиях.
brew install cockroachdb/tap/cockroach
После установки CockroachDB запустите кластер с одним узлом в небезопасном режиме:
Примечание. Информацию о запуске кластера CockroachDB в безопасном режиме можно найти в этой документации.
cockroach start-single-node --insecure
В другом терминале выполните следующую команду, чтобы получить доступ к клиентскому интерфейсу CockroachDB SQL:
cockroach sql --insecure
В клиентском интерфейсе выполните следующие команды, чтобы включить корпоративное использование, поскольку CDC является корпоративным каналом изменений. Обратитесь к разделу предварительных требований, если вы еще не подписались на пробную лицензию.
SET CLUSTER SETTING cluster.organization = '_YOUR_ORGANIZATION_';
SET CLUSTER SETTING enterprise.license = '_YOUR_LICENSE_';
Создание и настройка таблицы CockroachDB
В окне терминала, где открыт клиент SQL-запросов, выполните следующую команду, чтобы создать базу данных с именем bank в CockroachDB:
root@:26257/defaultdb> CREATE DATABASE bank;
В окне запроса выберите базу данных банка, которая будет использоваться для остальных действий:
root@:26257/defaultdb> USE bank;
Создайте таблицу под названием account с целочисленными полями с именами id и balance:
root@:26257/bank> CREATE TABLE accounts (id INT PRIMARY KEY, balance INT);
Создайте канал изменений для учетных записей таблицы. Установите адрес брокера Redpanda для фида изменений, чтобы настроить его для отправки захваченных данных об изменениях:
root@:26257/bank> CREATE CHANGEFEED FOR TABLE accounts INTO 'kafka://localhost:9092' WITH UPDATED;
Примечание. Дополнительную информацию о создании канала изменений на CockroachDB см. в их документации.
Оставьте окно терминала открытым для последующего использования.
Создание темы Redpanda и использование данных
В другом окне терминала выполните следующую команду, чтобы создать тему Redpanda под названием «Учетные записи»:
docker exec -it redpanda-1 \
rpk topic create accounts
Вывод должен выглядеть так:
TOPIC STATUS
accounts OK
Обратите внимание, что тема имеет то же имя, что и учетные записи таблицы CockroachDB. CDC CockroachDB создает данные в тему с тем же именем, что и таблица по умолчанию.
В том же окне терминала выполните следующую команду, чтобы начать потребление из темы accounts
:
docker exec -it redpanda-1 \
rpk topic consume accounts
Оставьте окно терминала открытым для просмотра использованных сообщений в следующих шагах.
Фиксация событий изменений
Чтобы убедиться, что механизм CDC работает, вы должны создать, обновить и удалить некоторые данные в таблице учетных записей. Вы также будете наблюдать и изучать захваченные события в теме учетных записей Redpanda.
Создание данных учетных записей
В окне клиентского терминала SQL выполните следующую команду, чтобы вставить некоторые данные в таблицу учетных записей:
root@:26257/bank> INSERT INTO accounts (id, balance) VALUES (1, 1000), (2, 250), (3, 700);
Это создает следующие учетные записи в таблице учетных записей CockroachDB:
Account ID Balance
1 1000
2 250
3 700
После вставки данных убедитесь, что потребитель Redpanda CLI распечатывает потребляемые данные:
{
"topic": "accounts",
"key": "[1]",
"value": "{\"after\": {\"balance\": 1000, \"id\": 1}, \"updated\": \"1648496379523876000.0000000000\"}",
"timestamp": 1648496379856,
"partition": 0,
"offset": 0
}
{
"topic": "accounts",
"key": "[2]",
"value": "{\"after\": {\"balance\": 250, \"id\": 2}, \"updated\": \"1648496379523876000.0000000000\"}",
"timestamp": 1648496379856,
"partition": 0,
"offset": 1
}
{
"topic": "accounts",
"key": "[3]",
"value": "{\"after\": {\"balance\": 700, \"id\": 3}, \"updated\": \"1648496379523876000.0000000000\"}",
"timestamp": 1648496379856,
"partition": 0,
"offset": 2
}
Обратите внимание, что у вас есть все данные из таблицы учетных записей в виде отдельных журналов событий в разделе учетных записей вашего экземпляра Redpanda.
Текущие транзакции по счету
Команда разработчиков приложений PandaBank поделилась с вами небольшим контейнерным приложением, которое выполняет некоторые транзакции на этих банковских счетах. Это приложение подключается к CockroachDB через localhost:26257
, поэтому убедитесь, что CockroachDB доступен в вашей локальной среде.
Используйте следующую команду для запуска транзакции между учетными записями:
git clone [email protected]:redpanda-data-blog/2022-cdc-with-cockroachdb.git
cd 2022-cdc-with-cockroachdb/account_transaction_manager/
docker build -t account-transaction-manager .
docker run account-transaction-manager
Вывод этой команды должен выглядеть так:
DEBUG:root:print_balances(): status message: SELECT 3
Balances at Mon Mar 28 19:43:34 2022:
(1, 1000)
(2, 250)
(3, 700)
DEBUG:root:transfer_funds(): status message: UPDATE 1
DEBUG:root:transfer_funds(): status message: UPDATE 1
DEBUG:root:print_balances(): status message: SELECT 3
Balances at Mon Mar 28 19:43:35 2022:
(1, 700)
(2, 350)
(3, 900)
Когда вы запустите команду SELECT * FROM accounts;
в SQL-клиенте CockroachDB, вы увидите следующие результаты:
Account ID Balance
1 700
2 350
3 900
Убедитесь, что новые изменения, зафиксированные CDC CockroachDB, отражаются на вашем потребителе Redpanda. В окне терминала потребителя вы должны увидеть следующий результат:
{
"topic": "accounts",
"key": "[1]",
"value": "{\"after\": {\"balance\": 900, \"id\": 1}, \"updated\": \"1648496614787637000.0000000000\"}",
"timestamp": 1648496615283,
"partition": 0,
"offset": 3
}
{
"topic": "accounts",
"key": "[2]",
"value": "{\"after\": {\"balance\": 350, \"id\": 2}, \"updated\": \"1648496614787637000.0000000000\"}",
"timestamp": 1648496615283,
"partition": 0,
"offset": 4
}
{
"topic": "accounts",
"key": "[1]",
"value": "{\"after\": {\"balance\": 700, \"id\": 1}, \"updated\": \"1648496614835272000.0000000000\"}",
"timestamp": 1648496615283,
"partition": 0,
"offset": 5
}
{
"topic": "accounts",
"key": "[3]",
"value": "{\"after\": {\"balance\": 900, \"id\": 3}, \"updated\": \"1648496614835272000.0000000000\"}",
"timestamp": 1648496615283,
"partition": 0,
"offset": 6
}
Обратите внимание на изменения баланса, которые представляют историю транзакций в выходных данных потребителя.
Удаление учетных записей
В качестве последнего шага удалите банковские счета и посмотрите, как их фиксирует CDC. Запустите следующий SQL-запрос в консоли запросов CockroachDB:
root@:26257/bank> DELETE FROM bank.accounts where id <> 0;
Потребитель Redpanda должен иметь следующие захваченные события:
{
"topic": "accounts",
"key": "[1]",
"value": "{\"after\": null, \"updated\": \"1648497640110587000.0000000000\"}",
"timestamp": 1648497640200,
"partition": 0,
"offset": 6
}
{
"topic": "accounts",
"key": "[2]",
"value": "{\"after\": null, \"updated\": \"1648497640110587000.0000000000\"}",
"timestamp": 1648497640200,
"partition": 0,
"offset": 7
}
{
"topic": "accounts",
"key": "[3]",
"value": "{\"after\": null, \"updated\": \"1648497640110587000.0000000000\"}",
"timestamp": 1648497640200,
"partition": 0,
"offset": 8
}
Обратите внимание, что поле значения становится пустым, когда событием изменения является удаление. CDC CockroachDB успешно фиксирует события изменения данных и отправляет их в Redpanda для дальнейшего использования.
Поздравляем! Вы успешно зафиксировали изменения транзакций банковского счета и превратили их в события Redpanda.
Заключение
В этом руководстве вы узнали, как запустить Redpanda в контейнере с помощью Docker, а также как создать тему и использовать сообщения из нее. Вы также научились устанавливать CockroachDB, создавать таблицу с помощью ее интерфейса SQL-запросов и настраивать ее для использования CDC.
Теперь вы можете использовать CockroachDB для захвата изменений и их потоковой передачи в Redpanda для реализации вариантов использования CDC, таких как создание отчетов, кэширование, полнотекстовое индексирование, предотвращение двойной записи и многое другое.
Найдите все ресурсы для этого руководства в этом репозитории или присоединитесь к сообществу Redpanda в Slack, чтобы задать конкретные вопросы. Посмотреть Документацию Redpanda здесь.