web-dev-qa-db-ja.com

スーパーバイザーでrabbitmqを適切に管理する方法

私のsupervisord.confの現在のセクションは次のようになります。

[プログラム:rabbitmq]コマンド=/usr/sbin/rabbitmq-server

Supervisord(supervisorctl stoprabbitmq)を使用してrabbitmqを停止しようとすると、rabbitmqプロセスがシャットダウンしません。また、rabbitmqのドキュメントには、killを使用せず、rabbitmqctlstopを使用することが記載されています。監視対象は単にプロセスを強制終了するだけだと思います。したがって、rabbitmqの結果は良くありません。カスタム停止コマンドを指定するためのオプションがsupervisordに見つかりませんでした。

何かお勧めはありますか?

25
user316054

私の解決策は、rabbitmq.shという名前のラッパースクリプトを次のように作成することです。

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

echo Starting rabbitmq
rabbitmq-server

その後、supervisord.confを変更します。

[program:rabbitmq]
command=path/to/rabbitmq.sh 
37
Hui Zheng

このスクリプトは、RabbitMQをバックグラウンドプロセスとして(「&」を使用して)開始します。これにより、pidファイルが更新/作成されます( http://www.rabbitmq.com/man/rabbitmqctl.1の下の「wait」を参照)。 man.html )。

ウサギが開始された後、ループを使用してpidがまだ実行されていることを確認します。うさぎがクラッシュするか、手動でシャットダウンされた場合(supervisordの外部)、スクリプトは1で終了し、supervisordが引き継ぎます。

Echo >> ./rmq.txtファイルはデバッグ目的で存在し、本番環境でコメントアウトできます(これを使用して起動/シャットダウン/終了ステータスを監視しました)。

実行中のプロセスを確認でき、EXITがstop_rmq関数をトリガーして、クリーンシャットダウンのために「rabbitmqctlstop」を呼び出すため、supervisordは満足しています。

#!/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

スクリプトによって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
3
Michael Dyer

あなたはあなた自身の質問に答えました。通常の操作では、それが文書化された通常の管理方法でない限り、どのプロセスでもkillを使用しないでください。 RabbitMQの場合、文書化されたプロセスは、rabbitmqctl stopを使用するか、rabbitmqserverstopを使用することです。

Rabbitmqserverstartを介して再起動を1回試行するシェルスクリプトよりも高度なものでRabbitMQを管理する正当な理由はありません。それがすぐに機能しない場合は、RAMの不足、ディスクスペースの不足、または不正なシステム管理ツールがrabbitmqバイナリコンポーネントの一部を削除したなどの理由で、RabbitMQが大幅にダウンしています。

通常の操作では、RabbitMQには、RabbitMQのシャットダウンと再起動を試みる内部スーパーバイザーがあるため、バイナリを削除すると、再起動に失敗します。 chef、puppet、cfengineなどのツールを使用する場合は、バイナリパッケージファイルを繰り返しプッシュしないでください。すべてが正常に存在することを確認してください。

2
Michael Dillon

Monit( http://mmonit.com/ )を使用することをお勧めします。これは、RabbitMQなどのデーモンに適しており、機能も豊富です。

まず、Monitパッケージをインストールする必要があります。 Ubuntu/Debianを使用している場合:

Sudo apt-get update
Sudo apt-get install monit

その後、構成スクリプトを作成する必要があります。実行するためのサンプルスクリプトを次に示します(/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

次に、monitを再起動するだけで、完了です。

 Sudo /etc/init.d/monit restart
1
Gustavo Rauber