Creando nuestro laboratorio de Elasticsearch con Hyper-V

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:

  1. Descargar la imagen de la distribución de Linux deseada, para nuestro ejemplo: Centos 7. Lo usaremos más adelante
  2. Abrir la consola de Powershell (PS) en modo administrador.
  3. Ejecuta systeminfo.exe
  4. 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.

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:Hyper-V Manager 2
Click derecho sobre la VM y seleccionamos Start, tras unos segundos se iniciará el asistente de instalación de CentOS:

Picture3

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:

Picture4

Si sólo nos apareciera el nodo de la IP, tenemos que averiguar el porqué. Problemas comunes:

  1. Problemas con el archivo de configuración. Esto es fácil de ver.
  2. 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!

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 )

Google photo

Estás comentando usando tu cuenta de Google. 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 )

Conectando a %s