5

我們有一個負載均衡器後面有兩個實例,它們與乘客運行相同的應用程序。部署時,服務器啓動時間會導致請求超時。因此,我們有一個腳本,通過從LB中取下一個Web服務器,單獨更新每個Web服務器,使用cap進行部署,測試動態頁面加載並將其放回LB.你如何做與capistrano滾動部署?

我們怎樣才能讓卡皮斯特拉諾用一個命令爲我們做到這一點?我已經能夠將其設置爲同時部署到所有實例,但它們都在同一時間重新啓動,並導致該站點在20秒內不可用。

我在這裏錯過了什麼?似乎這應該是一種常見模式。

+0

您能否在註釋「所有重啓同時」中添加更多詳細信息?你在這裏意味着什麼? –

回答

0

實際上,在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