Construindo ambiente de streaming de dados com SQL Server, CDC e Kafka

Bruno Santos
Bemobi
Published in
4 min readMay 29, 2020

Fala povo, mais um artigo para compartilhar, a ideia é mostrar os passos para implementar um ambiente para coletar informações de bancos de dados e transferir para a plataforma do Apache Kafka. No final teremos um ambiente similar ao que encontramos no desenho abaixo:

Para seguir com as instruções do artigo será necessário ter o docker e docker-compose instalados, além de conhecimento básico no provisionamento de containers docker.

Alguns conceitos para ajudar no decorrer do artigo:

CDC: change data capture, ao ‘pé da letra’, software que captura comandos de DML e DDL executados no banco de dados;

Debezium: plataforma de CDC com plugins para captura de dados dos principais bancos de dados do mercado, ex: SQL Server, Postgres, MySQL entre outros;

Zookeeper: é o serviço que centraliza as informações de configuração e manutenção de um cluster kafka;

Kafka: plataforma para processamento de streaming de dados;

Connect: é um componente do ecosistema do kafka usado para conectar o kafka com sistemas externos e vice-versa;

Resumo:

Vamos usar um arquivo docker-compose.yml para subir containers com SQL Server, Zookeeper, Kafka e Kafka Connect. Feito isso, vamos criar um banco de dados na instância do SQL Server, configurar CDC para que todas as modificações executadas nesse banco de dados sejam direcionadas através do Kafka Connect para o Kafka.

Prática:

Criando diretórios e arquivos fontes

Abra um terminal e crie um diretório para esse laboratório, acesse esse diretório e crie arquivos com nomes Dockerfile, docker-compose.yml e script.sql usando seu editor de código preferencial, conforme abaixo:

Cópie e cole o conteúdo abaixo no arquivo docker-compose.yml:

Agora copie e cole o conteúdo abaixo no arquivo Dockerfile:

Por fim copie e cole no arquivo script.sql o seguinte conteúdo:

Construindo Imagem

Analise o arquivo docker-compose.yml e veja que usamos imagens prontas, 1 da Microsoft para subir SQL Server e outras 2 da Confluent para subir o Zookeeper e Kafka, já a última imagem (cdc:latest), vamos criar, para isso usamos o arquivo Dockerfile. Essa imagem conterá o Kafka Connect e os plugins da Debezium que nos permitirá realizar a captura de dados do SQL Server, Postgres e MySQL, muito embora no nosso laboratório vamos usar apenas SQL Server. Construa a imagem com o comando abaixo:

Output:

Sending build context to Docker daemon 5.632kBStep 1/2 : FROM confluentinc/cp-kafka-connect-base:5.5.0 — -> e5a010481963Step 2/2 : RUN confluent-hub install — no-prompt debezium/debezium-connector-postgresql:1.1.0 && confluent-hub install — no-prompt debezium/debezium-connector-mysql:1.1.0 && confluent-hub install — no-prompt debezium/debezium-connector-sqlserver:1.1.0 — -> Using cache — -> 76f572f5dd34Successfully built 76f572f5dd34Successfully tagged cdc:latest

Pronto, imagem criada

Agora execute o comando abaixo para subir todos os containers (SQL Server, Zookeeper, Kafka, e Kafka Connect), lembrando que 3 imagens serão baixadas da internet, e 1 é a imagem que acabamos de criar e já está no nosso repositório local de imagens, execute:

Feito isso, espere ~1 minuto para que todos os serviços estejam completamente de pé, o output da subida dos serviços é muito grande, impraticável e desnecessário colocar no post, mas para servir de base, você verá algo assim no final:

Output:

INFO [Worker clientId=connect-1, groupId=connect-1] Finished starting connectors and tasks

Agora vamos executar script na instância SQL Server, que basicamente criará uma base de dados e habilitará o CDC, então execute o comando abaixo:

Output:

Changed database context to ‘db’.Changed database context to ‘db’.Changed database context to ‘db’.Job ‘cdc.db_capture’ started successfully.Job ‘cdc.db_cleanup’ started successfully.

Pronto, agora é hora de configurar o Kafka Connect para conectar na base de dados criada através do script que executamos acima, e a partir de então tudo que for executado de comandos DML será transferido para o Kafka, para isso execute o comando abaixo:

Output:

HTTP/1.1 201 CreatedDate: Mon, 25 May 2020 18:12:31 GMTLocation: http://localhost:8083/connectors/db-connectorContent-Type: application/jsonContent-Length: 442Server: Jetty(9.4.24.v20191120){“name”:”db-connector”,”config”:{“connector.class”:”io.debezium.connector.sqlserver.SqlServerConnector”,”tasks.max”:”1",”database.server.name”:”sqlserver”,”database.hostname”:”sqlserver”,”database.port”:”1433",”database.user”:”sa”,”database.password”:”P@ssw0rd”,”database.dbname”:”db”,”database.history.kafka.bootstrap.servers”:”kafka:9092",”database.history.kafka.topic”:”schema-changes.db”,”name”:”db-connector”},”tasks”:[],”type”:”source”}

Agora vamos consumir mensagens do Kafka para validar se tudo o que fizemos deu certo, para isso execute o comando abaixo:

Mantenha o terminal aberto, abra outro terminal e entre no container do SQL Server para inserir registros e ver a “mágica” ocorrendo no terminal onde está aberto o consumidor, para entrar no container do SQL:

Dentro do container abrirá linha de comando do utilitário sqlcmd, onde você poderá submeter comandos SQL, assim, vamos inserir um registro:

Output:

(1 rows affected)

Agora veja no terminal do consumir se esse registro foi efetivamente consumido. Dica: o retorno é um grande json, veja apenas a partir do payload.

É isso galera, espero ter colaborado

--

--

Bruno Santos
Bemobi
Writer for

Pai, marido, filho, irmão, tio, cristão, profissional de TI, corintiano, chef e fã de comida japonesa