Cómo gestionar adecuadamente rabbitmq con supervisord.
(4)
La sección actual en mi supervisord.conf se parece a:
[programa: rabbitmq] comando = / usr / sbin / rabbitmq-server
Cuando trato de detener el rabbitmq con supervisor (supervisorctl stop rabbitmq), los procesos rabbitmq simplemente no se cierran. La documentación de rabbitmq también menciona que nunca se use kill, sino que se use con rabbitmqctl stop. Supongo que Supervord simplemente mata los procesos, de ahí los malos resultados con rabbitmq. No pude encontrar ninguna opción en supervisord para especificar un comando de detención personalizado.
Tiene alguna recomendación?
Esta secuencia de comandos inicia RabbitMQ como un proceso en segundo plano (usando ''&''), lo que hace que se actualice / cree un archivo pid (consulte ''esperar'' en http://www.rabbitmq.com/man/rabbitmqctl.1.man.html ) .
Después de que se haya iniciado el conejo, se utiliza un bucle para verificar que el pid todavía se está ejecutando. Si el conejo se bloquea o se apaga manualmente (fuera de supervisord), el script saldrá con 1 y el supervisor se hará cargo.
El archivo echo >> ./rmq.txt está ahí para propósitos de depuración y se puede comentar en producción (lo usé para monitorear el estado de inicio / apagado / fallecimiento).
supervisord está contento porque puede ver un proceso en ejecución y una SALIDA activará la función stop_rmq que llama a ''rabbitmqctl stop'' para un cierre limpio.
#!/bin/bash
# Script to manage RMQ with supervisord
# Shut down rmq
function stop_rmq {
echo "Stopping RabbitMQ..."
echo "Stopping RabbitMQ..." >> ./rmq.txt
rabbitmqctl stop
echo "RabbitMQ stopped"
echo "RabbitMQ stopped" >> ./rmq.txt
#exit 0
}
# Set up the trap
#trap stop_rabbit TERM KILL HUP INT SIGTERM SIGKILL SIGHUP SIGINT
trap stop_rmq exit
# Start rmq
echo "Starting RabbitMQ..."
echo "Starting RabbitMQ..." >> ./rmq.txt
# Start Rabbitmq in the background (causes the pid file to be updated)
# Note that the pid file location can be overridden with the rmq ''RABBITMQ_PID_FILE'' variable
/usr/sbin/rabbitmq-server &
rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@$HOSTNAME.pid
echo "RabbitMQ Started"
echo "RabbitMQ Started" >> ./rmq.txt
while true; do
#ps $(cat /var/lib/rabbitmq/mnesia/rabbit@$HOSTNAME.pid)
ps -o pid,cmd,etime $(cat /var/lib/rabbitmq/mnesia/rabbit@$HOSTNAME.pid)
if (($? > 0)); then
echo "RabbitMQ Died"
echo "RabbitMQ Died" >> ./rmq.txt
exit 1
fi
#echo "Sleeping..."
sleep 10
done
Aquí está la salida generada por el script para supervisord:
foo@bar:/# supervisorctl tail rmq
Starting RabbitMQ...
Waiting for rabbit@a2d2c8f9cad2 ...
pid is 45220 ...
RabbitMQ 3.3.5. Copyright (C) 2007-2014 GoPivotal, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/[email protected]
###### ## /var/log/rabbitmq/[email protected]
##########
Starting broker... completed with 0 plugins.
...done.
RabbitMQ Started
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 00:05
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 00:15
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 00:25
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 00:35
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 00:45
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 00:55
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 01:05
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 01:15
PID CMD ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi 01:25
Has respondido tu propia pregunta. En el funcionamiento normal, nunca utilice matar en ningún proceso a menos que esa sea la forma normal documentada de administrarlo. En el caso de RabbitMQ, el proceso documentado es utilizar la función de detención de rabbitmqctl o la función de detención de rabbitmqserver.
No hay una buena razón para administrar RabbitMQ con algo más sofisticado que un script de shell que haga un intento de reinicio a través del inicio de rabbitmqserver. Si eso no funciona de inmediato, entonces RabbitMQ no funciona correctamente debido a algo así como la falta de memoria RAM, la falta de espacio en el disco o una herramienta de administración del sistema maliciosa que eliminó algunos de los componentes binarios de rabbitmq.
En el funcionamiento normal, RabbitMQ tiene un supervisor interno que intentará apagar y reiniciar RabbitMQ, por lo que si elimina los binarios, no podrá reiniciarse. Cuando utilice herramientas como chef, puppet, cfengine, no elimine repetidamente los archivos de paquetes binarios. Solo verifica que todo esté ahí como debería ser.
Le aconsejaría que use Monit ( http://mmonit.com/ ), es más adecuado para demonios como RabbitMQ y también tiene muchas funciones.
En primer lugar, debe instalar el paquete Monit. Si estás bajo Ubuntu / Debian:
sudo apt-get update
sudo apt-get install monit
Después, debe crear un script de configuración. Aquí hay una secuencia de comandos de ejemplo para que se ejecute (colóquela en /etc/monit/conf.d/):
set daemon 1800
set logfile /var/log/monit.log
check process rabbit with pidfile /var/run/rabbitmq/pid
start program = "/etc/init.d/rabbitmq-server start"
stop program = "/etc/init.d/rabbitmq-server stop"
noalert foo@bar
Luego, solo reinicia monit y ya has terminado:
sudo /etc/init.d/monit restart
Mi solución es escribir una secuencia de comandos de contenedor llamada rabbitmq.sh de la siguiente manera:
# call "rabbitmqctl stop" when exiting
trap "{ echo Stopping rabbitmq; rabbitmqctl stop; exit 0; }" EXIT
echo Starting rabbitmq
rabbitmq-server
Después de eso, modifica supervisord.conf:
[program:rabbitmq]
command=path/to/rabbitmq.sh