Узнайте, как интегрировать 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 здесь.