
我有三個 Tomcat 實例在 HAProxy 後面運行。當我對 Web 應用程式進行更改時,我希望進行滾動部署(即一次彈起一個 Tomcat),以便用戶不會看到任何停機時間。
我該怎麼做呢?我看到正在運行的 haproxy 實例可以進行熱重新配置(這有利於添加或刪除新的池伺服器),但是當其中一台目標伺服器暫時關閉時,HAProxy 會如何反應?
如果有比 HAProxy 更好的解決方案,我也願意考慮。
謝謝!
答案1
我向 Willy Tarreau 發送了一封電子郵件,並獲得了以下選項:
您可以對統計伺服器使用熱重新配置或 socat 命令將目標伺服器的權重設為 0。
您可以將 http-check disable-on-404 選項與「option httpcheck /myurl」結合設置,然後讓目標伺服器回應 /myurl,這樣如果一切正常,它們會發送 200 狀態,如果伺服器應該發送 404停止接收新請求,如果伺服器沒有收到任何內容(即當您準備好退回伺服器時),則傳回500。 haproxy 將依照伺服器列中指定的時間間隔重新檢查伺服器。
答案2
因為 HAProxy 不支援在不根據 @ 重新配置的情況下刪除歐內斯特·穆勒在他的回答,當您還要求其他方案時,我將為您提供替代方案。
我用LVS,這是我最喜歡的負載平衡解決方案之一,因為它不僅僅可以用於 HTTP。
借助 LVS,您可以ipvsadm
手動新增和刪除伺服器。以下命令是刪除的範例:
/sbin/ipvsadm -e -t VIP:443 -r SERVERIP:443 -g -w WEIGHT
與透過與 LVS 互動來手動新增和刪除相反,我通常更喜歡使用以下request
選項:ldirectord
。 ldirector 是一個守護進程,用於輪詢和管理您的 ipvs 設定。您可以使用該參數指定具有 URI 路徑的檔案。在推出期間,您刪除該檔案並等待伺服器停止被存取。此時,您可以部署程式碼而不影響生產客戶端。
答案3
這很大程度上取決於您是否在 Tomcat 上進行任何會話/狀態管理。如果使用者的會話因重新啟動而被破壞,則滾動不會阻止使用者影響(它可能會阻止他們看到 500,但不會阻止他們重新啟動會話)。如果您不使用粘性會話,那麼您可能不必擔心這一點。
HAproxy 和其他負載平衡器有辦法快速確定背後的伺服器是正常運作還是關閉,並據此重新路由流量(HAProxy 中的「運作狀況檢查」)。然而,他們不可能完美地做到這一點。對於 Tomcat,不僅有「向上」和「向下」;還有「向上」和「向下」。有“向上,就像在端口上響應一樣,但事情還沒有準備好”。因此,您不應該依賴 LB 來完全防止用戶面臨影響 - 即使進行了良好的運行狀況檢查,也會在一段時間內將流量發送到壞節點。
我們對滾動部署所做的事情是主動將伺服器從負載平衡器中取出,然後擾亂/重新啟動節點,等到它通過自動化測試/監控,然後將其放回,然後移動到下一個伺服器。使用負載平衡器可以更輕鬆地實現這一點,該負載平衡器具有可以遠端呼叫的 API(例如從腳本)來停用伺服器 - 我們的舊 Netscaler 可以做到這一點,但 HAProxy 沒有。使用HAProxy,您要么必須編輯配置並重新啟動(悲傷),要么您可以將運行狀況檢查更改為您可以操縱它的位置- 就像當您希望它省略該節點時它可能會檢查您重命名的魔術文件一樣。您必須等待運行狀況檢查觸發並且節點退出集群,但之後應該就沒問題了。
我跑過這個帖子有一個與 iptables 相關的解決方案來解決這個問題...