2011-10-11 13 views
23

La sezione corrente nel mio supervisord.conf assomiglia:Come gestire correttamente RabbitMQ con supervisord

[programma: RabbitMQ] comando =/usr/sbin/RabbitMQ server

Quando provo a smettere il conigliomq con supervisord (supervisorctl stop rabbitmq), i processi rabbitmq semplicemente non si spengono. La documentazione di rabbitmq menziona anche di non usare mai kill ma piuttosto di usare rabbitmqctl stop. Immagino che il supervisore uccida semplicemente i processi - da qui i risultati scarsi con rabbitmq. Non sono riuscito a trovare alcuna opzione in supervisord per specificare un comando di arresto personalizzato.

Avete raccomandazioni?

risposta

2

Hai risposto alla tua domanda. Nel normale funzionamento, non utilizzare mai kill su alcun processo a meno che non sia il modo normale documentato di gestirlo. Nel caso di RabbitMQ, il processo documentato prevede l'utilizzo di rabbitmqctl stop o l'uso di rabbitmqserver stop.

Non c'è alcun buon motivo per gestire RabbitMQ con qualcosa di più sofisticato di uno script di shell che fa un tentativo di riavvio tramite l'avvio di rabbitmqserver. Se ciò non funziona immediatamente, RabbitMQ è inattivo a causa di qualcosa come la mancanza di RAM, lo spazio esaurito sul disco o uno strumento di gestione del sistema canaglia cancellato alcuni dei componenti binari di rabbitmq.

In funzionamento normale RabbitMQ dispone di un supervisore interno che tenterà di arrestare e riavviare RabbitMQ, quindi se si eliminano i file binari, non verrà riavviato. Quando si usano strumenti come chef, burattini, cfengine, non spingere ripetutamente i file del pacchetto binario. Controlla che tutto sia lì come dovrebbe essere.

37

La mia soluzione è quella di scrivere uno script wrapper chiamato rabbitmq.sh come segue:

# call "rabbitmqctl stop" when exiting 
trap "{ echo Stopping rabbitmq; rabbitmqctl stop; exit 0; }" EXIT 

echo Starting rabbitmq 
rabbitmq-server 

Dopo di che, modificare supervisord.conf:

[program:rabbitmq] 
command=path/to/rabbitmq.sh 
+3

questo ha funzionato in parte per me. Ho creato una sintesi con la mia soluzione finale: https://gist.github.com/caioariede/342a583f75467509ad42 – caio

+1

@caio sebbene la mia soluzione funzioni per me, dovrei ringraziarti per la tua. –

0

vi consiglio di utilizzare Monit (http://mmonit.com/), è più adatto per i demoni come RabbitMQ ed è anche ricco di funzionalità.

Prima di tutto, è necessario installare il pacchetto Monit. Se si utilizza Ubuntu/Debian:

sudo apt-get update 
sudo apt-get install monit 

Successivamente, è necessario creare uno script di configurazione. Ecco uno script di esempio per farti correre (posizionarlo su /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 [email protected] 

Poi, basta riavvii Monit e si è finito:

sudo /etc/init.d/monit restart 
+0

non sta creando alcun file pid in/var/run/rabbitmq/directory. –

+0

non è un motivo per down-voting del commentatore. infatti, monit potrebbe essere una soluzione perfettamente valida se non fosse per quel file pid (che può essere impostato con un ambiente variabile ...) –

3

Questo lo script avvia RabbitMQ come processo in background (utilizzando '&') che provoca l'aggiornamento/la creazione di un file PID (vedere 'attendere' sotto http://www.rabbitmq.com/man/rabbitmqctl.1.man.html).

Dopo l'avvio di coniglio, viene utilizzato un ciclo per verificare che il pid sia ancora in esecuzione. Se il coniglio si blocca o viene spento manualmente (fuori da supervisord), lo script uscirà con 1 e supervisord prenderà il sopravvento.

L'eco >> ./rmq.il file txt è disponibile per scopi di debug e può essere commentato in produzione (l'ho usato per monitorare lo stato di avvio/arresto/morte).

supervisord è felice perché può vedere un processo in esecuzione e un EXIT attiverà la funzione stop_rmq che chiama 'rabbitmqctl stop' per un arresto pulito.

#!/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/[email protected]$HOSTNAME.pid 
echo "RabbitMQ Started" 
echo "RabbitMQ Started" >> ./rmq.txt 

while true; do 
    #ps $(cat /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid) 
    ps -o pid,cmd,etime $(cat /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid) 
    if (($? > 0)); then 
    echo "RabbitMQ Died" 
    echo "RabbitMQ Died" >> ./rmq.txt 
    exit 1 
    fi 
    #echo "Sleeping..." 
    sleep 10 
done 

Ecco l'output generato dallo script di supervisord:

[email protected]:/# supervisorctl tail rmq 

Starting RabbitMQ... 
Waiting for [email protected] ... 
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 
Problemi correlati