Cómo instalar y configurar un clúster ZooKeeper de un solo nodo en Ubuntu 18.04

Introducción breve
Apache ZooKeeper es un servicio centralizado de código abierto para gestionar información de configuración, nombrado, sincronización distribuida y servicios de grupo. Está escrito en Java y ofrece alta disponibilidad mediante servicios redundantes. ZooKeeper usa un espacio de nombres jerárquico de nodos (Znodes) para coordinar procesos distribuidos y está diseñado para almacenar estados, configuraciones e información de localización con baja latencia y control de acceso.
Importante: esta guía instala un clúster de un solo nodo para pruebas y desarrollo. Para producción, use un clúster multinodo con al menos tres nodos.
Variantes de búsqueda (intención principal y sinónimos)
- Instalar ZooKeeper en Ubuntu 18.04
- Configurar ZooKeeper single-node
- ZooKeeper tutorial Ubuntu
- ZooKeeper systemd service
- ZooKeeper Java instalación
Requisitos
- Un servidor con Ubuntu 18.04.
- Contraseña de root configurada (o acceso sudo desde un usuario con privilegios).
- Conexión a Internet para descargar paquetes y archivos.
1. Actualizar el sistema
Actualiza la lista de paquetes y aplica actualizaciones:
apt-get update -y
apt-get upgrade -y
Reinicia el servidor si el kernel u otros componentes críticos se han actualizado.
2. Instalar Java
ZooKeeper requiere Java. Añade el PPA y instala Oracle Java 11 (método mostrado tal como en el origen):
add-apt-repository ppa:linuxuprising/java
apt-get update -y
apt-get install oracle-java11-set-default
Verifica la versión de Java instalada:
java --version
Salida esperada (ejemplo):
java 11.0.2 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+7-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+7-LTS, mixed mode)
Nota: también puede usar OpenJDK 11 si prefiere paquetes libres: apt-get install openjdk-11-jdk
.
3. Crear el usuario ZooKeeper
Crea un usuario sin privilegios para ejecutar el servicio:
useradd zookeeper -m
usermod --shell /bin/bash zookeeper
passwd zookeeper
usermod -aG sudo zookeeper
Esto crea la cuenta, asigna una shell y le añade al grupo sudo si necesita privilegios administrados.
4. Instalar ZooKeeper
Crea el directorio de datos y asigna permisos:
mkdir -p /data/zookeeper
chown -R zookeeper:zookeeper /data/zookeeper
Descarga y extrae la versión de ZooKeeper (ejemplo: 3.4.9 en el archivo original):
cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
tar -xvzf zookeeper-3.4.9.tar.gz
mv zookeeper-3.4.9 zookeeper
chown -R zookeeper:zookeeper /opt/zookeeper
Nota: revise la página oficial de Apache para obtener la versión más reciente y considere usar versiones LTS o la rama 3.5/3.6+ si su entorno requiere características más modernas.
5. Configurar ZooKeeper
Crea el archivo de configuración principal:
nano /opt/zookeeper/conf/zoo.cfg
Añada las siguientes líneas:
tickTime=2500
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=80
Guarde y cierre el archivo. Las claves más relevantes:
- tickTime: unidad de tiempo (ms) usada para latidos y elecciones.
- dataDir: ruta donde ZooKeeper almacena su estado.
- clientPort: puerto por defecto 2181.
Inicie ZooKeeper manualmente para probar:
cd /opt/zookeeper
bin/zkServer.sh start
Salida esperada:
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
Conéctese con el cliente local:
bin/zkCli.sh -server 127.0.0.1:2181
Debería ver el prompt del cliente:
[zk: 127.0.0.1:2181(CONNECTED) 1]
Escriba help
para ver comandos útiles (ls, get, create, set, delete, etc.). Salga con quit
.
Para detener el servidor manualmente:
bin/zkServer.sh stop
6. Crear un servicio systemd para ZooKeeper
Cree el archivo de unidad systemd:
nano /etc/systemd/system/zookeeper.service
Pegue el contenido siguiente:
[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zookeeper
Group=zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure
[Install]
WantedBy=default.target
Recargue systemd, inicie y habilite el servicio:
systemctl daemon-reload
systemctl start zookeeper
systemctl enable zookeeper
systemctl status zookeeper
Salida esperada (fragmento):
Active: active (running) since ...
Starting Zookeeper Daemon...
Using config: /opt/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED
Comprobaciones rápidas y comandos útiles (cheat sheet)
- Reiniciar servicio:
systemctl restart zookeeper
- Logs (si usa stdout por el script):
journalctl -u zookeeper -f
- Cliente local:
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
- Directorio de datos por defecto:
/data/zookeeper
- Puerto cliente por defecto:
2181
Criterios de aceptación (pruebas básicas)
- El servicio systemd está activo:
systemctl is-active zookeeper
->active
. zkCli.sh
puede conectarse y mostrar prompt conectado.- Se puede crear un znode:
create /test "hello"
y leerlo conget /test
. - El proceso Java aparece en
ps aux | grep zookeeper
.
Seguridad y endurecimiento
- No exponga el puerto 2181 directamente a Internet. Use firewalls (ufw/iptables) y redes privadas.
- Habilite autenticación SASL/ACLs en entornos de producción para controlar el acceso a Znodes.
- Use SELinux/AppArmor policies si su distribución las soporta.
- Aplique permisos de filesystem restrictivos al directorio de datos (
chown
ychmod
apropiados).
Nota: la configuración de seguridad avanzada (SASL, TLS) requiere cambios adicionales en zoo.cfg
y en la JVM.
Migración a clúster multinodo (consejos)
- Para alta disponibilidad en producción, use un conjunto impar de nodos (3, 5, 7).
- Cada nodo debe tener un
myid
distinto endataDir
e entries de servidor enzoo.cfg
, por ejemplo:
server.1=10.0.0.1:2888:3888
server.2=10.0.0.2:2888:3888
server.3=10.0.0.3:2888:3888
- Considere replicar la configuración, usar NTP para sincronización horaria y probar fallos simulados antes de pasar a producción.
Alternativas y cuándo no usar ZooKeeper
- Si necesita un almacenador de configuración simple y local, use etcd o Consul (ambos ofrecen integración con service discovery y KV store con API HTTP).
- Para casos donde la latencia es crítica y el volumen de escritura es enorme, evalúe sistemas diseñados para escala horizontal específica.
- ZooKeeper es excelente para coordinación y locking distribuido; no es un sistema de base de datos general para grandes blobs.
Modelos mentales y heurísticas
- Piensa en ZooKeeper como un directorio jerárquico de configuración y estados (pequeños datos, many reads, few writes).
- Consistencia fuerte: prioridad a consistencia y disponibilidad para lecturas coordinadas.
- Mantén los Znodes ligeros; no almacenes grandes blobs.
Playbook de migración de single-node a multinodo (resumen)
- Preparar N nodos (N impar ≥ 3) con Java y estructura de directorios.
- Copiar misma versión de ZooKeeper a cada nodo.
- Configurar
zoo.cfg
con entradasserver.X
ydataDir
en cada nodo. - Establecer
myid
en cadadataDir
(valor entero único por nodo). - Iniciar simultáneamente los nodos y verificar quorum.
- Probar failover borrando un nodo y comprobando continuidad.
Checklist según rol
- Administrador de sistema: asegurar backups del
dataDir
, monitoreo, rotación de logs. - DevOps: automatizar despliegue (Ansible/Terraform), configurar alertas y SLI basados en latencia/conexiones.
- Desarrollador: usar cliente ZooKeeper para pruebas, evitar escribir datos grandes en Znodes.
Preguntas frecuentes
Q: ¿Puedo usar OpenJDK en vez de Oracle Java? A: Sí. OpenJDK 11 es una alternativa soportada y más sencilla para repositorios estándar.
Q: ¿Es seguro ejecutar ZooKeeper en un único nodo en producción? A: No. Un único nodo es un punto único de fallo; para producción use un clúster de al menos tres nodos.
Resumen final
Has instalado y verificado un ZooKeeper de un solo nodo en Ubuntu 18.04. Esto es útil para pruebas y desarrollo; para producción planifica un clúster multinodo, activa medidas de seguridad (firewall, ACLs/SASL/TLS) y añade monitoreo y backups.
Cierre: Si quieres, te puedo generar un playbook de Ansible para automatizar toda la instalación, o una versión adaptada a Docker/Kubernetes.
Glosario (una línea): Znode: unidad de datos en el espacio de nombres jerárquico de ZooKeeper, diseñada para almacenar pequeños estados o configuraciones.
Materiales similares

Easter eggs del Estadio en Warzone: guía completa

Configurar WiKID con OpenVPN AS

Matriz de trazabilidad: guía completa

Cómo configurar y aprovechar monitores múltiples

Instalar OpenLiteSpeed, MariaDB y PHP 7.4 en CentOS 8
