Siguiendo con la serie de posts sobre Kafka, vamos a ver cómo instalar zookeeper en modo clúster, que es prerequisito para Kafka :
- ¿Qué es Apache Kafka?
- Cómo instalar y configurar el Oracle Java Development Kit.
- Cómo instalar y configurar en modo clúster el Apache Zookeeper.
- Cómo instalar y configurar en modo clúster el Apache Kafka.
- Operaciones habituales en Apache Zookeeper.
- Operaciones habituales en Apache Kafka.
- Cómo monitorizar Zookeeper desde el PRTG.
- Cómo monitorizar Apache Kafka con el PRTG.
- Mejoras de rendiemiento en Apache Kafka y valores óptimos de los sensores.
- 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.
- Instalación del Oracle Java Development Kit.
- Bajar el software de la web de apache.
- Preparar los directorios de logs y datos.
- Preparar los scripts de inicio automático del servicio (usaremos systemd)
Montaremos un clúster con 3 máquinas virtuales (ubnsrv01, ubnsrv02 y ubnsrv03) 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:
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 ubnsrv01, ubnsrv02 y ubnsrv03 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

ubnsrv01:~# telnet ubnsrv01 2181 Trying ::1... Connected to ubnsrv01. Escape character is '^]'. ruok imokConnection closed by foreign host. 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:~#