Siguiendo con la serie de posts sobre Kafka, vamos a ver cómo instalar zookeeper en modo clúster, que es prerequisito para Kafka :

  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 veremos cómo instalar y configurar un clúster de Zookeeper. Como vimos en este post, Zookeeper ofrece un servicio para la coordinación de procesos distribuidos altamente confiable que da soluciones a varios problemas de coordinación para grandes sistemas distribuidos. Entre los servicios que proporciona Zookeeper podemos destacar los siguientes,

  • Compartir configuraciones comunes (podría verse como un sistema de almacenamiento key/value distribuido).
  • Administrar la pertenencia o no al clúster (por ejemplo, ver qué brokers están conectados al clúster y cuáles no).
  • Ayuda en las elecciones (servicios de Quorum).
  • Compartir locks del sistema.

El proceso de instalación de Apache Zookeeper consta de los siguientes pasos.

  1. Instalación del Oracle Java Development Kit.
  2. Bajar el software de la web de apache.
  3. Preparar los directorios de logs y datos.
  4. Preparar los scripts de inicio automático del servicio (usaremos systemd)

Montaremos un clúster con 3 máquinas virtuales (ubnsrv01ubnsrv02ubnsrv03) cada una de las cuáles tendrá instalado el Ubuntu Server. La idea es que una vez montado y configurado, los brokers, consumers y producers de kafka puedan usar el clúster de zookeeper para su funcionamiento. Por lo tanto, la arquitectura final que buscamos es la siguiente:

how-to-monitor-kafka-diagram2

En este post que no tenía mucho que ver con la temática del blog ya expliqué cómo realizar la instalación del JDK. Hay otras formas de hacerlo, via apt-get, por ejemplo, pero la forma en la que nosotros lo hacemos generalmente es esta, por diferentes motivos que seguramente algún dia explicaré. Si seguimos las instrucciones del post, podemos pasar directamente al punto 2. Para bajar el software, nosotros siempre optamos por bajarlo a una carpeta llamada /install, y en esta carpeta siempre guardamos una copia del software instalado en el equipo, pero eso también son manías personales. Sencillamente podemos hacer lo siguiente.

$ cd /install
$ wget http://apache.uvigo.es/zookeeper/zookeeper- 3.4.9/zookeeper-3.4.9.tar.gz

Hay muchos mirrors desde los que podemos bajar el software. Hemos elegido el de la Universidad de Vigo porque el mirror de rediris parece estar temporalmente caído. Descomprimimos el fichero y movemos la carpeta resultante al directorio /opt (si bien se puede instalar en cualquier otra ubicación, la recomendación es usar este directorio)

$ tar -xvf zookeeper-3.4.9.tar.gz
$ mv zookeeper-3.4.9 /opt

Creamos un link a la carpeta movida

$ ln -s /opt/zookeeper-3.4.9 /opt/zookeeper

Creamos el usuario que ejecutará el servicio (al ejecutarse como daemon no será necesario asignar un password al usuario)

$ useradd zookeeper -m

Creamos la carpeta que almacenará los datos y logs del servicio y asignamos la propiedad al usuario zookeeper.

$ mkdir /data/zookeeper
$ chown zookeeper:zookeeper /data/zookeeper -R
$ mkdir /var/log/zookeeper
$ chown zookeeper:zookeeper /var/log/zookeeper -R

Hemos elegido /data/zookeeper para los datos y /var/log/zookeeper para los logs, pero se puede elegir la ruta que se prefiera, evidentemente. Este proceso hay que repetirlo en los tres servidores que formarán parte de clúster.

Ya tenemos el software bajado y las carpetas preparadas. Ahora tenemos que modificar los ficheros de configuración para hacer que los diferentes procesos trabajen en forma de clúster en lugar de hacerlo de forma independiente los unos de los otros.

Hacemos una copia del fichero /opt/zookeeper/conf/zoo_sample.cfg, que usaremos para configurar el sistema.

$ cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg

Editamos el fichero de configuración /opt/zookeeper/conf/zoo.cfg que acabamos de crear con el editor de textos preferido y modificamos las siguientes opciones.

dataDir=/data/zookeeper
# specify all zookeeper servers
# The fist port is used by followers to connect to the leader
# The second one is used for leader election
server.1=ubnsrv01:2888:3888
server.2=ubnsrv02:2888:3888
server.3=ubnsrv03:2888:3888

Lo que hacemos primero es indicar dónde se almacenarán los datos de zookeeper (opción dataDir). Posteriormente indicamos cuáles serán los nodos que formarán parte del clúster. En este caso, nuestras tres máquinas virtuales. Evidentemente, los nombre de máquina tienen que resolver correctamente a su correspondiente IP. También existe la posibilidad de indicar la dirección IP en lugar del nombre de máquina. Después del nombre de máquina debemos indicar qué puertos se usarán para la conexión de los followers al leader, y el puerto que se usará para la elección del leader. Aquí he dejado los puertos que usa zookeeper por defecto. Los conceptos de follower y leader se usan en ZAB (Zookeeper’s Atomic Broadcast), el protocolo que usa Zookeeper para la realización del Quorum, entre otras funciones, es decir, puede verse como una implementación alternativa/complementaria a Paxos o Raft. Qué es exactamente ZAB y cuáles son las diferencias entre Paxos, ZAB y/o Raft están fuera del alcance de este documento, pero pueden consultarse aquí, aquí o aquí.

Con el fichero de configuración listo, sólo nos queda crear el fichero con el identificador numérico del nodo en cuestión. Para ello creamos un fichero llamado /opt/zookeeper/conf/myid cuyo único contenido tiene que ser el identificador del servidor dentro del cluster y creamos un enlace dentro de la carpeta de datos del servicio. Por ejemplo, para nuestro caso particular, y como los nombre de los servidores son ubnsrv01ubnsrv02ubnsrv03 crearemos en cada uno de ellos el fichero /opt/zookeeper/conf/myid con el contenido ‘1’ en el servidor ubnsrv01, el contenido ‘2’ en el servidor ubnsrv02 y el contenido ‘3’ en el servidor ubnsrv03 (los identificadores deben ser numéricos, y el contenido va sin las comillas).

$ echo “1” > /opt/zookeeper/conf/myid
$ ln -s /opt/zookeeper/conf/myid /data/zookeeper/myid

Con el fichero identificador creado en los tres servidores sólo nos queda crear los ficheros Unit para que se inicien los ficheros con systemd. Para ello, creamos el fichero /etc/systemd/system/zookeeper.service con el siguiente contenido.

[Unit]
Description=Zookeeper
Before=
After=network.target

[Service]
Type=forking
User=zookeeper
Environment=ZOO_LOG_DIR=/var/log/zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start
Restart=on-abort

[Install]
WantedBy=multi-user.target

El contenido de los ficheros Unit y el funcionamiento de systemd está fuera del alcance de este post, pero se puede consultar aquí.

Ahora sencillamente tenemos que activar el servicio, y listos. Para ello, realizamos lo siguiente,

$ sudo systemctl enable zookeeper.service
$ sudo systemctl daemon-reload

Ahora podemos iniciar el servicio en todos los servidores, y si no hemos (en realidad he) cometido ningún error, deberíamos tener nuestro clúster en funcionamiento.

$ service zookeeper start|stop|restart|status
 Et volià, clúster funcionando.
zoo_service
 De todas formas, aquí vemos que los tres servicios están levantados, pero no tenemos indicación alguna de que en realidad esto se esté comportando como un clúster. La forma más sencilla de comprobarlo es mediante la utilización de las four letters words. Las four letter words son sencillamente instrucciones de 4 letras con los que nos podemos comunicar con Zookeeper . Por ejemplo, si hacemos un simple telnet a cualquiera de los tres servidores al puerto por defecto del Zookeeper (2181) y escribimos alguna de las palabras de 4 letras, Zookeeper nos devolverá la información correspondiente a ese comando y posteriormente cerrará la conexión. Un ejemplo de instrucción es ruok (are you ok?), a la cuál el Zookeeper debería responder con un Imok. Ejemplo:
ubnsrv01:~# telnet ubnsrv01 2181
Trying ::1...
Connected to ubnsrv01.
Escape character is '^]'.
ruok
imokConnection closed by foreign host.
ubnsrv01:~#
Una de las instrucciones que podemos ejecutar es srvr. Esta instrucción nos da información detallada del servidor en particular al que estamos conectados. Si ejecutamos este comando en los tres servidores, veremos como tenemos dos nodos que están en estado follower mientras que sólo tenemos uno en estado leader, en nuestro caso el servidor ubnsrv01.
ubnsrv01:~# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Latency min/avg/max: 0/0/424
Received: 106134
Sent: 107871
Connections: 3
Outstanding: 0
Zxid: 0xf0000077f
Mode: leader
Node count: 186
Connection closed by foreign host.
ubnsrv01:~#

ubnsrv02:~# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Latency min/avg/max: 0/0/424
Received: 106134
Sent: 107871
Connections: 3
Outstanding: 0
Zxid: 0xf0000077f
Mode: follower
Node count: 186
Connection closed by foreign host.
ubnsrv02:~#

ubnsrv03:~# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Latency min/avg/max: 0/0/424
Received: 106134
Sent: 107871
Connections: 3
Outstanding: 0
Zxid: 0xf0000077f
Mode: follower
Node count: 186
Connection closed by foreign host.
ubnsrv03:~#
Si bien esta puede no ser la forma más práctica para monitorizar el Zookeeper, sí que creo que es la más sencilla. En posteriores posts veremos cómo monitorizar Zookeeper con PRTG, por ejemplo.

 

 

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