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

Bruno Santos
May 29 · 4 min read
Image for post
Image for post

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:

Image for post
Image for post

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

M4U Tech

Apaixonados por tecnologia e pelo desafio de fazer melhor

Bruno Santos

Written by

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

M4U Tech

M4U Tech

Apaixonados por tecnologia e pelo desafio de fazer melhor

Bruno Santos

Written by

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

M4U Tech

M4U Tech

Apaixonados por tecnologia e pelo desafio de fazer melhor

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store