Tutorial

Cómo instalar Apache Kafka en Ubuntu 18.04

UbuntuApacheMessagingJavaUbuntu 18.04

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

Introducción

Apache Kafka es un intermediario de mensajes de distribución popular diseñado para gestionar de manera eficaz grandes volúmenes de datos en tiempo real. Un clúster Kafka no solo es escalable y tolerante a fallas, sino también tiene un rendimiento mucho más alto 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.

En este tutorial, instalará y usará Apache Kafka 2.1.1 en Ubuntu 18.04.

Requisitos previos

Para continuar, necesitará lo siguiente:

  • Un servidor Ubuntu 18.04 y un usuario no root con privilegios sudo. Siga los pasos especificados en esta guía si no dispone de un usuario no root configurado.
  • Al menos 4 GB de RAM en el servidor. En instalaciones que no cuenten con esta cantidad de RAM, el servicio de Kafka puede fallar; la máquina virtual Java (JVM) muestra una excepción de “memoria insuficiente” durante el inicio.
  • OpenJDK 8 instalado en su servidor. Para instalar esta versión, siga estas instrucciones sobre la instalación de versiones específicas de OpenJDK. Kafka está escrito en Java, de forma que requiere una JVM; sin embargo, el script de su shell de arranque tiene un error de detección de versión que le impide iniciarse con las versiones de JVM posteriores a la 8.

Paso 1: Creación de un usuario para Kafka

Dado que Kafka puede gestionar las solicitudes a través de una red, debería crear un usuario dedicado para ella. Esto minimizará el daño al que se exponga su máquina con Ubuntu si el servidor Kafka se ve comprometido. En este paso, crearemos un usuario kafka dedicado. Sin embargo, debería crear un usuario no root diferente para realizar otras tareas en este servidor una vez que termine de configurar Kafka.

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 nuestro directorio de espacios de trabajo para ejecutar comandos en las secciones que se muestran a continuación.

Establezca la contraseña usando passwd:

  • sudo passwd kafka

Añada el usuario kafka al grupo sudo con el comando adduser, de manera 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 creamos el usuario específico de Kafka, podemos descargar y extraer los archivos binarios de Kafka.

Paso 2: Descarga y extracción de archivos binarios de Kafka

Procederemos a descargar los archivos binarios de Kafka y extraerlos en carpetas dedicadas, en el directorio de inicio de nuestro usuario kafka.

Para comenzar, cree un directorio en /home/kafka llamado Downloads para almacenar sus descargas:

  • mkdir ~/Downloads

Utilice curl para descargar los archivos binarios de Kafka:

  • curl "https://www.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

Especificamos el indicador --strip 1 para asegurarnos de que los contenidos del archivo se extraigan en ~/kafka/ y no en otro directorio (como ~/kafka/kafka_2.11-2.1.1/) dentro de él.

Ahora que descargamos y extrajimos los archivos binarios de forma correcta, podemos proceder con la configuración de 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, editemos 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 lo siguiente a la parte inferior del archivo:

~/kafka/config/server.properties
delete.topic.enable = true

Guarde el archivo y cierre nano. Ahora que configuramos Kafka, podemos crear archivos de unidad systemd para ejecutarlo y habilitarlo en el inicio.

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

En esta sección, crearemos archivos de unidad systemd para el servicio Kafka. Esto nos ayudará a 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 utiliza Kafka para administrar el estado de sus clústeres y sus configuraciones. Se utiliza comúnmente en muchos sistemas distribuidos como componente integral. Si desea obtener más información más sobre él, consulte los documentos oficiales de Zookeeper.

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 sistemd 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 se cierra de forma anormal.

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

El resultado debe ser similar al siguiente:

Output
Jul 17 18:38:59 kafka-ubuntu systemd[1]: Started kafka.service.

Ahora tiene un servidor Kafka que escucha en el puerto 9092.

Aunque iniciamos el servicio kafka, si reiniciáramos nuestro servidor este no se iniciaría de forma automática. Para habilitar kafka en el arranque del servidor, ejecute lo siguiente:

  • sudo systemctl enable kafka

Ahora que iniciamos y habilitamos los servicios, revisemos la instalación.

Paso 5: Pruebas de instalación

Publicaremos y consumiremos un mensaje “Hello World” para asegurarnos de que el comportamiento del servidor 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 el script 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

A continuación, puede crear un consumidor de Kafka usando el script 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

Si no hay problemas de configuración, verá Hello, World en su terminal:

Output
Hello, World

El script continuará ejecutándose y esperando a 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.

Cuando termine de realizar pruebas, presione CTRL+C para detener el script de consumidor. Ahora que probamos la instalación, procederemos a instalar KafkaT.

Paso 6: Instalación de 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 gem install 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] ... ...

Verá TutorialTopic, así como __consumer_offsets, un tema interno que Kafka utiliza 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.

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

Si desea crear un clúster multibroker usando más máquinas Ubuntu 18.04, debe repetir los pasos 1, 4 y 5 en cada una de los nuevas máquinas. Además, debe realizar los siguientes cambios en el archivo server.properties para cada una:

  • El valor de la propiedad broker.id debe cambiarse de modo 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”, “server2”, etc.

  • El valor de la propiedad de zookeeper.connect debe cambiarse de forma que todos los nodos apunten a la misma instancia de ZooKeeper. Esta propiedad especifica la dirección de la instancia de Zookeeper y sigue formato :<PORT>. Por ejemplo, "203.0.113.0:2181", "203.0.113.1:2181", etc.

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.

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

Con esto, ha logrado hacer funcionar Apache Kafka de forma segura en su servidor Ubuntu. 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 este.

0 Comments

Creative Commons License