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
まとめ
無事自動再起動はできましたが、以下問題を解決する必要があります。
- counterpartydサーバーの冗長化(counterpartydの再起動には時間がかかる)
- counterpartydプロセスの停止の原因調査(まだはっきり分かっていない)
- 適切なサーバースペックの確認(2の原因調査が必要)
やらないといけないことが多いですね.. 少しずつ解決していきます。
参考
Use Monit monitor a python program
CentOS 6.5にmonitをインストールしてプロセス監視をする
Google Cloud Monitoring: Restart a process automatically when detecting error