CDC é um padrão de integração de dados que vem se tornando cada mais vez mais comum hoje em dia. CDC significa, do inglês, Change Data Capture: uma tradução direta para o português seria Captura de Dados Alterados.
Em resumo, uma ferramenta que suporta CDC é capaz de capturar os dados de uma origem no momento em que estes são criados ou alterados, e os transportam para um destino, com baixa latência.
Há dois grandes benefícios neste tipo de integração:
- O primeiro é a velocidade com que os dados são propagados da origem para o destino (near real-time, baixa latência);
- O segundo é a heterogeneidade, uma vez que as ferramentas de CDC geralmente permitem capturar em um formato (plataforma, tecnologia, máquina, etc) e entregar em outro completamente diferente.
Atualmente CDC é usado em arquiteturas de microsserviços (em especial para capturar dados de sistemas legados, e também para endereçar alguns padrões como CQRS e Event Sourcing), e também, majoritariamente, em arquiteturas de integração de dados.
Sabemos que integração de dados é um processo que utilizamos para mover dados de um lugar para outro. Normalmente os dados são movidos de sistemas transacionais para repositórios centrais de dados, como os Data Warehouses, Data Lakes ou Lakehouses. Esses repositórios centrais oferecem melhor capacidade para a análise de dados através da utilização de técnicas de consumo, como mineração de dados, machine learning, e data visualization.
Bom, mas nem tudo são flores. Geralmente as empresas possuem muitos sistemas transacionais, e cada um com suas próprias complexidadades. E por isso, nem todas as integrações são realizadas da mesma forma. Cada integração é criada de acordo com as características de cada sistema, das capacidades deles de permitir que os dados sejam capturados. Algumas tabelas de um banco de dados, por exemplo, podem não oferecer colunas de timestamp ou algum identificador para capturarmos as mudanças de forma incremental, ou o sistema não possui APIs que expõem seus dados, ou eventualmente eles têm tudo, mas você não pode tocar neles porque as integrações podem impactar no desempenho do sistema. CDC resolve esses problemas.
Você pode ver este conteúdo em video pelo meu canal Universo dos Dados, no YouTube:
Velocidade e Desempenho
Nós temos a disposição geralmente três formas de lidar com a velocidade (latência de entrega dos dados) em uma integração: snapshot, batches incrementais e CDC – e cada uma dessas formas produz um tipo de impacto de desempenho na origem onde os dados são capturados:
- O primeiro deles, snapshot, é o mais simples, e o pior (mais lento) deles. Snapshot é como uma foto em um ponto no tempo. Você pode buscar os dados, por exemplo, todo dia à meia-noite. O método de snapshot sempre vai trazer tudo, e por isso, quanto maior a quantidade de dados, mais tempo para trazê-los, mais tempo de impacto na origem (concorrência de leitura), e maior consumo de espaço no destino.
- Batches incrementais são um pouco melhores do que o snapshot. Com esta abordagem você vai sempre trazer as diferenças desde o último batch incremental. O período de execução do batch incremental pode ser 1 vez por dia, 1 vez por hora, ou 1 vez a cada 15 minutos, por exemplo. Ou seja, você não precisa trazer todos os dados todas vezes. No entanto, um trade-off desta abordagem é que você acaba perdendo os deletes que ocorrem, pois ele retorna uma foto da diferença, desta forma dados removidos nunca aparecem nesses snapshots incrementais. Além disso, é preciso endereçar bem como as mudanças são capturadas, pois é necessário fazer consultas com filtros utilizando algum timestamp ou identificador, em especial de forma indexada, e isso pode eventualmente impactar no desempenho na origem.
- Por fim, CDC é a terceira abordagem, e ao contrário das anteriores, é a maneira que oferece a melhor velocidade, e o menor impacto da origem.
Geralmente as ferramentas que implementam CDC suportam os seguintes tipos de origens (source) e destinos (targets): bancos de dados, filesystems, APIs e brokers de eventos (streams).
O mais comum deles são os bancos de dados: as mudanças são capturadas do log de transação deles (que praticamente todos os bancos de dados têm), isto é, cada vez que há uma alteração em um banco de dados, essa alteração é escrita no log, e imediatamente a ferramenta de CDC captura deste log e propaga os dados para o destino. Também dizemos que o mecanismo de captura dos dados em bancos de dados é chamado de push (empurrar), pois literalmente as mudanças de estado nos dados são empurradas nos arquivos de log das transações.
Desta forma, dizemos que o padrão de integração CDC possui uma velocidade near real-time.
Infelizmente, todos os outros tipos de origens suportados por ferramentas de CDC não são tão amigáveis como são para os bancos de dados, pois estes outros não possuem arquivos de log de mudanças/transações – dizemos que eles são do tipo pull (puxar), isto é, tem que ir lá e pegar/puxar de tempos em tempos. Arquivos em filesystems precisam ser copiados a cada busca; APIs e broker de eventos (streams) tem um perfil mais micro-batch incremental do que propriamente CDC.
De qualquer forma, com a popularização do CDC, muitas ferramentas estão cada vez mais oferecendo algum tipo de melhoria e logs para serem suportados pelo padrão de integração CDC do tipo push.
Heterogeneidade
A heterogeneidade é um dos grandes benefícios do CDC. Eles são capazes de capturar e entregar dados para tecnologias diferentes, sem precisar de qualquer área intermediária (stage) para conversão.
Então você pode capturar dados de um banco de dados relacional, e entregá-los a um filesystem em formato JSON. Capturar dados de uma fila de mensagens, e entregá-los a um banco de dados. Capturar dados do Hive e entregar para um Kafka, e assim por diante.
Claro que eventualmente conectores são necessários nas pontas para fazer algum tipo de conversão, mas a capacidade de lidar com origens e destinos de forma heterogênea, entregando os dados com extrema baixa latência, é um diferencial deste padrão de integração.
Quando Usar
Abaixo eu listo alguns dos principais casos de uso onde CDC tem bastante valor:
- Migrações de plataformas e sistemas: migrar dados de um sistema legado, como um mainframe, para uma plataforma mais moderna (JSON, REST, Microsserviços, Cloud, etc). Migrar plataforma com CDC permite desacoplar o antigo do novo. Em outras palavras, é possível conviver com ambas as plataformas ao mesmo tempo sem precisar de uma migração big bang. Mudanças realizadas no sistema novo são propagadas para o sistema antigo, e vice-versa.
- Carga em tempo real para Data Warehouses: com CDC você captura as mudanças de dados dos sistemas transacionais e já as entrega para o DW, em near real-time. É a letra E do ETL feita de uma forma não-batch. O CDC permite que o DW seja atualizado praticamente a todo tempo, e por isso essa capacidade habilita a disponibilização dos dados para suporte à decisão em tempo quase near real-time.
- Atualizações de caches e índices: você pode manter um cache atualizado no Redis (ou qualquer outro mecanismo de cache ou data grid), e atualizar um Search Index no ElasticSearch, por exemplo, na medida que os dados são alterados em uma fonte de dados transacional.
- Atualização de tabelas read-only em Microsserviços: nas arquiteturas de microsserviços, onde geralmente cada serviço tem seu próprio banco de dados, o correto seria um serviço chamar uma API de outro para obter seus dados, mas nem sempre isso é possível, e pode gerar problemas de desempenho. Manter uma réplica read only em bancos de dados de outros serviços, sincronizados por meio de CDC, pode melhorar bastante a performance e ainda assim manter as características de disponibilidade e autonomia dos microsserviços.
- Sincronizar dados em cloud híbrida e multi-cloud: CDC permite sincronizar dados em serviços de dados que existem em clouds diferentes, ou mesmo entre serviços cloud e recursos on-premises. Um exemplo bastante comum é criar um ambiente de disaster recovery em cloud, a partir dos dados que existem on-premises.
Principais Tecnologias
No momento que escrevo este post existem algumas ferramentas de CDC bastante comuns no mercado.
Na esfera comercial, o principal deles, o mais robusto e sofisticado é o GoldenGate, da Oracle – este também disponibilizado como um serviço gerenciado na Oracle Cloud.
Na esfera open-source, o principal deles é o Debezium, comumente usado em vários casos de uso com Apache Kafka.
Há outras ferramentas no mercado que suportam o padrão de integração CDC, não como uma ferramenta de CDC em si, mas como uma capacidade complementar. Uma delas é o Airbyte por exemplo, que é como tantas outras uma ferramenta de Integração de Dados que suporta, também, CDC.
Conclusões
Considere o padrão de integração CDC sempre que precisar que os dados sejam capturados em near real-time.
Você pode me seguir neste blog: