5

乗客と同じレールアプリを実行するロードバランサの2つのインスタンスがあります。デプロイすると、サーバーの起動時に要求がタイムアウトします。その結果、私たちは、LBから1つを取り出し、キャップで展開し、動的なページの負荷をテストし、LBに戻して、各Webサーバーを個別に更新するスクリプトを用意しています。カピストラノでローリング展開を行うにはどうすればよいですか?

私たちはカプリストラに1つのコマンドでこれを行うにはどうすればいいですか?私はすべてのインスタンスに同時に展開するように設定することができましたが、それらはすべて同時に再起動し、サイトは20秒間使用できなくなります。

私はここで何が欠けていますか?これは共通のパターンでなければならないようです。

+0

「すべて同時に再起動する」というメモに詳細を追加できますか?あなたはここで何を意味したのですか? –

答えて

0

実際にサーバー間ですべての操作を並列化することが大好きなカピストラーノでの展開をシリアライズするのは簡単ではありません。この問題を解決するには、少数のサーバーがあり、展開を更新するために各サーバーを順番にオフラインにする必要があるようです。

トリックはあなたの展開構成でdeploy:create_symlinkタスクをオーバーライドすることである。この場合、

def perform_task_offline options 
    sudo "take_this_server_offline", options 
    yield 
    sudo "put_this_server_online", options 
end 

def create_symlink_task options 
    # does what your existing deploy:create_symlink did, something like: 
    run "rm -f /web/current && ln -s #{release_path} /web/current", options 
end 

namespace :deploy do 

    task :create_symlink, {once: true, except: {no_release: true}} do 
    deployed_servers = Array.new 

    roles[:app].servers.each do |current_server| 
     options = {hosts: current_server} 
     deployed_servers.push current_server 
     perform_task_offline(options) { create_symlink_task options } 
    end 
    end 
end 

perform_task_offlineはしばらくそれyieldのロードバランサから削除optionsで指定されたサーバー上で実行するコマンドが含まれてブロックにはcreate_symlink_taskが含まれており、展開シンボリックリンクが作成されます。

標準のcapコマンドを実行すると、サーバーは順次オフラインになり、「現在の」シンボリックリンクが作成され、次に復帰します。

上記のコードは、正常に展開されたサーバーをdeployed_serversで追跡することに注意してください。以前にデプロイされていたサーバー上で、アクティブな失敗したデプロイメントをロールバックできるようにする(つまり、デプロイ中にが発生する)場合は、on_rollback doブロック内で同様のループが必要ですが、 deployed_serversのみ

関連する問題