2012-01-18 208 views
15

我想確定如何加載平衡TCP流量。我瞭解HTTP負載平衡如何工作,因爲它是一個簡單的請求/響應架構。但是,我不確定您的服務器在嘗試向其他客戶端寫入數據時如何負載均衡TCP流量。我附上了一個簡單TCP聊天服務器的工作流程圖,我們希望在N臺應用程序服務器之間平衡流量。是否有任何負載均衡器可以做我想做的事情,還是我需要研究一個不同的主題?謝謝。您如何負載均衡TCP流量?

enter image description here

+1

像你提出的平行佈局負載平衡它有一些問題,你注意到。以IRC爲例,它具有樹形佈局(這有助於同步並簡化向每個人發送的消息),並且根據例如,樹經過樹的數據量並不是那麼多。儘管他們有將近8萬用戶,但它仍然是freenode的運營商。 – 2012-01-19 09:25:18

回答

14

首先,您的圖假定負載平衡器被用作(TCP)代理,這並非總是如此。通常使用直接路由(或直接服務器返回),或執行目標NAT。在這兩種情況下,後端服務器和客戶端之間的連接都是直接的。所以在這種情況下,它本質上是分佈在後端服務器中的TCP握手。詳情參見以下內容:

顯然TCP代理確實存在(HAProxy的是一個),在這種情況下,代理管理connecton的兩邊,這樣你的應用程序需要能夠通過傳入IP /端口識別客戶端(這恰好來自代理而不是客戶端)。代理將處理將消息回送給客戶端。無論哪種方式,它都歸結爲應用程序設計,因爲我會想像棘手的一點是有一個共同的會話存儲(某種類型的數據庫或key =>值存儲,如Redis),以便當您的應用程序服務器說:「我需要發送一條消息給弗蘭克」,它可以確定哪個後端服務器弗蘭克連接到(從數據庫),並通知服務器發送消息。通過持久連接(所有負載平衡器都可以這樣做),或通過使用像websocket這樣的固有持久性,可以減少連接(來自同一客戶端)在不同後端服務器之間的連接問題。

這可能是一個巨大的過分簡化,因爲我沒有聊天軟件的經驗。很明顯,DB服務器本身可以分佈在多臺機器中,以實現容錯和負載平衡。

+0

感謝您提供豐富的答案。我將不得不深入瞭解這些主題以瞭解更多。你知道有什麼好的資源來學習更多關於負載均衡的知識嗎?謝謝! – 2012-01-19 14:21:32