2
respostas

[Dúvida] Cluster de brokers com Docker

Eu criei um docker-compose onde subo os serviços do zookeeper e do kafka

version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.3.5
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - "2181:2181"
    volumes:
      - ./data/zookeeper/data:/var/lib/zookeeper/data
      - ./data/zookeeper/log:/var/lib/zookeeper/log

  kafka-1:
    image: confluentinc/cp-kafka:7.3.5
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka-1
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    volumes:
      - ./data/kafka:/etc/kafka
      - ./data/kafka/data:/var/lib/kafka/data/

  kafka-2:
    image: confluentinc/cp-kafka:7.3.5
    depends_on:
      - zookeeper
    ports:
      - "9093:9093"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka-2
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:29093,PLAINTEXT_HOST://localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    volumes:
      - ./data/kafka-2:/etc/kafka
      - ./data/kafka-2/data:/var/lib/kafka/data/

No volume /data/kafka e /data/kafka-2 tenho os arquivos:

  • kafka.properties
  • log4j.properties
  • server.properties
  • tools-log4j.properties

No server properties fiz as alterações para ele criar 3 partições e realizar as replicações. Vou colocar só estes trechos por causa do tamanho do arquivo:

############################# Server Basics #############################

# The id of the broker. This must be set to a unique integer for each broker.
broker.id=0
#Define replication of broken cluster
default.replication.factor=2

############################# Socket Server Settings #############################
# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=3

Após alterar o default.replication.factor=2 eu fiz um docker-compose down e após criei novos containers com o docker-compose up o estranho e que ao startar os serviços ele cria somente o tópico com uma partição.

docker exec -it ecommerce_kafka-2_1 /bin/kafka-topics --bootstrap-server localhost:9093 --describe
[2023-10-17 18:43:14,310] WARN [AdminClient clientId=adminclient-1] Connection to node 1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
Topic: ECOMMERCE_NEW_ORDER	TopicId: 6_JNVwwUR9WjRAx1jsqLPQ	PartitionCount: 3	ReplicationFactor: 2	Configs: 
    Topic: ECOMMERCE_NEW_ORDER	Partition: 0	Leader: 1	Replicas: 1,2	Isr: 1,2
    Topic: ECOMMERCE_NEW_ORDER	Partition: 1	Leader: 2	Replicas: 2,1	Isr: 2,1
    Topic: ECOMMERCE_NEW_ORDER	Partition: 2	Leader: 1	Replicas: 1,2	Isr: 1,2
Topic: ECOMMERCE_SEND_EMAIL	TopicId: UqUdjybWQtKswZUyQEzU2A	PartitionCount: 1	ReplicationFactor: 1	Configs: 
    Topic: ECOMMERCE_SEND_EMAIL	Partition: 0	Leader: 1	Replicas: 1	Isr: 1
Topic: __consumer_offsets	TopicId: U3ePD8FIRmKzAeiJ7pBBew	PartitionCount: 50	ReplicationFactor: 1	Configs: compression.type=producer,cleanup.policy=compact,segment.bytes=104857600

Aqui o ECOMMERCE_NEW_ORDER aparece com as três partições porque eu criei elas via comando.

Imagem com diretórios da aplicação e o espelhamento no containerListando diretório no container para verificar se os arquivos de configuração foram carregados.

arquivo server.propertiesArquivo server.properties no container com a replication.factor

Alguém tem um dica/sugestão do que posso fazer para corrigir este problema?

Link do projeto em: https://github.com/estevamdf2/ecommerce/

2 respostas

Olá Marcos! Tudo bem?

Uma possível solução para esse problema é verificar se as configurações estão sendo aplicadas corretamente nos containers do Kafka. Você pode fazer isso acessando o container do Kafka-2 e verificando o arquivo server.properties para garantir que a configuração default.replication.factor=2 foi aplicada corretamente.

Você também pode tentar reiniciar os containers do Kafka utilizando o comando docker-compose down seguido de docker-compose up. Isso pode ajudar a garantir que as configurações sejam aplicadas corretamente durante o processo de inicialização dos serviços.

Além disso, é importante lembrar que a criação de partições e as replicações podem levar algum tempo para serem concluídas. Portanto, pode ser necessário aguardar um pouco para que todas as partições e réplicas sejam criadas corretamente.

Caso o problema persista, sugiro que você verifique se as versões dos serviços do Kafka e do ZooKeeper estão corretas e compatíveis entre si. Também é importante garantir que não existam conflitos de portas ou problemas de conectividade entre os containers.

Espero que essas sugestões possam te ajudar a resolver o problema. Se tiver mais alguma dúvida, é só me dizer.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Valeu muito obrigado pelas sugestões.

Compartilho abaixo os passos que realizei e a nova treta que venho tendo.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeMatando os containers

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeRecriando os containers

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeComentando a propriedade offsets.topic.replication.factor no server.properties e checando o carregamento dela no container

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeDeixando a propriedade default.replication.factor como 1 e verificando o seu carregamento no container.

Ao acessar o log do container o mais estranho e a propriedade offsets.topic.replication.factor vim definida como 3. Mesmo que eu deixe ela definida como 1 ele sempre está criando o container com a propriedade igual a 3.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeO problema gerado com isso e que as aplicações clientes não recebem as mensagens. Nunca vi uma parada dessa.

Sempre antes de subir novas instâncias do container eu removo os conteúdos dos diretórios

  • data/kafka-1/data
  • data/zookeeper/data
  • data/zookeeper/log

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeAqui deixei a propriedade offsets.topic.replication.factor=1 e tentei subir o container

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeComparando o arquivo server.properties dentro do container

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguém tem ideia de onde o kafka está aplicando este offsets.topic.replication.factor como 3 ???

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software