Rafael Figueredo Guimarães
Unviversidade Federal de Campina Grande - UFCG
Programa de Pós-Graduação em Ciência da Computação
Este trabalho tem como objetivo apresentar um estudo relacionando conceitos de Sistemas Distribuídos e a ferramenta Apache Kafka. O trabalho está subdividido em 2 seções, a primeira seção apresenta um breve resumo teorico sobre o Kafka e em seguida alguns experimentos práticos envolvendo tolerancia a falhas, replicação em sistemas distribuídos, eleição de lider.
De acordo com a documentação [1], Apache Kafka é uma plataforma de streaming de eventos distribuída de código aberto usada por milhares de empresas para pipelines de dados de alto desempenho, análise de streaming, integração de dados e aplicativos de missão crítica.
Conforme a documentação, a essencia do Apache Kafka consiste em streaming de eventos.
Event streaming é a prática de captura de dados em tempo real a partir de alguma fonte (ex. banco de dados, sensor, dispositivos móveis, serviços em nuvem). Esses eventos são salvos e duraveis para posterior processamento em diferentes destinos.
Saiba mais sobre aplicações do Apache Kafka em [2].
O Apache Kafka combina três elementos chave em sua dinâmica de funcionamento:
- Publicar (modo escrita) e assinar (modo de leitura) fluxos de eventos, incluindo importação/exportação contínua de seus dados e de outros sistemas.
- Armazenar fluxos de eventos de forma durável e confiável.
- Processar fluxos de eventos à medida que ocorrem ou retrospectivamente.
- Baixa Latência (refere-se ao tempo de deslocamento de uma mensagem na rede.)
- Alto Throughput (refere-se ao volume médio de dados que podem passar pela rede em um período específico)
- Escalável
- Alta disponibilidade
- Consegue armazenar mensagens
- Interoperabilidade com outros sistemas.
- Mensagem ou evento: Um evento registra o fato de que “algo aconteceu”.
- Produtores: são aplicações clientes que publicam (escrevem) eventos no Kafka.
- Consumidores: são aplicações que lêem e processam esses eventos. (Produtores e consumidores são agnósticas entre si.)
- Tópicos: Um tópico é semelhante a uma pasta em um sistema de arquivos e os eventos são os arquivos dessa pasta. Os eventos são organizados e armazenados de forma durável em tópicos.
- Broker: É o servidor do Kafka, responsável por receber as mensagens dos produtores, escrever as mensagens no disco (partição) e disponibilizar para os consumidores [3]
- Partições: Os tópicos são particionados, o que significa que um tópico está espalhado por vários “buckets” localizados em diferentes brokers Kafka.
Um das principais caracteristicas do kafka está relacionada a sua tolerancia a falhas. As máquinas falham e muitas vezes não podemos prever quando isso vai acontecer. O Kafka foi projetado tendo a replicação como um recurso principal para resistir a essas falhas, mantendo o tempo de atividade e a precisão dos dados.
A replicação de dados ajuda a evitar a perda de dados gravando os mesmos dados em mais de um broker.
Um fator de replicação de 1
significa que não há replicação. É usado principalmente para fins de desenvolvimento e deve ser evitado em clusters Kafka de teste e produção.
Um fator de replicação de 3
é um fator de replicação comumente usado, pois fornece o equilíbrio certo entre a perda do corretor e a sobrecarga de replicação.
- Para criar uma instancia do kafka localmente, clone este repositório.
$ git clone https://github.com/rafaelfigueredog/kafka-experiments.git
- Entre no pasta do repositório usando os seguintes comandos:
$ cd kafka-experiments
-
Em seguida, rode o comando abaixo para subir a instancia do
Kafka
em sua máquina. (Assumindo que você possui odocker
instalando em sua máquina.)Obs: caso, não possua o docker instalado em sua máquina siga a documentação oficial para realizar instalação.
$ docker compose up
Após a realização dos passos acima os seguintes containeiners estarão ativos:
- Broker: É o próprio serviço do kafka.
- Zookeeper: É um serviço de coordenação distribuída que ajuda a gerenciar um grande conjunto de hosts.
- Confluent Control Center: É uma interface gráfica desenvolvida pela Confluent empresa que mantém o kafka.
- Schema Registry: é um processo que roda em um servidor próximo aos brokers do Kafka e fica responsável por armazenar os schemas e suas possíveis versões
- Kafka Connect: é um componente gratuito e de código aberto do Apache Kafka® que serve como um hub de dados centralizado para integração simples de dados entre bancos de dados, armazenamentos de valores-chave, índices de pesquisa e sistemas de arquivos.
- Ksqldb Server: Permite construir aplicativos de streaming de eventos com a mesma facilidade e familiaridade de construir aplicativos tradicionais em um banco de dados relacional.
O arquivo docker-compose.yml
utilizado como referencia é da própria mantededora do Apache Kafka. all in one confluent plaftorm. Partindo dessa base foram criados mais 2 instancias de brokers para realização de experimentos com replicação.
- Abrir console do control-center
http://localhost:9021
- Criar um tópico na pagina
Topics
com configurações default (essa configuração já habilita um nível equilibrado entre disponibilidade e durabilidade, com fator de replicação3
.
Um cluster Kafka
pode ter vários brokers, mas apenas um broker pode ser o controlador. O processo de eleger um broker entre a lista de corretores em um cluster para ser o controlador ativo é chamado de eleição de líder.
O Zookeeper
deve fazer a eleição do líder quando o corretor controlador estiver inativo. O corretor controlador, por sua vez, é responsável por eleger os líderes da partição, garantindo que as leituras e gravações dos clientes no Kafka ainda possam acontecer.
- Primeiro passo é garantir que todos os containers estão ativos
docker compose ps
- Em seguida abra o control center no
http://localhost:9021
e verifique o qual é o id do active controller, no menubrokers
- Em seguida execute
docker compose stop <nome-do-container-broker-ativo>
- Após esse processo é experado que tenhamos o seguinte resultado.
Falhas no Kafka podem ocorrer se o broker ativo e o Zookeeper tiverem problemas. O Zookeeper é responsável por eleger um novo controller, e se ele estiver inativo, não haverá eleição. Isso impede que o líder da partição do tópico identifique as réplicas que devem se tornar o novo líder. Como resultado, podem ocorrer falhas e corrupção de dados. No aquivo desse experimento temos apenas um uma instancia do Zookeeper ativo, no entanto, esse problema pode ser contornado criando replicas do zookeeper.
Para realizar o experimento vamos realizar os seguintes passos.
- Primeiro passo é garantir que todos os containers estão ativos
docker compose ps
- Em seguida abra o control center no
http://localhost:9021
e verifique o qual é o id do active controller, no menubrokers
- Em seguida execute
docker compose stop <nome-do-container-broker-ativo>
- Em seguida execute
docker compose stop <nome-do-container-zookeeper>
- Após essas ações, mesmo com todos os outros serviços ativos, obtive o seguinte log do control center.
Current cluster went offiline a minute ago.
Enquanto o broker controller estiver ativo, mesmo que ocorra uma falha no Zookeeper o serviço do Kafka permanece ativo.
Para realizar o experimento vamos realizar os seguintes passos.
- Primeiro passo é garantir que todos os containers estão ativos
docker compose ps
- Em seguida execute
docker compose stop <nome-do-container-zookeeper>
- Após essas ações, note que ainda é possível produzir mensagens através o control center ou de alguma aplicação cliente.