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!)
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:
- Asegúrate que tu firewall impide el acceso a los puertos de los productos desde fuera de la interfaz localhost
- 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
Una vez ahí, en la pestaña “Foundation” busca el componente “Elasticsearch” y edita su configuración.
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.
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.
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:
Una vez configurado, ya podemos acceder a los datos que nos ofrece kibana
Acceso a marvel
http://localhost:5601/app/marvel
Marvel es un monitor de nuestro elasticsearch
Acceso a sense
http://localhost:5601/app/sense
Sense es una interfaz amigable para hacer búsquedas en 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.
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