對於給定的情況,您對軟體負載平衡器或負載共享器有何建議?

對於給定的情況,您對軟體負載平衡器或負載共享器有何建議?

我已經配置了一台具有 8 個核心的伺服器,並計劃部署網路服務。為了分散請求負載,我想運行 8 個服務實例。這裡沒有什麼令人震驚的。我無權訪問硬體負載平衡器。我應該提到的是,我目前已經分配了 5 個公共 IP 位址(但我可以獲得更多)。

因此,我想聽聽您關於建立軟體負載平衡解決方案的建議。

顯而易見的選擇是:

  • 使用HAProxy;或者
  • 預分叉我的應用程式(就像 Facebook Tornado 和 Unicorn 一樣);
  • 在此插入您的想法

我的目標是:

  • 在服務執行個體之間分散請求負載;和
  • 允許滾動重新啟動我的服務(代碼升級)。

我應該提到,這不是基於 HTTP 的服務,因此 NGiNX 等已經過時了。

我不喜歡 HAProxy,因為它對記憶體有要求;每個客戶端連線似乎都需要一個讀寫緩衝區。因此,我將在核心層級、HAProxy 和我的應用程式中擁有緩衝區。這真是越來越傻了!也許我在這方面遺漏了一些東西?

謝謝!

答案1

無論採用什麼解決方案,如果您安裝一個進程來轉發流數據,它將需要每個連接緩衝區。這是因為您不能總是發送收到的所有內容,因此您必須將多餘的內容保留在緩衝區中。也就是說,記憶體使用量取決於並發連接的數量。一個大型站點正在愉快地運行 haproxy,預設為 150000 個並發連接(4 GB RAM)。如果您需要更多,1.4 版允許您調整緩衝區大小而無需重新編譯。但是,請記住,每個套接字的核心緩衝區永遠不會低於每個方向和每個套接字 4kB,因此每個連接至少 16 kB。這意味著讓 haproxy 在每個緩衝區小於 8 kB 的情況下運行是沒有意義的,因為它的消耗已經小於核心的消耗。

另外,如果您的服務是純 TCP 且代理程式沒有附加價值,請考慮基於網路的解決方案,例如 LVS。它要便宜得多,因為它處理資料包並且不需要維護緩衝區,因此套接字緩衝區在滿時會丟棄資料包,並且它可以與服務安裝在同一台機器上。

編輯:哈維爾,依賴作業系統進行負載平衡的預分叉進程根本無法很好地擴展。作業系統喚醒每一個當它獲得連接時繼續處理,只有其中一個獲得連接,所有其他人再次進入睡眠狀態。多進程模式下的 Haproxy 在 4 個進程左右表現出最佳效能。在 8 個進程時,效能已經開始下降。 Apache 使用了一個很好的技巧來解決這個問題,它對accept() 進行鎖定,以便只有一個進程在等待accept。但這會破壞作業系統的負載平衡功能,並停止在 1000 到 2000 個進程之間進行擴充。它應該使用一個由幾個鎖組成的數組,以便喚醒一些進程,但它沒有這樣做。

答案2

如果沒有任何有關您的服務的詳細信息,很難說;但總的來說,我傾向於預分叉。這是一個經過驗證的真實伺服器策略(而不是像一些人在閱讀龍捲風/獨角獸粉絲網站後認為的新奇技巧)。

除此之外,還有一些提示:

  • 每個預分叉進程都可以使用現代非select策略(主要是 libevent)來處理大量用戶端。

  • 核心和進程之間的 1:1 關係很少能提供最佳效能;通常最好對負載進行一些動態適應性。

相關內容