Tutorial

Cómo instalar Apache Kafka en Debian 10

ApacheMessagingDebian 10

El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.

Introducción

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.

Requisitos previos

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.

Paso 1: Creación de un usuario para Kafka

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.

Paso 2: Descarga y extracción de archivos 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.

Paso 3: Configuración del servidor de Kafka

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:

~/kafka/config/server.properties
...
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.

Paso 4: Creación de archivos de unidad systemd e inicio del servidor de Kafka

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:

/etc/systemd/system/zookeeper.service
[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:

/etc/systemd/system/kafka.service
[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:

Output
Mar 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.

Paso 5: Pruebas de 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:

  • Un productor que permita la publicación de registros y datos en temas.
  • Un consumidor que lea 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 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:

Output
Hello, 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.

Paso 6: Instalar KafkaT (opcional)

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:

~/.kafkatcfg
{
  "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:

Output
Topic 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.

Paso 7: Configuración de un clúster multinodo (opcional)

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.

Paso 8: Restricción del usuario de Kafka

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.

Conclusión

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.

0 Comments

Creative Commons License