Configuração de cluster do ZooKeeper de três nós e agentes do Apache Kafka

Dia bom!

Neste artigo, consideraremos a configuração de um cluster de três nós do ZooKeeper (serviço de coordenação do sistema distribuído), dois dos quais são agentes de mensagens Kafka e o terceiro é o gerente.

Como resultado, o seguinte esquema de componentes será implementado:

imagem

Todos os componentes em uma máquina, para simplificar, usaremos as mensagens internas do editor (produtor) e do assinante (consumidor) do console.

O módulo ZooKeeper está embutido no pacote Kafka, nós o usamos.

Instalação e configuração


Instalando o pacote Kafka

Nesse caso, o sistema operacional é o Ubuntu 16.04 LTS.

As versões atuais e instruções detalhadas estão no site oficial .

wget http://mirror.linux-ia64.org/apache/kafka/2.4.1/kafka_2.12-2.4.1.tgz
tar -xvzf kafka_2.12-2.4.1.tgz 

Crie diretórios de trabalho para os três nós server_1, server_2 e server_3.

mv kafka_2.12-2.4.1 kafka_server_1
cp -r kafka_server_1/ kafka_server_2/
cp -r kafka_server_1/ kafka_server_3/

Configurando nós

Configurando um broker Kafka
(dos diretórios kafka_server_1, kafka_server_2 e kafka_server_3, respectivamente)

vim config/server.properties

  • ID do corretor (0, 1, 2 respectivamente)
  • porta do cliente (9092, 9093, 9094)
  • Porta ZooKeeper (2181, 2182, 2183)
  • diretório de log (/ tmp / kafka-logs-1, / tmp / kafka-logs-2, / tmp / kafka-logs-3)

broker.id=0
listeners=PLAINTEXT://:9092
zookeeper.connect=localhost:2181   
log.dirs=/tmp/kafka-logs-1

Configuração do Znode:

vim config/zookeeper.properties

  • diretório de dados (/ tmp / zookeeper_1, / tmp / zookeeper_2, / tmp / zookeeper_3)
  • porta do cliente (2181, 2182, 2183)
  • número máximo de conexões do cliente e limites de conexão
  • portas para troca de dados entre nós (ou seja, informamos cada nó sobre a existência de outros)

dataDir=/tmp/zookeeper_1
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
tickTime=2000
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890

Criando diretórios para nós do ZooKeeper, gravando a identificação do nó nos arquivos de serviço:

mkdir -p /tmp/zookeeper_[1..3]
echo "1" >> /tmp/zookeeper_1/myid
echo "2" >> /tmp/zookeeper_2/myid
echo "3" >> /tmp/zookeeper_3/myid

Em caso de problemas com os direitos de acesso, altere-os em diretórios e arquivos:

sudo chmod 777 /tmp/zookeeper_1

Executando nós-z e intermediários


Para os dois primeiros nós (kafka_server_1 /, kafka_server_2 /), execute os scripts do ZooKeeper e Kafka-servers, os argumentos são os arquivos de configuração correspondentes:

sudo bin/zookeeper-server-start.sh config/zookeeper.properties
sudo bin/kafka-server-start.sh config/server.properties

Para o terceiro nó (kafka_server_3 /) - apenas o ZooKeeper.

Scripts para parar servidores:

sudo bin/kafka-server-stop.sh
sudo bin/zookeeper-server-stop.sh

Criando um tema, produtor de console e consumidor


Tópico (tópico) - um fluxo de mensagens de um determinado tipo, dividido em partições (a quantidade é especificada pela chave --partition). Cada partição é duplicada em dois servidores (--replication-factor). Após a chave --bootstrap-server, especifique as portas dos agentes Kafka separadas por vírgulas. A opção --topic especifica o nome do tópico.

sudo bin/kafka-topics.sh --create --bootstrap-server localhost:9092,localhost:9093 --replication-factor 2 --partitions 2 --topic TestTopic

Descubra a lista de tópicos na porta, informações sobre cada tópico podem ser feitas com o comando:

sudo bin/kafka-topics.sh --list --zookeeper localhost:2181           
sudo bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic TestTopic

Líder - um servidor com a instância principal da partição, réplica - o servidor no qual as informações são duplicadas, ISR - servidores que assumem o papel de líderes em caso de falha do líder.

Criamos o produtor do console, consumidor do console, usando os scripts apropriados:

sudo bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093 --topic TestTopic
sudo bin/kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093 --from-beginning --topic TestTopic

Isso garante a transmissão contínua de mensagens para o destinatário, em caso de falha de um intermediário de mensagens processa o segundo.

Serviços para zookeeper e kafka no systemctl


Para a conveniência de iniciar um cluster, você pode criar serviços em systemctl: zookeeper_1.service, zookeeper_2.service, zookeeper_3.service, kafka_1.service, kafka_2.service.

Editamos o arquivo /etc/systemd/system/zookeeper_1.service (altere o diretório / home / user e user user para os necessários).

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=user
ExecStart=home/user/kafka_server_1/bin/zookeeper-server-start.sh /home/user/kafka_server_1/config/zookeeper.properties
ExecStop=/home/user/kafka_server_1/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

Para os serviços zookeeper_2.service e zookeeper_3.service, é semelhante.

Arquivo /etc/systemd/system/kafka_1.service:
[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=user
ExecStart=/bin/sh -c '/home/user/kafka_server_1/bin/kafka-server-start.sh /home/user/kafka_server_1/config/server.properties > /tmp/kafka-logs-1 2>&1'
ExecStop=/home/user/kafka_server_1/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

O kafka_2.service é semelhante.

Ativação e verificação de serviços

systemctl daemon-reload
systemctl enable zookeeper_1.service #  
systemctl start zookeeper_1.service
sudo journalctl -u zookeeper_1.service #   
systemctl stop zookeeper_1.service

O mesmo vale para zookeeper_2.service, zookeeper_3.service, kafka_1.service, kafka_1.service.

Obrigado pela atenção!

All Articles