HAProxy——暫停/排隊所有流量而不失去請求
我基本上遇到了與該執行緒中提到的相同的問題-我想暫時暫停對某個後端的所有伺服器的所有請求,以便升級後端及其使用的數據庫。由於這是一個實時系統,我想將請求排隊,並在升級後將它們發送到後端伺服器。由於我正在通過程式碼更改進行數據庫升級,因此我必須同時升級所有後端伺服器,所以我不能一次只關閉一個。
我嘗試使用 tcp-request 選項並結合刪除該執行緒中提到的靜態執行狀況檢查文件,但沒有運氣。將預設的“maxconn”值設置為 0 似乎會根據需要暫停和排隊連接,但是如果不重新啟動 HAProxy 似乎無法將值增加到正數,這會殺死所有排隊的請求直到那個觀點。(使用 -sf 和 -st 的“熱重新配置”選項啟動了一個新程序,這似乎沒有達到我想要的效果)。
我正在嘗試做的事情可能嗎?
我最終向 HAProxy 的作者 Willy Tarreau 提出了這個問題。他對我的建議很感興趣,並對 HAProxy 做了一個小改動,允許通過管理套接字將 maxconn 設置為零(這在我問的時候是不可能的),這解決了我的問題。引用我發給他的後續電子郵件:
你好呀。這很好地解決了我的問題。我發出“set maxconn frontend my_frontend 0”,等待幾秒鐘讓連接耗盡,然後所有後續連接都暫停。我重新啟動伺服器,發出“set maxconn frontend my_frontend 3000”,連接正常恢復,現有請求沒有出錯。
作為對 JesseP 的回答——當然,大多數時候我都不想這樣做。我們通常會嘗試按照您提到的方式進行數據庫遷移,因為暫停流量充其量是有風險的。我們的一些使用者設置了低得離譜的客戶端超時,所以我們通常不希望流量暫停超過 15 秒。但是對於最近的一次遷移,我們需要同時執行一組複雜的程式碼和數據遷移,提供此選項是一種救命稻草。
因此,總而言之——不建議將其用於日常使用,但如果需要,可以選擇。