capistrano-sidekiq を使ったデプロイが不定期に事故るので直した話
前提
-
capistrano-sidekiq は
v0.5.4
を使ってた(最新版の1個前) - capistranoでデプロイ後にsidekiqがバグる
- sidekiqのプロセスが古いままで再起動ができておらず、
sidekiq.pid
を見ても立ち上がってるプロセスとズレてておかしい - sidekiqが指定されたプロセス以上の数が立ち上がる
- sidekiqのプロセスが古いままで再起動ができておらず、
対応方法
capistrano-sidekiq のタイミングがよくわからんので、やめて自前でコマンド実行
# sidekiq
set :sidekiq_pid_path, -> { File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') }
namespace :sidekiq do
desc 'sidekiq stop'
task :stop do
on roles(:app) do
execute "kill -USR1 `cat #{fetch :sidekiq_pid_path}`; true"
end
end
before 'deploy:updated', 'sidekiq:stop'
desc 'sidekiq kill'
task :kill do
on roles(:app) do
execute "kill -TERM `cat #{fetch :sidekiq_pid_path}`; true"
end
end
after 'deploy:finishing', 'sidekiq:kill'
end
シンプルにデプロイ前にstoppingし、完了したら完全にkillします
参考: http://qiita.com/pekepek/items/8eb302c997335fbce854
その後、monitがsidekiqを叩き起こすようになってます。
却下案
capistrano-sidekiq を最新版にしたらこの問題が解決しないかと検討したが、pidのファイル名になぜか0が追加される事象に遭遇。
Githubを覗いたら、 Change pidfile handling, always add index to pidfile name by w1mvy でそうするような処理が入ってた。
インフラ的な変更も入るし、そもそもこのgemを上げたら前提のところに書いてある問題が解決されるのかわからなかったため、シェルスクリプトでやることにしました。。。
一言
結局、capistranoがsymlinkを入れ替える前にsidekiqが起動してるのかその辺が結局よくわからなかったが、自前でやったら安定しましたよというお話。