Introducción
Apache Kafka es un popular intermediario de mensajes distribuidos diseñado para manejar grandes volúmenes de datos en tiempo real. Un clúster de Kafka es altamente escalable y tolerante a fallas y también tiene un rendimiento mucho mayor que otros agentes de mensajes como ActiveMQ y RabbitMQ. Si bien generalmente se usa como un sistema de mensajería de publicación /suscripción, muchas organizaciones también lo usan para la agregación de registros porque ofrece almacenamiento persistente para los mensajes publicados.
Un sistema de mensajería de publicación /suscripción permite que uno o más productores publiquen mensajes independientemente del número de consumidores o de cómo procesarán los mensajes. Los clientes suscritos son notificados automáticamente de las actualizaciones y la creación de nuevos mensajes.
En este tutorial, instalará y configurará Apache Kafka 2.1.1 en un servidor Debian 10. Opcionalmente, instalará KafkaT para monitorear Kafka y configurar un clúster de múltiples nodos de Kafka.
Prerrequisitos
Para seguir este tutorial, necesitará:
- Un servidor Debian 10 con al menos 4 GB de RAM y un usuario no root con privilegios sudo.
- OpenJDK 11 instalado en su servidor. Para instalar esta versión, siga las instrucciones Cómo instalar Java en Debian 10. Kafka está escrito en Java, por lo que requiere una JVM.
Nota: LasOut Of Memory
Si desea instalar Apache Kafka en un servidor remoto, continúe leyendo; de lo contrario, omita el primer párrafo "Conectando al servidor" y lea el siguiente.
Conexión al servidor
Para acceder al servidor, necesita conocer la dirección IP. También necesitará su nombre de usuario y contraseña para la autenticación. Para conectarse al servidor como root, escriba el siguiente comando:
ssh root@IP_DEL_SERVER
A continuación, deberá ingresar la contraseña del usuario root.
Si no usa el usuario root, puede iniciar sesión con otro nombre de usuario usando el mismo comando, luego cambie root a su nombre de usuario:
ssh nome_utente@IP_DEL_SERVER
Luego se le pedirá que ingrese su contraseña de usuario.
El puerto estándar para conectarse a través de ssh es 22, si su servidor usa un puerto diferente, deberá especificarlo usando el parámetro -p, luego escriba el siguiente comando:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Paso 1: cree un usuario para Kafka
Dado que Kafka puede manejar solicitudes a través de una red, se recomienda que cree un usuario dedicado. Esto minimiza el daño a la computadora Debian en caso de que el servidor Kafka se vea comprometido. En este paso, creará el usuario dedicado kafka.
Inicie sesión como un usuario sudo no root, cree un usuario llamado kafka
con el comando useradd
sudo useradd kafka -m
La -m
asegura que se creará un directorio de inicio para el usuario. Este directorio de inicio, /home/kafka
, servirá como directorio del espacio de trabajo para ejecutar comandos más adelante.
Establecer contraseña usando passwd
:
sudo passwd kafka
Ingrese la contraseña que desea usar para este usuario.
A continuación, agregue el usuario de kafka sudo
con el adduser
, de modo que tenga los privilegios necesarios para instalar las dependencias de Kafka:
sudo adduser kafka sudo
Su usuario de kafka ya está listo. Inicie sesión en esta cuenta usando su
:
su -l kafka
Ahora que ha creado el usuario específico de Kafka, puede continuar con la descarga y extracción de los binarios de Kafka.
Paso 2: descargue y extraiga los binarios de Kafka
En este paso, va a descargar y extraer los archivos binarios de Kafka en carpetas específicas en el directorio personal del usuario kafka.
Para comenzar, cree un directorio llamado Downloads
en /home/kafka
para almacenar sus descargas:
mkdir ~/Downloads
Luego, instale curl
usando apt-get
para que pueda descargar archivos remotos:
sudo apt-get update && sudo apt-get install curl
Cuando se le solicite, escriba Y
para confirmar la descarga de curl
Una vez que curl
instalado, utilícelo para descargar los binarios de Kafka:
curl "https://archive.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz" -o ~/Downloads/kafka.tgz
Cree un directorio llamado kafka
y cambie a este directorio. Este será el directorio base de la instalación de Kafka:
mkdir ~/kafka && cd ~/kafka
Extraiga el archivo descargado usando el comando tar
tar -xvzf ~/Downloads/kafka.tgz --strip 1
--strip 1
se especificó para garantizar que el contenido del archivo se extraiga en ~/kafka/
y no en otro directorio dentro de él, por ejemplo ~/kafka/kafka_2.12-2.1.1/
.
Ahora que ha descargado y extraído correctamente los archivos binarios, puede continuar con la configuración de Kafka para permitir que se elimine el tema.
Paso 3: configurar el servidor Kafka
El comportamiento predeterminado de Kafka no nos permitirá eliminar un tema, categoría, grupo o nombre de fuente donde se pueden publicar mensajes. Para cambiar esto, editará el archivo de configuración.
Las opciones de configuración de Kafka se especifican en server.properties
. Abra este archivo con nano
o su editor favorito:
nano ~/kafka/config/server.properties
Agreguemos una configuración que nos permitirá eliminar los argumentos de Kafka. Agregue la siguiente línea resaltada al final del archivo:
...
group.initial.rebalance.delay.ms
delete.topic.enable = true
Guarde el archivo y salga de nano
. Ahora que ha configurado Kafka, puede crear un systemd
para que Kafka lo ejecute y lo habilite al inicio.
Paso 4: cree un archivo de unidad Systemd e inicie el servidor Kafka
En esta sección, creará un systemd
para el servicio Kafka. Esto le ayudará a realizar acciones de servicio comunes, como iniciar, detener y reiniciar Kafka de forma coherente con otros servicios de Linux.
ZooKeeper es un servicio que Kafka usa para administrar el estado y las configuraciones del clúster. Se usa comúnmente en sistemas distribuidos como un componente integral. En este tutorial, utilizará Zookeeper para gestionar estos aspectos de Kafka. Si desea obtener más información, visite los documentos oficiales de ZooKeeper.
Primero, cree el archivo de unidad para el zookeeper
del zoológico:
sudo nano /etc/systemd/system/zookeeper.service
Ingrese la siguiente definición de unidad en el archivo:
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
La [Unit]
especifica que ZooKeeper requiere conexión en red y que el sistema de archivos está listo antes de que pueda iniciarse.
La [Service]
especifica que systemd
debe usar los zookeeper-server-start.sh
y zookeeper-server-stop.sh
para iniciar y detener el servicio. También especifica que ZooKeeper debe reiniciarse automáticamente si sale de forma anormal.
A continuación, cree el archivo de servicio systemd
kafka
:
sudo nano /etc/systemd/system/kafka.service
Ingrese la siguiente definición de unidad en el archivo:
[Unit]
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
La [Unit]
especifica que este archivo de unidad depende de zookeeper.service
. Esto asegurará que zookeeper
inicie automáticamente cuando se inicie el servicio kafka
La [Service]
especifica que systemd
debe usar los kafka-server-start.sh
y kafka-server-stop.sh
para iniciar y detener el servicio. También especifica que Kafka debe reiniciarse automáticamente si sale de forma anormal.
Ahora que se han definido las unidades, inicie Kafka con el siguiente comando:
sudo systemctl start kafka
Para asegurarse de que el servidor se haya iniciado correctamente, consulte los registros de diario de la unidad kafka
sudo journalctl -u kafka
Verá un resultado similar al siguiente:
-- Logs begin at Tue 2020-03-03 19:48:52 CET, end at Tue 2020-03-03 20:51:40 CET. --
Mar 03 20:51:37 TEST-SERVER-1 systemd[1]: Started kafka.service.
Ahora tiene un servidor Kafka escuchando en el puerto 9092
, que es el puerto predeterminado para Kafka.
Inició el kafka
, pero si reiniciara su servidor, no se iniciaría automáticamente. Para habilitar kafka
al iniciar el servidor, ejecute:
sudo systemctl enable kafka
Ahora que ha iniciado y habilitado los servicios, es hora de verificar la instalación.
Paso 5: prueba la instalación
Publicamos un mensaje Hello World
para asegurarnos de que el servidor de Kafka se está comportando correctamente. La publicación de mensajes en Kafka requiere:
- Un productor, que permite la publicación de registros y datos sobre temas.
- Un consumidor, que lee mensajes y datos de temas.
Primero, cree un tema llamado TutorialTopic
escribiendo:
~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic
Puede crear un productor desde la línea de comandos utilizando el script kafka-console-producer.sh
Espere el nombre de host, el puerto y el nombre como argumento del servidor de Kafka.
Publique la cadena Hello, World
en el TutorialTopic
escribiendo:
echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
La --broker-list
determina la lista de agentes de mensajes a los que enviar el mensaje, en este caso localhost:9092
. --topic
designa el tema como TutorialTopic
.
A continuación, puede crear un consumidor de Kafka utilizando el script kafka-console-consumer.sh
Espere el nombre de host y el puerto del servidor de ZooKeeper y un nombre como argumentos.
El siguiente comando consume mensajes de TutorialTopic
. Tenga en cuenta el uso de la --from-beginning
, que permite el consumo de mensajes publicados antes de que comience el consumidor:
~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning
--bootstrap-server
proporciona una lista de entradas al clúster de Kafka. En este caso, está utilizando localhost:9092
.
Verá Hello, World
en su terminal:
Hello, World
El script seguirá ejecutándose, esperando que se publiquen más mensajes sobre el tema. Siéntase libre de abrir una nueva terminal y comenzar un productor para publicar algunos mensajes más. Debería poder verlos todos en la salida del consumidor. Si desea saber más sobre cómo usar Kafka, consulte la documentación oficial de Kafka.
Cuando finalice la prueba, presione CTRL+C
para detener la secuencia de comandos del consumidor. Ahora que ha probado la instalación, puede continuar con la instalación de KafkaT para administrar mejor su clúster de Kafka.
Paso 6: Instale KafkaT (opcional)
KafkaT es una herramienta de Airbnb que facilita la visualización de detalles sobre el clúster de Kafka y la realización de determinadas tareas administrativas desde la línea de comandos. Debido a que es una gema de Ruby, necesitará Ruby para usarla. También necesitará el build-essential
para poder construir las otras gemas de las que depende. Instálelos usando apt
:
sudo apt install ruby ruby-dev build-essential
Ahora puede instalar KafkaT usando el comando gem
sudo CFLAGS=-Wno-error=format-overflow gem install kafkat
La CFLAGS=-Wno-error=format-overflow
deshabilita las advertencias de desbordamiento de formato y es necesaria para la gema ZooKeeper, que es una dependencia de KafkaT.
KafkaT utiliza .kafkatcfg
como archivo de configuración para determinar los directorios de instalación y registro del servidor Kafka. También debe tener una entrada que indique KafkaT para la instancia de ZooKeeper.
Cree un nuevo archivo llamado .kafkatcfg
:
nano ~/.kafkatcfg
Agregue las siguientes líneas para especificar la información requerida sobre su servidor Kafka y la instancia de Zookeeper:
{
"kafka_path": "~/kafka",
"log_path": "/tmp/kafka-logs",
"zk_path": "localhost:2181"
}
Ahora está listo para usar KafkaT. Para comenzar, así es como lo usaría para ver detalles sobre todas las particiones de Kafka:
kafkat partitions
Verá el siguiente resultado:
OutputTopic Partition Leader Replicas ISRs
TutorialTopic 0 0 [0] [0]
__consumer_offsets 0 0 [0] [0]...
Esta salida muestra TutorialTopic
, así como __consumer_offsets
, un argumento interno utilizado por Kafka para almacenar información del cliente. Puede ignorar con seguridad las líneas que comienzan con __consumer_offsets
.
Para obtener más información sobre KafkaT, consulte el repositorio de GitHub.
Ahora que tiene KafkaT instalado, opcionalmente puede configurar Kafka en un clúster de servidores Debian 10 para crear un clúster de varios nodos.
Paso 7: configurar un clúster de varios nodos (opcional)
Si desea crear un clúster de agentes múltiples utilizando varios servidores Debian 10, repita los pasos 1, 4 y 5 en cada una de las nuevas máquinas. Además, realice los siguientes cambios en el ~/kafka/config/server.properties
para cada nuevo servidor:
- Cambie el valor de la
broker.id
para que sea único en todo el clúster. Esta propiedad identifica de forma única a cada servidor del clúster y puede tener cualquier cadena como valor. Por ejemplo,"server1"
,"server2"
, etc. serían útiles como identificadores. - Cambie el valor de la
zookeeper.connect
para que todos los nodos apunten a la misma instancia de ZooKeeper. Esta propiedad especifica la dirección de la instancia de ZooKeeper y sigue el formato<HOSTNAME/IP_ADDRESS>:<PORT>
. Para este tutorial, usaríayour_first_server_IP:2181
reemplazandoyour_first_server_IP
con la dirección IP del servidor Debian 10 que ya ha configurado.
Si desea tener varias instancias de ZooKeeper para el clúster, el valor de la zookeeper.connect
en cada nodo debe ser una cadena idéntica, separada por comas, que enumere las direcciones IP y los números de puerto de todas las instancias de ZooKeeper.
Nota:2181
Paso 8: restringir al usuario de Kafka
Ahora que se han completado todas las instalaciones, puede eliminar los privilegios de administrador de usuario de kafka
Antes de continuar, cierre la sesión y vuelva a iniciarla como cualquier otro usuario de sudo que no sea root. Si todavía está ejecutando la misma sesión de shell con la que comenzó este tutorial, simplemente escriba exit
.
Elimine al usuario kafka
del grupo sudo:
sudo deluser kafka sudo
Para mejorar aún más la seguridad de su servidor Kafka, bloquee la contraseña del kafka
con el comando passwd
Esto asegura que nadie pueda acceder directamente al servidor usando esta cuenta:
sudo passwd kafka -l
En este punto, solo el usuario root o sudo puede iniciar sesión como kafka
escribiendo el siguiente comando:
sudo su - kafka
En el futuro, si desea desbloquearlo, use el passwd
con la opción -u
sudo passwd kafka -u
Ahora ha restringido con éxito los privilegios de administrador del usuario de kafka
Conclusión
Apache Kafka ahora funciona de forma segura en su servidor Debian. Se puede utilizar en sus proyectos mediante la creación de Kafka productores y consumidores que utilizan los clientes Kafka, disponibles para la mayoría de los lenguajes de programación. Para obtener más información sobre Kafka, también puede consultar la documentación de Apache Kafka.