El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.
Apache Kafka es un popular intermediario de mensajes distribuidos diseñado para gestionar grandes volúmenes de datos en tiempo real. Un clúster de Kafka es muy escalable y tolerante a fallos, y también tiene una capacidad mucho mayor en comparación con otros intermediarios de mensajes, como ActiveMQ y RabbitMQ. Aunque se utiliza generalmente como un sistema de mensajería de publicación y subscripción, muchas organizaciones también lo utilizan para la agregación de registros debido a que ofrece almacenamiento persistente para mensajes publicados.
Un sistema de mensajería de publicación y subscripción permite a uno o más productores publicar mensajes sin tener en cuenta el número de consumidores ni la forma en que procesarán los mensajes. Los clientes suscritos reciben una notificación automática sobre las actualizaciones y la creación de nuevos mensajes. Este sistema es más eficaz y escalable que sistemas en los cuales los clientes de tanto en tanto averiguan si hay nuevos mensajes disponibles.
A través de este tutorial, instalará y configurará Apache Kafka 2.1.1 de forma segura en un servidor de Debian 10 y luego probará su configuración produciendo y consumiendo un mensaje Hello World
. Luego instalará de forma opcional KafkaT para controlar Kafka y configurar un clúster con varios nodos de Kafka.
Para continuar, necesitará lo siguiente:
Nota: En instalaciones que no cuenten con 4 GB de RAM, el servicio de Kafka puede fallar; la máquina virtual Java (JVM) puede mostrar una excepción de Out Of Memory
durante el inicio.
Debido a que Kafka puede manejar solicitudes a través de una red, una práctica recomendada es crear un usuario específico para ello. Esto minimiza los daños a su máquina de Debian en caso de que el servidor de Kafka se vea comprometido. Debe crear el usuario específico kafka en este paso.
Tras iniciar sesión como usuario sudo no root, cree un usuario llamado kafka
con el comando de useradd
:
- sudo useradd kafka -m
El indicador -m
garantiza que se cree un directorio de inicio para el usuario. Este directorio de inicio, /home/kafka
, actuará como su directorio de espacio de trabajo para ejecutar comandos más adelante.
Establezca la contraseña usando passwd
:
- sudo passwd kafka
Introduzca la contraseña que desea usar para este usuario.
A continuación, añada el usuario kafka al grupo sudo
con el comando adduser
, de modo que tenga los privilegios necesarios para instalar las dependencias de Kafka.
- sudo adduser kafka sudo
Con esto, su usuario kafka estará listo. Inicie sesión en esta cuenta usando su
:
- su -l kafka
Ahora que ha creado el usuario específico de Kafka, puede descargar y extraer los binarios de Kafka.
En este paso, descargará los archivos binarios de Kafka y extráigalos en carpetas específicas del directorio de inicio de su usuario kafka.
Para comenzar, cree un directorio en /home/kafka
llamado Downloads
para almacenar sus descargas:
- mkdir ~/Downloads
A continuación, instale curl
usando apt-get
para poder 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
esté instalado, úselo 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 ábralo. Este será el directorio de base de la instalación de Kafka:
- mkdir ~/kafka && cd ~/kafka
Extraiga el archivo que descargó usando el comando tar
:
- tar -xvzf ~/Downloads/kafka.tgz --strip 1
Especificó el indicador --strip 1
para garantizar que el contenido del archivo se extraiga en ~/kafka/
en sí y no en otro directorio dentro de este, como ~/kafka/kafka_2.12-2.1.1/
.
Ahora que descargó y extrajo los binarios con éxito, podrá configurar Kafka para permitir la eliminación de temas.
El comportamiento predeterminado de Kafka no nos permitirá eliminar un tema, la categoría, el grupo ni el nombre del feed en el cual pueden publicarse los mensajes. Para modificar esto, debe 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 permita eliminar temas de Kafka. Añada la siguiente línea destacada a la parte inferior del archivo:
...
group.initial.rebalance.delay.ms
delete.topic.enable = true
Guarde el archivo y cierre nano
. Ahora que configuró Kafka, puede crear archivos de unidad systemd
para ejecutar y habilitar Kafka al inicio.
En esta sección, creará archivos de unidad systemd
para el servicio de Kafka. Esto le permitirá realizar acciones de servicio comunes, como iniciar, detener y reiniciar Kafka con un método compatible con otros servicios de Linux.
ZooKeeper es un servicio que Kafka usa para administrar su estado de clúster y sus configuraciones. Se utiliza comúnmente en sistemas distribuidos como componente integral. En este tutorial, usará Zookeeper para administrar estos aspectos de Kafka. Si desea obtener más información sobre él, consulte los documentos oficiales de Zookeeper.
Primero, cree el archivo de unidad para zookeeper
:
- sudo nano /etc/systemd/system/zookeeper.service
Introduzca 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
En la sección [Unit]
, se especifica que para el inicio de Zookeeper la interconexión y el sistema de archivos deben estar listos.
En la sección [Service]
se especifica que systemd
debe usar los archivos de shell `zookeeper-server-start.sh y zookeeper-server-stop.sh``` para iniciar y detener el servicio. También se especifica que Zookeeper debe reiniciarse automáticamente si no se cierra de forma normal.
A continuación, cree el archivo de servicio de systemd
para kafka:
- sudo nano /etc/systemd/system/kafka.service
Introduzca 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
En la sección [Unit]
se especifica que este archivo de unidad depende de zookeeper.service
. Esto garantizará que zookeeper
se inicie de forma automática al iniciarse el servicio Kafka
.
En la sección [Service]
se especifica que systemd
debe usar los archivos `de shell kafka-server-start.sh y kafka-server-stop.sh``` para iniciar y detener el servicio. También se especifica que Kafka debe reiniciarse de automáticamente si se cierra de forma anormal.
Ahora que se definieron las unidades, inicie Kafka con el siguiente comando:
- sudo systemctl start kafka
Para asegurarse de que el servidor se haya iniciado de forma correcta, consulte los registros de diario para la unidad kafka
:
- sudo journalctl -u kafka
Verá resultados similares al siguiente:
OutputMar 23 13:31:48 kafka systemd[1]: Started kafka.service.
Ahora tiene un servidor de Kafka que escucha en el puerto 9092
, que es el predeterminado para Kafka.
Inició el servicio kafka
. Sin embargo, si reinicia su servidor no se iniciará automáticamente. Para habilitar kafka
en el arranque del servidor, ejecute lo siguiente:
- sudo systemctl enable kafka
Ahora que inició y habilitó los servicios, es hora de verificar la instalación.
Publicaremos y consumiremos un mensaje Hello World
para asegurarnos de que el comportamiento del servidor de Kafka sea correcto. Para publicar mensajes en Kafka es necesario lo siguiente:
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 comando usando la secuencia de comandos kafka-console-producer.sh
. Se necesitan el nombre de host y el puerto del servidor de Kafka, y un nombre de tema como argumentos.
Publique la cadena Hello, World
en el tema TutorialTopic
escribiendo lo siguiente:
- echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
El indicador --broker-list
determina la lista de intermediarios de mensajes a los que se enviará el mensaje (en este caso, localhost:9092
). --topic
designa el tema como TutorialTopic
.
A continuación, puede crear un consumidor de Kafka usando la secuencia de comandos kafka-console-consumer.sh
. Como argumentos, se necesitan el nombre de host y puerto del servidor de ZooKeeper, y un nombre de tema.
El siguiente comando consume mensajes de TutorialTopic
. Tenga en cuenta el uso del indicador de --from-beginning
, que permite el consumo de mensajes publicados antes de iniciar el consumidor:
- ~/kafka/bin/kafka-console-consumer.sh --bootstrap-server `localhost:9092` --topic TutorialTopic --from-beginning
--bootstrap-server
ofrece una lista de las entradas en el clúster Kafka. En este caso, utiliza localhost:9092
.
Verá Hello, World
en su terminal:
OutputHello, World
La secuencia de comandos continuará ejecutándose y esperando que se publiquen más mensajes en el tema. Siéntase libre de abrir un terminal nuevo e iniciar un productor para publicar algunos mensajes más. Debería poder verlos a todos en el resultado del consumidor. Si desea obtener más información sobre cómo usar Kafka, consulte la documentación oficial de Kafka.
Cuando termine de realizar pruebas, presione CTRL+C
para detener la secuencia de comandos de consumidor. Ahora que probó la instalación, puede instalar KafkaT para administrar mejor su clúster de Kafka.
KafkaT es una herramienta de Airbnb que le permite ver fácilmente detalles sobre su clúster Kafka y realizar algunas tareas administrativas desde la línea de comandos. Debido a que es un gem joya de Ruby, necesitará Ruby para usarlo. También necesitará el paquete build-essential
para poder compilar otros gem de los que depende. Realice la instalación usando apt
:
- sudo apt install ruby ruby-dev build-essential
Ahora podrá instalar KafkaT usando el comando gem:
- sudo CFLAGS=-Wno-error=format-overflow gem install kafkat
La opción CFLAGS=-Wno-error=format-overflow
deshabilita las advertencias de sobreflujo de formato y es necesaria para la gema de ZooKeeper, que es una dependencia de KafkaT.
KafkaT utiliza .kafkatcfg
como archivo de configuración para determinar los directorios de instalación y registro de su servidor de Kafka. También debe tener una entrada que apunte a KafkaT en su 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 de Kafka y su instancia de Zookeeper:
{
"kafka_path": "~/kafka",
"log_path": "/tmp/kafka-logs",
"zk_path": "localhost:2181"
}
Con esto, estará listo para usar KafkaT. Para comenzar, esta es la forma en que lo utilizaría para ver información sobre todas las particiones de Kafka:
- kafkat partitions
Verá lo siguiente:
OutputTopic Partition Leader Replicas ISRs
TutorialTopic 0 0 [0] [0]
__consumer_offsets 0 0 [0] [0]
...
En este resultado se muestran TutorialTopic
y __consumer_offsets
, un tema interno que Kafka usa para almacenar información relacionada con el cliente. Puede ignorar líneas de forma segura comenzando con __consumer_offsets
.
Para obtener más información sobre KafkaT, consulte su repositorio de GitHub.
Ahora que instaló KafkaT, puede configurar de forma opcional Kafka en un clúster de servidores de Debian 10 para crear un clúster de varios nodos.
Si desea crear un clúster de varios gestores usando más servidores de Debian 10, repita los pasos 1, 4 y 5 en cada una de las máquinas nuevas. Además, realice los siguientes cambios en el archivo ~/kafka/config/server.properties
para cada uno:
Cambie el valor de la propiedad broker.id
para que sea único en todo el clúster. Esta propiedad identifica de forma única cada servidor en el clúster y puede tener cualquier cadena como valor. Por ejemplo, "server1"
y "server2"
, entre otros, serían identificadores útiles.
Cambie el valor de la propiedad de 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, utilizaría your_first_server_IP:2181
, sustituyendo your_first_server_IP
con la dirección IP del servidor de Debian 10 que ya configuró.
Si desea tener varias instancias de ZooKeeper para su clúster, el valor de la propiedad zookeeper.connect
de cada nodo debe ser una cadena idéntica y separada por comas que enumere las direcciones IP y los números de puerto de todas las instancias de ZooKeeper.
Nota: Si hay un firewall activo en el servidor de Debian 10 con Zookeeper instalado, asegúrese de abrir el puerto 2181
para permitir solicitudes entrantes de los otros nodos del clúster.
Ahora que todas las instalaciones están listas, puede eliminar los privilegios de administración del usuario kafka.
Antes de hacerlo, cierre sesión y vuelva a iniciarla como cualquier otro usuario sudo no root. Si aún ejecuta la misma sesión de shell con la que inició este tutorial , simplemente escriba exit
.
Elimine el usuario kafka
del grupo sudo:
- sudo deluser kafka sudo
Para mejorar aún más la seguridad de su servidor, bloquee la contraseña del usuario kafka
usando el comando passwd
. Esto garantiza que nadie pueda iniciar sesión directamente en el servidor usando esta cuenta:
- sudo passwd kafka -l
En este momento, solo un usuario root o sudo puede iniciar sesión como kafka
escribiendo el siguiente comando:
- sudo su - kafka
Si desea desbloquearlo posteriormente, utilice passwd
con la opción -u
:
- sudo passwd kafka -u
De esta manera, ha restringido con éxito los privilegios de administrador del usuario kafka
.
Ahora, tendrá Apache Kafka activo de forma segura en su servidor de Debian. Puede usarlo en sus proyectos creando productores y consumidores de Kafka usando clientes de Kafka, que están 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 sobre Apache Kafka.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!