Mostrando entradas con la etiqueta elasticsearch. Mostrar todas las entradas
Mostrando entradas con la etiqueta elasticsearch. Mostrar todas las entradas

miércoles, mayo 08, 2019

Desplegar con Docker un ElasticSearch y Kibana para experimentar

Supongamos que queremos desplegar un ElasticSearch junto con un Kibana para probarlos. Una manera sencilla es usar un contenedor en Docker donde se ejecutarán ambos. Si usamos una red virtual, podemos aprovecharla para comunicar Kibana y ElasticSearch.

La configuración de ambos productos se controla pasándo variables de entorno. Por otra parte, si consultamos la las configuraciones de ElasticSearhr y las de configuraciones de Kibana, para Docker tiene los siguientes valores por defecto:

  • ElasticSearch:
    • Puerto por defecto 9200 para API REST. Intercluster comunicación, 9300
  • Kibana
    • Nombre del servidor ElasticSearch al que espera conectarse http://elasticsearch:9200
    • Puerto por defecto 5601

Pues sabiendo esos valores por defecto, se puede desplegar fácilmente dos contenedores, uno con ElasticSearch y otro con Kibana, que se conectará a través de una red que se creará en el Docker y que vamos a llamar elastic

# Get ElasticSearch 6.6.0 version
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.6.0
# Get Kibana 6.6.0 version
docker pull docker.elastic.co/kibana/kibana:6.6.0
# Crea una red llamada elastic
docker network create elastic
# Arranca ElasticSearh, mapea los puertos
docker run -p 9200:9200 -p 9300:9300 \
  --net elastic --name elasticsearch \
  -e "discovery.type=single-node" \
  docker.elastic.co/elasticsearch/elasticsearch:6.6.0
# Arranca Kinabna docker run -p 5601:5601 \
  --net elastic \
  --name kibana \
  docker.elastic.co/kibana/kibana:6.6.0

Es importante que tengamos creada la red y que el nombre del container de ElasticSearch sea elasticsearch. Esto debe ser así para que Kibana pueda conectarse al ElasticSearch sin problemas. Si queremos usar una herramienta de línea de comandos como cURL, tendremos el ElasticSearch expuesto a través del puerto 9200. Por último, estos parámetros se pueden cambiar con variables de entorno cuyos valores pasaremos a docker con la ayuda de la opción -e o bien, en el caso de Kibana montar nuestro propio fichero de configuración como explican en kla ayuda.

lunes, mayo 30, 2016

Algunos enlaces sobre Elasticsearch

Estos últimos meses estoy trabajado con el motor de búsqueda Elasticsearch. Durante este tiempo, he ido buscando información sobre ciertos aspectos de su uso, configuración y monitorización. Esto son algunos enlaces que he encontrado sobre aspectos de Elasticsearch sobre los cuales me ha interesado profundizar.

El primer enlace que os dejo es Monitor Your Elasticsearch Cluster Performance donde se describe el uso de varias herramientas en la nube que hacen peticiones a las API de Cluster Health de Elasticsearch para poder monitorizar el estado del mismo. Quizás de esta me quedo como usar nginx como un frontal que pase peticiones al API RESET de Elasticsearch.

Este booklet, Performance Monitoring Essential, Elasticsearch Edition de la empresa Sematext, donde se da una visión general del producto, como indexa y sobre todo cuales son los indicadores básicos a vigilar para estudiar el rendimiento.

Si queremos usar Docker para desplegar Elasticsearch, se peude seguir las indicaciones de como crear un Dockerfile.

Microsoft ha publicado una guía de como configurar Elasticsearch en Azure. Hace una buena introducción a la configuración de Elasticsearch y su despliegue en Azure.

Si tenéis una instalación que use una versión 1.7.x y pasáis a la nueva versión 2.x , es conveniente leer con detalle los puntos a tener en cuenta para que la actualización se pueda hacer sin problemas.

Probablemente esto sea una entrada dinámica, que actualizaré conforme vaya leyendo artículos y encontrando información que me interese sobre Elasticsearch.

sábado, diciembre 12, 2015

ElasticSearch: Algunos conceptos básicos

Estas últimas semanas estoy trabajando con el buscador Elasticsearch. Quiero recopilar algunas notas de los conceptos, terminología y uso básico del mismo.

Elasticsearch es un motor de almacenamiento y búsqueda de documentos en formato JSON. Estos documentos se organizan índices de acuerdo a nuestros requerimientos. Los índices internamente se dividen en shards los cuales pueden residir en diferentes nodos. Un esquema sencillo de esta relación es el siguiente:

La primera decisión importante cuando se despliega un proyecto sobre Elasticsearch es decidir cual va a ser el número de shards que va a tener cada uno de los índices que usemos. Esta es una de la primeras preguntas que nos debemos hacer. El número de shards determina como podemos distribuir el índice entre los diferentes nodos que forman el cluster. Además, cada shard es un índice de Lucene que ocupa los correspondientes recursos en el sistema. Además está el inconveniente de que no se puede cambiar los shards de un índice sin reindexar de nuevo todos los datos y es un parámetro fundamental a la hora de evaluar el rendimiento del cluster y los problemas de escalado que pudiera haber. Como todo, el número que se use es un conjunto de compromisos entre nuestra escalabidad y rendimiento

Otro concepto importante a la hora de manejar los índices de elasticsearch son aquellos shards que son réplicas. Estás se usan para implementar la redundacia a fallos. Si un nodo que tiene un shard primario cae, la réplica pasa a ser el shard primario y así el cluster puede seguir funcionando.

Los shards, tanto primarios como réplicas se distribuyen entre los diferenes nodos del cluster que forman Elasticsearch para conseguir un escalado horizontal entre varias máquinas. Un cluster lo forman varios nodos que tienen el mismo nombre. Éste se fija en el fichero de configuración elasticsearch.yml con la propiedad cluster.name:. En la arquitectura de Elasticsearch un nodo siempre es el master encargado de la gestión de los índices y coordinación de los diferentes nodos. Las peticiones de indexado y búsqueda que reciben los nodos son rutadas de manera adecuada a donde están los datos.

Para interactuar con Elasticsearch lo más sencillo es usar su interfaz REST que por defecto escucha en el puerto 9200 de la máquina donde se está ejectuando Elasticsearch. Es muy fácil usar software como curl para realizar dichas peticiones. Aparte del verbo http (GET, PUT, POST, DELETE) la información que necesita Elasticsearch viaja en el cuerpo de las peticiones codificado en formato JSON. La mayoría de las respuestas que da el servidor de Elasticsearch son también en este formato. Existe otro método para interactuar con el cluster de Elasticsearch y es el llamado API de transporte, donde el sistema cliente simula ser otro nodo del cluster. Hay multitud de librerías que encapsulan este acceso al servidor como Python Elasticsearch Client para Python. Para algunas cosas que hago en Python he usado bastante Requests montando las peticiones directamente.

Intereactuar con el API rest es bastante sencillo. Por ejemplo, esta simple petición nos devuelve un JSON con las propiedades del server. A continuación unos ejemplos de como crear un índice, introducir datos, devolverlos y borrar el índice.

baldurgate:~ terron$curl -XGET http://localhost:9200
{
  "name" : "Krang",
  "cluster_name" : "avos",
  "version" : {
    "number" : "2.0.0",
    "build_hash" : "de54438d6af8f9340d50c5c786151783ce7d6be5",
    "build_timestamp" : "2015-10-22T08:09:48Z",
    "build_snapshot" : false,
    "lucene_version" : "5.2.1"
  },
  "tagline" : "You Know, for Search"
}

Crear un índice y ver las propiedades del índice es muy sencillo. Se añade el parámetro pretty para que nos devuelva el JSON formateado para que su lectura sea sencilla

baldurgate:~ terron$curl -XPUT http://localhost:9200/prueba?pretty
{
  "acknowledged" : true
}
baldurgate:~ terron$curl -XGET http://localhost:9200/prueba?pretty
{
  "prueba" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1449933189870",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "wFT1ymODQCqsXIOkeCakVw",
        "version" : {
          "created" : "2000099"
        }
      }
    },
    "warmers" : { }
  }
}

Introducir datos en el índice se puede hacer con curl de manera sencilla. Voy a dejar, de momento el fundamental tema de los mapeos, dejando que sea el propio servidor el encargado de generarlos automáticamente. Por ejemplo, para crear dentro del índice prueba un tipo de datos llamado libro, introducimos un

baldurgate:~ terron$curl -XPOST http://localhost:9200/prueba/libro/?pretty \
  -d '{"autor": "Julio verne","titulo": "Veinte mil lenguas de viaje submarino"}'
{
  "_index" : "prueba",
  "_type" : "libro",
  "_id" : "AVGWzzLD6jhN-gT8oefN",
  "_version" : 1,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : true
}

Y una búsqueda rápida que devuelva todo lo que tiene el índice

baldurgate:~ terron$curl -XGET http://localhost:9200/prueba/_search
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "prueba",
      "_type" : "libro",
      "_id" : "AVGWztnY6jhN-gT8oefM",
      "_score" : 1.0,
      "_source":{"autor": "Julio verne","titulo": "Veinte mil lenguas de viaje submarino"}
    }]
  }
}

Por último, se puede borrar todo el índice como un simple:

baldurgate:~ terron$curl -XDELETE http://localhost:9200/prueba {
  "acknowledged":true
}

sábado, octubre 24, 2015

ElasticSearch: Notas de instalación

Instalación

ElasticSearch es un sistema de almacenamiento distribuido orientado a documentos JSON construido sobre Apache Lucene. Su punto fuerte es la facilidad que permite crear clusteres de varias máquinas rápidamente. Su especialidad es el análisis y búsqueda de datos introducidos en índices y la potencia de búsqueda que da la librería Lucene sobre la que está construido.

Instalar ElasticSearch es sencillo. La versión estable cuando escribo esta entrada, 1.7.3, necesite al menos Java 7, siendo recomendable el uso de Java 8. En ambos casos es necesario el JDK. Una vez que lo tenemos instalado el proceso de instalación es tan sencillo como bajarse el zip con ElasticSearch, descomprimirlo y activarlo.

$ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz
$ wget -O elasticsearch-1.7.3.tar.gz.sha1  \
  https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz.sha1.txt
$ # Verificamos la hash
$ sha1sum elasticsearch-1.7.3.tar.gz.sha1
$ # El comando anterior debe devolver OK
$ tar zxvf elasticsearch-1.7.3.tar.gz
$ cd elasticsearch-1.7.3
$ bin/elasticsearch

ElasticSearch exporta su funcionalidad a través de una potente interfaz REST que permite realizar todas las operaciones que se necesite. Por defecto, dicha interfaz escucha en el puerto 9200 en cualquier interfaz IP de la máquina. En caso de que dicho puerto esté ocupado, ElasticSearch intentará localizar uno libre desde el mismo, intentando abrir un puerto de manera consecutiva desde el 9200. Se puede comprobar que está el sistema funcionando con ayuda del comando curl

$ curl -XGET http://localhost:9200
{
"status" : 200,
"name" : "Yandroth",
"cluster_name" : "darkelf",
"version" : {
"number" : "1.7.2",
"build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
"build_timestamp" : "2015-09-14T09:49:53Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}

Personalmente, cuando uso ElasticSearch prefiero seguir una estructura que me permita cambiar entre versiones de manera fácil. ElasticSearch, en su configuración por defecto está autocontenido. Puede ejecutarse desde una cuenta de usuario normal sin necesidad de privilegios espaciales. Esto me permite usar enlaces simbólicos para activar la versión que me conviene de ElasticSearch:

lrwxr-xr-x   1 terron  staff    19 21 sep 19:19 elasticsearch -> elasticsearch-1.7.2
drwxr-xr-x+  8 terron  staff   272 16 dic  2014 elasticsearch-1.4.2
drwxr-xr-x+ 19 terron  staff   646 19 oct 18:50 elasticsearch-1.7.2
drwxr-xr-x+  8 terron  staff   272 23 oct 15:26 elasticsearch-1.7.3

Uso siempre rutas que incluyan el enlace simbólico y cambiando el mismo, puedo seleccionar una versión u otra sin alterar otras partes de la aplicación que haga referencias a las mismas.

Configuración mínima

Aunque sea fácil arrancar por defecto ElasticSearch hay que tener en mente algunos problemas de configuración que pueden presentarse. Voy a suponer que existe una variable de entorno $HOME_ES que apunta al directorio raíz donde se ha descomprimido ElasticSearh. El fichero de configuración es $HOME_ES/config/elasticsearch.yml, que utiliza el formato yaml. Además existen una serie de variables de entorno que utiliza el script de arranque para configurar el proceso y el fichero $HOME_ES/bin/elasticsearch.in.sh donde también se pueden configurar diversos aspectos de la aplicación. Si se usa el script de arranque $HOME_ES/bin/elasticsearch

Como mínimo sería interesante establecer el nombre del cluster y el nombre del nodo en el fichero $HOME_ES/config/elasticsearch.yml. Por defecto, gracias al mecanismo de multicast que tiene ElastiSearch, todos los nodos que utilicen el mismo nombre de cluster tratarán de unirse al mismo, creando un entorno distribuido.

cluster.name: avos
node.name: "Nodo 1"

También es intersante establecer la variable de entorno que controla el heap de Java. La variable que controla dicha cantidad es ES_HEAP_SIZE y por defecto es un 1 giga. Ojo, que hay ciertas reglas a tener en cuenta al establecer la memoria máxima que puede usar ElasticSearch.