Liferay 7 y elasticsearch

Con Kibana, marvel y sense

Antes de liferay 7, el portal usaba lucene como motor de búsquedas. Lucene se ejecutaba en la misma jvm del portal, por lo que si queríamos mejorar el rendimiento de las búsquedas y/o queríamos crear un cluster y/o exprimir las búsquedas del portal, la configuración recomendada era utilizar sistema de búsquedas externo que descargara al portal de ese trabajo.

Los sistemas de búsquedas externos que se venían utilizando con liferay principalmente para solventar este problema eran gsa, elasticsearch y solr. Hace años aposté por Apache Solr, llegándolo a conocer muy profundamente, y te puedo decir que es una auténtica maravilla. De hecho en el simposio de liferay del año 2011 di una pequeña charla sobre ello (aquí puedes ver la presentación https://es.slideshare.net/MiguelngelIbez/bsqueda-facetada-usando-la-categorizacin-de-liferay-6-23516375)

Como siempre me pasa, nunca apuesto por el caballo ganador y en los últimos 2 o 3 años, elasticsearch ha ido posicionándose como producto estrella desbancado a Apache Solr en el mercado, aunque esto no significa que Apache Solr sea peor producto que elasticsearch. Ya sabes, el mercado, ese gran desconocido… ^_^

Así que, lógicamente, Liferay apostó por elasticsearch como su motor de búsquedas por defecto (aunque podríamos seguir usando apache solr a través de algún componente, pero claro, si ya viene por defecto para que complicar más nuestras arquitecturas. Keep It Simple Stupid!)

Logo elasticsearch

La misma definición que usé en su día de Apache Solr aplica en este caso: Elasticsearch es el motor de búsqueda lucene con vitaminas. Podemos hacer virguerías con grandes volúmenes de datos (voy a poner aquí la palabra BIG DATA a ver si le gusta a google y me posiciona el blog mejor… BIG DATA, BIG DATA, BIG DATA, ….) y explotar la información de manera que hace no muchos años era prácticamente imposible.

Cuando nos descargamos alguno de los bundle por defecto de liferay 7, estos ya vienen configurados para usar una versión de elasticsearch embebida (la 2.2.0 si no me equivoco) que NO debe de ser utilizada en entornos de producción ya que se ejecuta en la misma jvm que el portal y esto produce problemas obvios en el rendimiento.

Así que en este post voy a explicar cómo configurar liferay 7 y elasticsearch en entornos productivos y ya de paso instalaremos un producto llamado kibana y un par de plugins que nos van a permitir explotar la potencia de elasticsearch más fácilmente.

Manos a la obra!!

Instalación de elasticsearch y kibana

Descargamos las fuente

noroot@elsuper:/opt$ cd /tmp
noroot@elsuper:/tmp$ wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz
noroot@elsuper:/tmp$ wget https://download.elastic.co/kibana/kibana/kibana-4.5.1-linux-x64.tar.gz

Desempaquetamos

noroot@elsuper:/opt$ cd /opt
noroot@elsuper:/opt$ sudo tar -zxvf /tmp/elasticsearch-2.3.3.tar.gz
noroot@elsuper:/opt$ sudo ln -s elasticsearch-2.3.3/ elasticsearch
noroot@elsuper:/opt$ sudo tar -xvf /tmp/kibana-4.5.1-linux-x64.tar.gz noroot@elsuper:/opt$ sudo ln -s kibana-4.5.1-linux-x64/ kibana
noroot@elsuper:/opt$ sudo chown -R noroot.noroot kibana-4.5.1-linux-x64 elasticsearch-2.3.3/

Instalación de marvel y sense

noroot@elsuper:/opt/elasticsearch$ bin/plugin install license

noroot@elsuper:/opt/elasticsearch$ bin/plugin install marvel-agent

noroot@elsuper:/opt/kibana$ bin/kibana plugin --install elasticsearch/marvel/latest

noroot@elsuper:/opt/kibana$ bin/kibana plugin --install elastic/sense

*Nota mental: Igual es mejor crear un playbook de ansible cada vez que pongo códigos para que se pueda reutilizar más fácilmente.

Configuración de elasticsearch y kibana

Voy a configurar lo mínimo que necesitamos para que funcionen entre ellos y con liferay. Como es lógico, si estamos instalando en un entorno de producción hay una serie de recomendaciones en ambos productos que deberíamos cumplir según indican en la documentación.

Lo que sí que quiero nombrar es que no hay que olvidarse de la seguridad. Estos productos tienen toda la información de nuestro portal, así que es esencial que estén bien protegidos. Dentro de la gama de productos de elasticsearch, hay un producto llamado Shield que sirve para securizarlos, aunque vale una pasta. Solo decirte que:

  1. Asegúrate que tu firewall impide el acceso a los puertos de los productos desde fuera de la interfaz localhost
  2. Accede a la interfaz http de los productos a través de un proxy que vaya por SSL y que al menos tenga una autenticación básica o restricciones de IP de acceso.

Igual preparo otro post con las instrucciones de cómo hacer los dos puntos anteriores, porque si lo pongo en este va a quedar muy largo y aburrido.

Elasticsearch

El fichero de configuración de elasticsearch está aquí :

/opt/elasticsearch/config/elasticsearch.yml

Descomenta las siguientes líneas y establecer los valores:

cluster.name: LiferayElasticsearchCluster

http.port: 9201

Como veremos en un momento, la configuración de liferay por defecto usa el nombre del cluster “LiferayElasticsearchCluster” así que nos adaptamos.

Luego, el elasticsearch embebido de liferay se levanta en el puerto 9200, así que nuestro elasticsearch debe levantarse en otro puerto.

Kibana

El fichero de configuración de kibana está aquí:

/opt/kibana/config/kibana.yml

Descomenta y establece el valor de esta propiedad:

elasticsearch.url: "http://localhost:9201" 

Esto es todo lo que necesitamos tocar de la configuración de estos productos. Obviamente, es la configuración mínima para que funcione. Hay muchas otras propiedades que podría establecer para un entorno productivo, pero eso, ya es otro tema.

Liferay

Ahora vamos con la configuración que es necesaria hacer en Liferay 7 para que se comunique con nuestro elasticsearch.

*Nota: Date cuenta que elasticsearch tiene que estar levantado antes de que Liferay 7 arranque ya que sino fallarán los commits de los índices. Y lo mismo, cuando apagues elasticsearch asegúrate de haber apagado antes Liferay. Esto puede hacerse con el systemd “fácilmente”.... mira, ya tengo temática para otro post… no me da la vida!!!

 

Para configurar Liferay hay que ir al panel de control->configuration->system settings

Panel de control de liferay

Una vez ahí, en la pestaña “Foundation” busca el componente “Elasticsearch” y edita su configuración.

Configuraci´ón elasticsearch e liferay

La única propiedad que hay que cambiar es el Operation mode. Cambia EMBEDDED por REMOTE y dale a guardar. Y ya está.

Ahora bien, asegúrate de que en los logs del servidor de aplicaciones no hay ninguna excepción. Si no hubiera comunicación con elasticsearch aparecería en los logs y significaría que no funcionaría la indexación y las búsquedas en el portal. Si ves excepciones, vuelve a establecer la propiedad a EMBEDDED, asegúrate de que kibana y elasticsearch están respondiendo correctamente y luego vuelve a establecerlo a REMOTE.

Una vez que la comunicación es correcta, ve a administración del servidor y reindexa todas las búsquedas.

Indexar búsquedas liferay

Acceso a elasticsearch

http://localhost:9201

Esto es en realidad elasticsearch. Desde aquí podemos lanzar indexaciones de datos, búsquedas, etc. Es poco amigable, así que por eso hemos instalado sense.

Cliente elasticsearch

Acceso a kibana

http://localhost:5601/app/kibana

La primera vez que accedes a kibana necesitas configurar un patrón. Establece los mismos datos que en esta imagen:

Kibana

Una vez configurado, ya podemos acceder a los datos que nos ofrece kibana

Datos Kibana

Acceso a marvel

http://localhost:5601/app/marvel

Marvel es un monitor de nuestro elasticsearch

Marvel

 

Marvel datos

Acceso a sense

http://localhost:5601/app/sense

Sense es una interfaz amigable para hacer búsquedas en elasticsearch

Sense elasticsearch

Si quieres ver como afectan las búsquedas del portal, configura en alguna página el portlet "Search" y realiza unas cuantas búsquedas. Verás cómo van variando los distintos parámetros de elasticsearch.

sense elasticsearch datos

En este momento, ya tienes liferay 7 preparado para producción con la última versión de elasticsearch y con unas herramientas que te facilitarán mucho la vida. A partir de aquí, se abre un mundo de posibilidades así que diviértete!

EDIT

Si quieres que se analicen todos los idiomas de liferay debes añadir estos plugins a elasticsearch

noroot@elsuper:/opt/elasticsearch$ bin/plugin install analysis-smartcn
noroot@elsuper:/opt/elasticsearch$ bin/plugin install analysis-stempel
noroot@elsuper:/opt/elasticsearch$ bin/plugin install analysis-kuromoji
noroot@elsuper:/opt/elasticsearch$ bin/plugin install analysis-icu