我們有一個負載均衡器後面有兩個實例,它們與乘客運行相同的應用程序。部署時,服務器啓動時間會導致請求超時。因此,我們有一個腳本,通過從LB中取下一個Web服務器,單獨更新每個Web服務器,使用cap進行部署,測試動態頁面加載並將其放回LB.你如何做與capistrano滾動部署?
我們怎樣才能讓卡皮斯特拉諾用一個命令爲我們做到這一點?我已經能夠將其設置爲同時部署到所有實例,但它們都在同一時間重新啓動,並導致該站點在20秒內不可用。
我在這裏錯過了什麼?似乎這應該是一種常見模式。
我們有一個負載均衡器後面有兩個實例,它們與乘客運行相同的應用程序。部署時,服務器啓動時間會導致請求超時。因此,我們有一個腳本,通過從LB中取下一個Web服務器,單獨更新每個Web服務器,使用cap進行部署,測試動態頁面加載並將其放回LB.你如何做與capistrano滾動部署?
我們怎樣才能讓卡皮斯特拉諾用一個命令爲我們做到這一點?我已經能夠將其設置爲同時部署到所有實例,但它們都在同一時間重新啓動,並導致該站點在20秒內不可用。
我在這裏錯過了什麼?似乎這應該是一種常見模式。
實際上,在capistrano中序列化部署並不簡單,它喜歡並行化所有服務器之間的操作。重申這個問題,似乎你有一些服務器,並希望每個服務器都按順序離線更新部署。
關鍵是要覆蓋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
包括在options
指定的服務器上執行,從負載均衡器中刪除命令,而它yield
S中塊包括create_symlink_task
,它創建部署符號鏈接。
然後,您應該能夠運行標準的cap
命令進行部署,並且您將看到服務器按順序脫機,創建「當前」符號鏈接,然後再回來。
請注意,上面的代碼跟蹤已成功部署到deployed_servers
的服務器。如果您希望只能在以前部署到的服務器上回滾活動的失敗部署(即在部署期間發生故障),則需要在on_rollback do
塊內部有類似的循環,但只有deployed_servers
。
您能否在註釋「所有重啓同時」中添加更多詳細信息?你在這裏意味着什麼? –