読者です 読者をやめる 読者になる 読者になる

Counterpartydプロセスが落ちたらMonitで自動的に再起動する

Counterpartydよく落ちますよね...

bitcoindやcounterpartydのプロセスが急に落ちる.. というのは多くの方が経験してますよね。障害が発生したらSlackで通知受けてから対応するって流れをしばらくやってきましたが、それではマズイのでMonitを使ったプロセス再起動を導入しました。

Google Cloud Monitoringで監視、Slack通知してました

僕はGCPを使っていて、監視にはGoogle Cloud Monitoring(旧名:Stackdriver)を使っています。ブラウザからポチポチ設定するだけでプロセス監視・HTTP監視、Slack連携までできて便利です。(今はUIは微妙だけどすぐに良くなるはず)

プロセス再起動ができるMonit

Google Cloud Monitoringは便利なんですが、エラー検知後の自動復旧機能がありません。そこでMonitが良いと聞いたので早速試してみます。

Monit - Up and running in 15 minutes!

Monit is a small Open Source utility for managing and monitoring Unix systems.

Monitの設定からテストまで(Counterpartydプロセス)

1. インストール

Ubuntu環境でのインストール方法です

$ sudo aptitude install monit
$ ps -ef | grep monit
root     24811     1  0 05:42 ?        00:00:00 /usr/bin/monit -c /etc/monit/monitrc

2. Counterparty起動スクリプト作成

Counterparty起動スクリプトを作ります。

/path/to/script/counterparty.sh

#!/bin/bash

PIDFILE=/path/to/pid/counterparty.pid

case $1 in
   start)
       /usr/bin/python3 /usr/local/bin/counterparty-server \
       --config-file=/path/to/conf/server.conf  \
       --database-file=/path/to/db/counterparty.db  \
       --log-file=/path/to/log/server.log  \
       --api-log-file=/path/to/log/server.access.log start & echo $! > ${PIDFILE}
   ;;
   stop)
      kill `cat ${PIDFILE}`
      rm ${PIDFILE}
   ;;
   *)
      echo "usage: scraper {start|stop}" ;;
esac
exit 0

3. monit設定ファイル作成

monit設定ファイルは/etc/monit/conf.d/に保存します。

/etc/monit/conf.d/counterparty

check process counterparty
  with pidfile /path/to/pid/counterparty.pid
  start program = "/path/to/script/counterparty.sh start"
  stop program = "/path/to/script/counterparty.sh stop"
  
  group counterparty

4. 監視間隔変更

今回はテストなので短めの30秒に設定します。

/etc/monit/monitrc

set daemon 30

5. テスト。まずCounterpartydを起動

まずCounterpartydを起動をします。

sudo /path/to/script/counterparty.sh start

6. Monit再起動

Monitを再起動します。

sudo service monit restart

7. Counterpartydプロセスを停止

Counterpartydプロセスを停止します。

sudo kill -9 (プロセスID)

8. Monitのログ確認

プロセス停止を検知して再起動していることが分かりますね。

/var/log/monit.log

[JST Feb  4 05:29:11] error    : 'counterparty' process is not running
[JST Feb  4 05:29:11] info     : 'counterparty' trying to restart
[JST Feb  4 05:29:11] info     : 'counterparty' start: /path/to/script/counterparty.sh
[JST Feb  4 05:29:41] info     : 'counterparty' process is running with pid 614

bitcoindも同時に落ちる場合あるよね。そんな時は依存設定を使う

Counterpartyd単体だったら上記のやり方だけでも問題ないですが、bitcoindが落ちている場合は何度counterpartydを起動してもエラーになります。このような依存関係を解決する方法が"Service Dependencies"です。以下手順で依存関係を設定します。

1. bitcoind起動スクリプト作成

bitcoind用の起動スクリプトを作成します。

/path/to/script/bitcoin.sh

#!/bin/bash

PIDFILE=/path/to/pid/bitcoin.pid

case $1 in
   start)
       /path/to/bitcoind --conf=/path/to/conf/bitcoin.conf --pid=${PIDFILE}
   ;;
   stop)
      kill -9 `cat ${PIDFILE}`
      rm ${PIDFILE}
   ;;
   *)
      echo "usage: scraper {start|stop}" ;;
esac
exit 0

2. bitcoind用のmonit設定ファイル作成

bitcoind用のmonit設定ファイルを作成します。

/etc/monit/conf.d/bitcoin

check process bitcoin
  with pidfile /path/to/pid/bitcoin.pid
  start program = "/path/to/script/bitcoin.sh start"
  stop program = "/path/to/script/bitcoin.sh stop"

  group bitcoin

3. counterpartyd用のmonit設定ファイル修正

bitcoind用のmonit設定ファイルにdepends on bitcoinを追加します。

/etc/monit/conf.d/counterparty

check process counterparty
  with pidfile /path/to/pid/counterparty.pid
  start program = "/path/to/script/counterparty.sh start"
  stop program = "/path/to/script/counterparty.sh stop"
  
  group counterparty
  
  depends on bitcoin

4. テスト。試しに依存元(bitcoind)をkillしてみる。

monit再起動後、bitcoindをkillします。

# service monit restart
# kill -9 {bitcoindのプロセス}

bitcoindは起動され、依存先のcounterpartydも再起動していますね。たぶん大丈夫な動きになってます。

[JST Feb  4 09:13:02] error    : 'bitcoin' process is not running
[JST Feb  4 09:13:02] info     : 'bitcoin' trying to restart
[JST Feb  4 09:13:02] info     : 'counterparty' stop: /path/to/script/counterparty.sh
[JST Feb  4 09:13:02] info     : 'bitcoin' start: /path/to/script/bitcoin.sh
[JST Feb  4 09:13:02] info     : 'counterparty' start: /path/to/script/counterparty.sh

まとめ

無事自動再起動はできましたが、以下問題を解決する必要があります。

  1. counterpartydサーバーの冗長化(counterpartydの再起動には時間がかかる)
  2. counterpartydプロセスの停止の原因調査(まだはっきり分かっていない)
  3. 適切なサーバースペックの確認(2の原因調査が必要)

やらないといけないことが多いですね.. 少しずつ解決していきます。

参考

Use Monit monitor a python program

monitで手軽にプロセスの監視を行う

CentOS 6.5にmonitをインストールしてプロセス監視をする

Google Cloud Monitoring: Restart a process automatically when detecting error

SERVICE-DEPENDENCIES

TipMe

TipMe with IndieSquare