Siguiendo con la serie de posts sobre Kafka, vamos a ver cómo instalarlo en modo clúster:

  1. ¿Qué es Apache Kafka?
  2. Cómo instalar y configurar el Oracle Java Development Kit.
  3. Cómo instalar y configurar en modo clúster el Apache Zookeeper.
  4. Cómo instalar y configurar en modo clúster el Apache Kafka.
  5. Operaciones habituales en Apache Zookeeper.
  6. Operaciones habituales en Apache Kafka.
  7. Cómo monitorizar Zookeeper desde el PRTG.
  8. Cómo monitorizar Apache Kafka con el PRTG.
  9. Mejoras de rendiemiento en Apache Kafka y valores óptimos de los sensores.
  10. Problemas frecuentes en la instalación, configuración y uso de un clúster Kafka.

Todos los ficheros de configuración de esta serie de posts estan publicados en gitlab.

Hoy vamos a describir la instalación del servicio Apache Kafka en Linux®. Este servicio tiene los siguientes requisitos previos:

  1. Oracle® Java® Development Kit (versión mínima jdk1.8.0_05)
  2. El software Apache® Zookeeper funcionando en modo clúster (mínimo tres nodos)

Vamos a suponer que realizamos la instalación en tres servidores de ejemplo. Cada uno de ellos tendrá una instancia de Kafka (que actuará de Broker) y una instancia de Apache Zookeeper. El esquema que vamos a reproducir es el siguiente:

kafka

La opción que suelo usar para hacer una simple prueba es crear tres máquinas virtuales en VirtualBox. Crearé las máquinas ubnsrv01, ubnsrv02 y ubnsrv03, para seguir con la nomenclatura que usé en el post sobre la instalación de Apache Zookeeper.  Además, para nuestro ejemplo decidimos que tendremos 8 particiones por cada topic y dos réplicas (las particiones y las réplicas se explican en el post sobre qué era Apache Kafka). Por lo tanto, una posible configuración para un suepuesto topic llamado topic0 sería la siguiente.

kafka_detailed_topics

Proceso de instalación

Tengo la costumbre de crear una carpeta /install en la que dejo una copia del software que voy bajando e instalando, así que para no variar, lo haré también ahora. Para ello, realizamos los siguientes pasos desde la consola de comandos.

Primero creamos los usuarios que ejecutarán el servicio

$ useradd kafka -m

después, nos situamos en la carpeta donde decidamos bajar el software

$ cd /install

descargamos el fichero

$ wget http://mirror.cc.columbia.edu/pub/software/apache/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz

 

y lo descomprimimos, movemos la carpeta resultante al directorio /opt y asignamos como owner al usuario kafka que acabamos de crear (si el usuario kafka no puede escribir en este directorio no escribirá los logs, que por defecto los escribe aquí).

$ tar -xvzf kafka_2.11-0.10.1.1.tgz
$ mv kafka_2.11-0.10.1.1 /opt
$ chown kafka:kafka /opt/kafka_2.11-0.10.1.1 -R

Creamos un link a la carpeta movida

$ ln -s /opt/kafka_2.11-0.10.1.1 /opt/kafka

Y finalmente creamos la carpeta que almacenará los datos del servicio y asignamos la propiedad al usuario kafka.

$ mkdir /data/kafka
$ chown kafka:kafka /data/kafka -R

Estos pasos hay que hacerlos en los tres servidores, evidentemente. Para estas tareas repetitivas yo siempre uso el clusterssh. En un futuro post explicaré cómo instalarlo y configurarlo, pero la verdad es que es una de las herramientas que más uso al día y me ahorra mucho trabajo.

Ahora tenemos que configurar las tres instancias.

Configuración

Ahora sólo falta configurar el servicio para que use las carpetas y los usuarios creados, además de configurar el fichero unit para systemd. Primero vamos con la configuración del servicio. Hacemos una copia del fichero /opt/kafka/config/server.properties

$ cp /opt/kafka/config/server.properties /opt/kafka/config/server.properties_default

Editamos el fichero de configuración /opt/kafka/config/server.properties con el editor de textos preferido y modificamos las siguientes opciones.

# Tenemos que asignar un identificador único a cada nodo dentro del clúster
broker.id=1 

# Asignamos el directorio de datos que hemos creado anteriormente
log.dirs=/data/kafka

# Establecemos el número de particiones de los topics por defecto
num.partitions=8

# Indicamos qué servidores zookeeper son los responsables del 
# mantenimiento del clúster 
zookeeper.connect=ubnsrv01:2181, ubnsrv02:2181, ubnsrv03:2181

# Indicamos que se pueden eliminar los topics
delete.topic.enable=true

# Configuramos las opciones de replicación por defecto
replication.factor = 2
num.replica.fetchers=3
offsets.topic.replication.factor=2
num.standby.replicas=2

OPCIONAL : Con los ficheros de configuración preparados, podemos modificar el script de inicio de Kafka si queremos usarlo con soporte paraJMX (necesario, por ejemplo, si queremos usar KafkaManager para monitorizar Kafka). Para ello tenemos que hacer lo siguiente. Editamos el fichero /opt/kafka/bin/kafka-server-start.sh y comentamos la siguiente línea.

#EXTRA_ARGS=${EXTRA_ARGS-'-name kafkaServer -loggc'}

Y añadimos la siguiente:

EXTRA_ARGS="-name kafkaServer -loggc -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false"

Ahora sólo nos queda dar de alta los servicios en el systemd. Personalmente no me gusta crear estos ficheros en el directorio /etc/systemd/system, y en su lugar prefiero crearlos en el directorio /lib/systemd/system/ y después crear un link a estos en /etc/systemd/system, y evitar problemas con SELinux. Así que creamos el fichero /lib/systemd/system/kafka.service y copiamos el siguiente contenido (evidentemente las rutas sólo son válidas si se ha seguido el procedimiento descrito anteriormente).

[Unit]
Description=Apache Kafka server (broker)
Documentation=http://kafka.apache.org/documentation.html
Requires=network.target remote-fs.target
Before=zookeeper.service
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
Group=kafka
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target

Guardamos el fichero, creamos el enlace simbólico y lo habilitamos con

$ ln -s /lib/systemd/system/kafka.service /etc/systemd/system/kafka.service 
$ systemctl daemon-reload
$ systemctl enable kafka.service

Ahora sencillamente podemos iniciar el servicio en los tres servidores y listos

$ service kafka start|stop|restart|status

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s