capistranoで時間差deployしたい

capistranoを導入して、周回遅れではてなと同じ問題にぶつかってる弊社【何】

id:secondlife said ...

同時命令 - SwitchTower の影

10台サーバがあればすべて同時に restart

  • production でいきなり10台が再起動で数秒間落ちる
  • 時間差欲しい…

途中で1つ失敗すると全部ロールバック

  • タイミングにより httpd の restart が失敗する場合も
  • 9/10台成功してるけど、ロールバックする

    • 一台だけやり直したいのに!

これは公開してないぽい? はてなspecificではなくて、結構一般的な問題だと思うんだけど。

というわけで、明日か明後日あたりこれを書くか。

2007-05-06追記

時間差を付けて、

  • サーバーの半分をクラスタから切り離して処理
  • クラスタに戻す
  • 残り半分を自動的に残りを同じ手順で

とか考えてた。それでちょっと悩んだけど、良く考えたら半分だけデプロイした時点でクラスタに戻す前に実際にアクセスして確認したいし、全部自動で流れていってしまうのは好ましくない。

だから、クラスタを縮退して半分にデプロイしたあと、一度capコマンドは終了して、残り半分は手動でcapコマンドを再度走らせるのが望ましい挙動だった。だとすると、必要なのはユーザーが指定に応じて:app roleをマスキングする処理だ。あんまり難しいことは必要なかった。

config/deploy.rbの末尾にこんなのを足してみた。

if /\A\d+\.\.\.?\d+\Z/ =~ target
  roles[:app] = roles[:app][eval(target)]
end

これで、

% cap -S target=0...3 deploy

とかやると、app serverの0番目から2番目までにだけdeployを行なう。