Configuración de clúster ZooKeeper de tres nodos y corredores Apache Kafka

¡Buen día!

En este artículo, veremos cómo configurar un grupo de tres nodos ZooKeeper (servicio de coordinación del sistema distribuido), dos de los cuales son agentes de mensajes de Kafka y el tercero es el administrador.

Como resultado, se implementará el siguiente esquema de componentes:

imagen

Todos los componentes en una máquina, por simplicidad, usaremos el editor de consola incorporado (productor) y los mensajes de suscriptor (consumidor).

El módulo ZooKeeper está integrado en el paquete Kafka, lo usamos.

Instalación y configuración


Instalación del paquete Kafka

En este caso, el sistema operativo es Ubuntu 16.04 LTS.

Las versiones actuales y las instrucciones detalladas se encuentran en el sitio web 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 

Cree directorios de trabajo para los tres nodos servidor_1, servidor_2 y servidor_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/

Configuración de nodos

Configuración de un agente Kafka
(desde los directorios kafka_server_1, kafka_server_2 y kafka_server_3, respectivamente)

vim config/server.properties

  • ID del corredor (0, 1, 2 respectivamente)
  • puerto del cliente (9092, 9093, 9094)
  • Puerto ZooKeeper (2181, 2182, 2183)
  • directorio de registro (/ 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

Configuración de Znode:

vim config/zookeeper.properties

  • directorio para datos (/ tmp / zookeeper_1, / tmp / zookeeper_2, / tmp / zookeeper_3)
  • puerto de cliente (2181, 2182, 2183)
  • número máximo de conexiones de clientes y límites de conexión
  • puertos para el intercambio de datos entre nodos (es decir, informamos a cada nodo sobre la existencia de otros)

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

Crear directorios para los nodos de ZooKeeper, escribir la identificación del nodo en los archivos de servicio:

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

En caso de problemas con los derechos de acceso, cámbielos en directorios y archivos:

sudo chmod 777 /tmp/zookeeper_1

Ejecución de nodos z y corredores


Para los dos primeros nodos (kafka_server_1 /, kafka_server_2 /), ejecute las secuencias de comandos de los servidores ZooKeeper y Kafka, los argumentos son los archivos de configuración correspondientes:

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

Para el tercer nodo (kafka_server_3 /), solo ZooKeeper.

Scripts para detener servidores:

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

Crear un tema, productor y consumidor de consolas


Tema (tema): una secuencia de mensajes de cierto tipo, divididos en particiones (el número se especifica mediante la tecla --partición). Cada partición está duplicada en dos servidores (- factor de replicación). Después de la clave --bootstrap-server, especifique los puertos de los corredores Kafka, separados por comas. El modificador --topic especifica el nombre del tema.

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

Descubra la lista de temas en el puerto, la información sobre cada tema se puede hacer con el comando:

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

Líder - un servidor con la instancia principal de la partición, réplica - el servidor en el que se duplica la información, ISR - servidores que asumen el papel de líderes en caso de falla del líder.

Creamos el productor de la consola, el consumidor de la consola usando los scripts apropiados:

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

Esto asegura la transmisión continua de mensajes al destinatario, en caso de falla de un agente de mensajes procesa el segundo.

Servicios para zookeeper y kafka en systemctl


Para la comodidad de iniciar un clúster, puede crear servicios en systemctl: zookeeper_1.service, zookeeper_2.service, zookeeper_3.service, kafka_1.service, kafka_2.service.

Editamos el archivo /etc/systemd/system/zookeeper_1.service (cambie el directorio / home / user y user user por los necesarios).

[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 los servicios zookeeper_2.service y zookeeper_3.service es similar.

Archivo /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

kafka_2.service es similar.

Activación y verificación de servicios.

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

Lo mismo aplica para zookeeper_2.service, zookeeper_3.service, kafka_1.service, kafka_1.service.

¡Gracias por la atención!

All Articles