rabbitmq supervisord

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