5

monit を使用してプロセス グループのローリング再起動を実現する方法について、誰か提案はありますか?

前もってありがとう、フタートル

4

1 に答える 1

4

どのサーバーについて話しているのかわかりません。ただし、ローリング再起動自体をサポートするシンの例を提供できます。(オプションonebyone: true)

monit には、次のようなものを使用できます。

if ... then exec '/path/to/thin_restart.sh'

そしてthin_restart.sh、次のようなものになります。

source /path/to/scripts/rvm
rvm use your_gemset@some_ruby
thin -C thin.yml restart

そして、thin.yml の内容は次のようになります。

port: 1337
pid: tmp/pids/thin.pid
rackup: /path/to/config.ru
daemonize: true
servers: 2
onebyone: true

この再起動を pid に基づいて微調整する方法は他にもあります。pid でファイルを監視し、条件に基づいてそれらのシン プロセスのみを再起動できます。

例えば

check process app-1337
  with pid /path/to/app.1337.pid
  start = 'thin -d -p 1337 start'
  stop  = 'thin -d -p 1337 -P /path/to/thin.1337.pid stop'
  if cpu usage > 50% then restart
check process app-1338
  with pid /path/to/app.1338.pid
  start = 'thin -d -p 1338 start'
  stop  = 'thin -d -p 1338 -P /path/to/thin.1338.pid stop'
  if cpu usage > 50% then restart

もう 1 つの方法は、monit が提供するグループを使用することです。

上記の例を拡張します。

check process app-1337
  with pid /path/to/app.1337.pid
  group thin
  group thin-odd
  start = 'thin -d -p 1337 start'
  stop  = 'thin -d -p 1337 -P /path/to/thin.1337.pid stop'
  if cpu usage > 50% then restart
check process app-1338
  with pid /path/to/app.1338.pid
  group thin
  group thin-even
  start = 'thin -d -p 1338 start'
  stop  = 'thin -d -p 1338 -P /path/to/thin.1338.pid stop'
  if cpu usage > 50% then restart
check process app-1337
  with pid /path/to/app.1339.pid
  group thin
  group thin-odd
  start = 'thin -d -p 1339 start'
  stop  = 'thin -d -p 1339 -P /path/to/thin.1339.pid stop'
  if cpu usage > 50% then restart
check process app-1340
  with pid /path/to/app.1340.pid
  group thin
  group thin-even
  start = 'thin -d -p 1340 start'
  stop  = 'thin -d -p 1340 -P /path/to/thin.1340.pid stop'
  if cpu usage > 50% then restart

したがって、次のようにしてすべてを再起動できます。

monit -g thin restart

または、一種のローリング再起動を実現するには、奇数を再起動してから偶数を再起動します。奇妙なものだけを再起動するには:

monit -g thin-odd restart

さらに再起動するには:

monit -g thin-even restart
于 2013-02-10T15:15:45.620 に答える