Liferay y Systemd
Sincronizando los servicios externos
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.