Para crear nuestro laboratorio de Elasticsearch en un equipo Windows, con el que poder experimentar más adelante 😊, una buena opción es usando Hyper-V. Este es un software de virtualización que ofrece Microsoft y que se puede instalar en varias versiones de Windows 10 de forma gratuita.
Objetivo
Vamos a crear un cluster con las siguientes características:
- Nombre del cluster: es-cluster-lab
- Número de nodos: 3
- Nombre de los nodos: elasticsearch-lab-{1..3}.localdomain
Para cada nodo/VM:
- CPU: 1 core
- RAM: 1024 MB
- VHD: 20 GB
- OS: Linux CentOS 7
- SW: OpenJDK 1.8 + Elasticsearch 6.7
Preparación
Lo primero es comprobar que nuestro equipo cumple con los requisitos para Hyper-V:
- Descargar la imagen de la distribución de Linux deseada, para nuestro ejemplo: Centos 7. Lo usaremos más adelante
- Abrir la consola de Powershell (PS) en modo administrador.
- Ejecuta systeminfo.exe
- En el resultado, comprueba que en la sección Hyper-V Requirements, se cumplen todos.
[Aviso: Habilitando Hyper-V causará que otras herramientas de virtualización instaladas dejen de funcionar. Puedes seguir este artículo para añadir una opción de iniciar Windows sin Hyper-V habilitado.]
La instalación usando PS la hacemos con una línea de comando:
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Luego reiniciamos nuestra máquina y estaremos listos.
Creando las VMs
Tras el reinicio de nuestra máquina, si vamos al Inicio de Windows y buscamos por “Hyper”, veremos que hay una aplicación nueva: Hyper-V Manager.
Para crear los nodos de nuestro cluster, necesitaremos definir un Virtual Switch, que podemos crear usando Hyper-V Manager o PS (más cómodo):
> New-VMSwitch -name MyVirtualSwitch -NetAdapterName Ethernet -AllowManagementOS $true
Con la preparación completada, podemos pedirle a Hyper-V que cree nuestra primera VM, y se lo diremos por medio de PowerShell. El siguiente es un bloque de código que editamos usando Powershell ISE:
# Definimos el nombre de la VM, el Switch (creado antes) y la ruta de la imagen $VMName = 'elasticsearch-lab-1' $Switch = 'MyVirtualSwitch' $InstallMedia = 'D:\ISOs\CentOS-7-x86_64-Everything-1804.iso' # Creamos la VM, 20GB New-VM -Name $VMName -MemoryStartupBytes 1073741824 -Generation 1 -NewVHDPath "D:\VMs_slow\$VMName\$VMName.vhdx" -NewVHDSizeBytes 21474836480 -Path "D:\Virtual Machines\$VMName" -SwitchName $Switch # Añadimos una unidad DVD a la VM.. Add-VMScsiController -VMName $VMName Add-VMDvdDrive -VMName $VMName -Path $InstallMedia # ..y la montamos $DVDDrive = Get-VMDvdDrive -VMName $VMName # Configura la VM para arrancar desde el CD/DVD Set-VMBios -VMName $VMName -StartupOrder @("CD", "Floppy", "LegacyNetworkAdapter", "IDE")
Si abrimos Hyper-V Manager y listamos las Virtual Machines, veremos la nuestra:
Click derecho sobre la VM y seleccionamos Start, tras unos segundos se iniciará el asistente de instalación de CentOS:
No vamos a entrar en detalle de cómo realizar esta instalación, al existir una buena cantidad de guías en castellano en la web. Dónde si vamos a entrar más en detalle es en la instalación de nuestro cluster de Elasticsearch.
Repetimos este paso tantas veces cómo nodos queramos en nuestro cluster, tan sólo cambiando el nombre de la VM (…-1, …-2,…) en nuestro script de PS.
Creando el cluster de Elasticsearch
JAVA es un prerrequisito antes de instalar Elasticsearch, ya que su motor de búsqueda es Apache Lucene que está creado en dicho lenguaje. Sólo podemos usar el que provee Oracle o la versión OpenJDK. En nuestro ejemplo usamos el segundo.
Vamos a la consola del primer nodo con permisos elevados:
$ yum install java-1.8.0-openjdk-devel
Tras esto procedemos a instalar propiamente elastic:
$ yum install elasticsearch
E iniciamos el servicio:
$ systemctl start elasticsearch.service
Editamos algunas propiedades en el fichero de configuración de nuestro nodo:
$ vi /etc/elasticsearch/elasticsearch.yml
Cambiamos los valores de:
- cluster.name, le damos el nombre que queramos.
- node.name, le ponemos igual que el nombre de la VM.
- network.host, la IP (v. 4) de la máquina virtual.
- discovery.zen.ping.unicast.hosts: Le ponemos la lista de las IPs que van a formar el cluster. Ejemplo: [«192.168.1.72″,»192.168.1.73″,»192.168.1.38»]. Nota: Esta propiedad la usamos porque estamos en versión 6.8. A partir de la 7 se recomienda usar discovery.seed_hosts.
Repetimos todo lo anterior para los demás nodos. Cuando hayamos terminado, el cluster se debería haber formado de manera transparente, ya que hemos usado el mismo cluster.name, y los nodos son visibles entre sí. Dicho de otro modo, los nodos de elasticsearch detectan si existe un cluster que coincida con su configuración (archivo elasticsearch.yml) y se unen a él de manera automática. Podemos comprobarlo usando esta llamada:
$ curl -X GET "IP_DE_NODO:9200/_cat/nodes?v&pretty"
Ejemplo:
$ curl -X GET "192.168.1.38:9200/_cat/nodes?v&pretty"
Con resultado:
Si sólo nos apareciera el nodo de la IP, tenemos que averiguar el porqué. Problemas comunes:
- Problemas con el archivo de configuración. Esto es fácil de ver.
- Problemas con el firewall.
Para ver si se trata de lo segundo, podemos comprobar que los nodos tengan comunicación entre sí:
$ nc -vz 192.168.1.73 9300
La IP es la del nodo con el que queremos comprobar la comunicación, y el puerto TCP 9300, es el que se utiliza por defecto para la comunicación entre los nodos. Si no estuviera abierta, hacemos lo siguiente:
$ firewall-cmd --permanent --add-port=9200/tcp $ firewall-cmd --permanent --add-port=9300/tcp
Ahora, si volvemos a probar la llamada anterior. Deberíamos obtener como resultado la lista de los 3 nodos de nuestro cluster. Si no fuera el caso, puedes dejar un comentario o enviarme un mensaje privado.
Con esto ya tenemos configurado nuestro cluster de elasticsearch de 3 nodos con Hyper-V ¡Bien hecho! A partir de este punto podemos plantearnos próximos retos:
- Automatizar completamente todo el proceso de creación del cluster. Vagrant?
- Hacer pruebas de rendimiento con nuestro cluster.
- Federarlo con otra base de datos.
- Configurar los nodos de forma automática con Ansible.
- …
Hay muchas opciones, y sin duda escribiré más artículos sobre ello ¡Hasta la próxima!