Liferay y Systemd

Sincronizando los servicios externos

Publicado por Miguel Ángel Júlvez el 23 de junio de 2016

Como hemos visto en anteriores entradas del blog, Liferay 7 usa diferentes herramientas externas para realizar determinadas tareas como conversión de ficheros, búsquedas, etc.

El problema que nos encontramos al tener diferentes herramientas, es que necesitamos garantizar un determinado orden de arranque y/o parada de las mismas para un correcto funcionamiento.

En esta entrada de post voy a mostrarte cómo utilizar el nuevo Systemd de gnu/linux para el arranque/parada y sincronización de los servicios.

Vamos a recordar las diferentes herramientas que hemos visto en otros post:

  • Mysql 5.7
  • Elasticsearch 2.3.3
  • Kibana 4.5.1
  • Libreoffice 4.3.3
  • Tomcat 8.0.32 con liferay desplegado

Las premisas que he tenido en mente a la hora de preparar los scripts son:

  • Inicia/para todos los servicios al iniciar/detener la máquina.
  • Antes de levantar kibana, asegúrate que elasticsearch está levantado. Si no lo está, hazlo.
  • Antes de levantar liferay, asegúrate que mysql, elasticsearch y libreoffice están levantados. Si no lo están, hazlo.
  • Antes de levantar liferay, comprueba que kibana está levantando. Si no lo está, no hagas nada ya que no afecta al funcionamiento de liferay y si lo necesito lo levantaré yo cuando quiera.
  • Si Mysql se detiene, asegúrate de que liferay está detenido también. Si no lo está, detenlo.
  • Si liferay se ha parado inesperadamente, espera 30 segundos y levántalo de nuevo.
  • Si elasticsearch se ha parado inesperadamente, espera 30 segundos y levántalo de nuevo.
  • Si libreoffice se ha parado, espera 30 segundos y levántalo de nuevo.

Tú puedes considerar otras opciones. Por ejemplo, en estos scripts he considerado que si libreoffice o elasticsearch se detienen, liferay puede seguir funcionando (aunque limitadamente) por lo que no detengo liferay.

Los scripts se entienden bastante bien, pero aquí tienes unos pequeños apuntes:

  • BindsTo -> Si los servicios que indica se detiene, detén este servicio
  • Wants -> Levanta los servicios que indica y luego levanta este servicio. Si el servicio falla al levantar, continúa el proceso
  • Requires -> Levanta los servicios que indica y luego levanta este servicio. Los servicios tiene que estar levantando sí o sí
  • After -> Indica que tiene que levantarse después de los servicios que indica
  • Before -> Indica que tiene que levantarse antes de los servicios que indica
  • TimeoutStopSec -> Tiempo de gracia para que el servicio se detenga por si solo después de ejecutar el comando de parada. Sino, manda una SIGTERM (-15) al proceso.
  • Restart -> Indica cuando hay que levantar el servicio al apagarse. El valor on-failure indica que se reinicie el servicio después de una unclean signal (por ejemplo una SIGKILL)

kibana.service

[Unit]
Requires=elasticsearch.service
After=network.target elasticsearch.service
Before=liferay7.target

[Service]
Environment="JAVA_HOME=/opt/jdk1.8"
Type=simple
ExecStart=/opt/kibana/bin/kibana

User=noroot
Group=noroot

LimitNOFILE=65535

Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target

elasticsearch.service

[Unit]
After=network.target
Before=liferay7.target

[Service]
Environment="JAVA_HOME=/opt/jdk1.8"
Type=simple

ExecStart=/opt/elasticsearch/bin/elasticsearch

User=noroot
Group=noroot

LimitNOFILE=65535

Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target

libreoffice.service

[Unit]
Description=Libreoffice headless
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/lib/libreoffice/program/soffice.bin --headless --nologo --nofirststartwizard --invisible --accept="socket,host=127.0.0.1,port=8100;urp;" --pidfile=/var/run/soffice.pid
ExecStop=kill $MAINPID

TimeoutStopSec=60
KillMode=process
KillSignal=SIGKILL

Environment="JAVA_HOME=/opt/jdk1.8"

Restart=always
RestartSec=30s

User=root
Group=root

[Install]
WantedBy=multi-user.target

mysql.service

[Unit]
Description=MySQL Community Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

PermissionsStartOnly=true
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStart=/usr/bin/mysqld_safe
ExecStartPost=/usr/share/mysql/mysql-systemd-start post

TimeoutSec=600

Restart=on-failure

liferay7.service

[Unit]
Description=Liferay Portal 7
BindsTo=mysql.service
Wants=kibana.service
Requires=mysql.service libreoffice.service elasticsearch.service
After=network.target syslog.target libreoffice.service mysql.service elasticsearch.service kibana.service

[Service]
Type=forking
WorkingDirectory=/opt/liferay/

Environment="JAVA_HOME=/opt/jdk1.8"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/jdk1.8/bin"
Environment="CATALINA_PID=/tmp/liferay-7-catalina.pid"
Environment="CATALINA_HOME=/opt/liferay/tomcat-8.0.32"
Environment="CATALINA_BASE=/opt/liferay/tomcat-8.0.32"

ExecStart=/opt/liferay/tomcat-8.0.32/bin/startup.sh
ExecStop=/opt/liferay/tomcat-8.0.32/bin/shutdown.sh

TimeoutStopSec=60s
KillMode=process
KillSignal=SIGTERM

Restart=on-failure
RestartSec=30s

User=noroot
Group=noroot

[Install]
WantedBy=multi-user.target

Todos estos scripts deben encontrarse en /etc/systemd/system/ .

Para habilitarlos, ejecuta lo siguiente para cada fichero:

sudo systemctl enable . P.ej sudo systemctl enable liferay7.service

Si al habilitarlo te diera algún error, puedes ver el por qué con el siguiente comando

sudo journalctl -u . P.ej sudo journtalctl -u liferay7

Una vez habilitados ya puedes usarlos mediante

sudo service liferay7 start
sudo service liferay7 stop

 

Estos scripts suponen que todos los servicios están instalados en la misma máquina. Si tienes los servicios en diferentes máquinas estas dependencias tendrían que resolverse de otra forma.

Se que se puede administrar por ssh el systemd de otras máquinas, pero a primera vista diría que las dependencias solo se gestionan en máquinas locales. Tengo que investigar un poco para ver si puede hacerse algo con systemd en estos casos.