簡體   English   中英

水平擴展 WebSocket 服務器上的負載平衡套接字?

[英]Load balancing sockets on a horizontally scaling WebSocket server?

每隔幾個月在思考一個涉及套接字的個人項目時,我就會發現自己有一個問題: “您如何在動態水平擴展的 WebSocket 服務器上正確地對套接字進行負載平衡?”

我了解水平擴展 WebSockets 和使用發布/訂閱模型將數據發送到為特定用戶保存套接字連接的正確服務器背后的理論。 我想我了解有效識別具有最少當前套接字連接的服務器的方法,我也想路由新的套接字連接。 我不明白的是如何有效地將新的套接字連接路由到您選擇的具有低套接字數的服務器。

我不認為這個答案會與特定的服務器實現相關聯,而是可以應用於大多數服務器。 我可以很容易地看到自己用 vert.x、node.js 甚至完美的方式實現了這一點。

首先,您需要定義您所詢問的問題的界限。 如果您真的在談論動態水平擴展,您可以根據總負載啟動和關閉服務器,那么這是一個更復雜的問題,而不僅僅是找出路由最新傳入的新套接字連接的位置。

為了解決這個問題,你必須有一種方法將一個套接字從一個主機“移動”到另一個主機,這樣你就可以清除你想要降速的主機的連接(我在這里假設真正的動態縮放會上升和下降)下)。 我看到這樣做的通常方法是讓一個合作的客戶端參與進來,在那里你告訴客戶端重新連接,當它重新連接時,它會負載平衡到不同的服務器上,這樣你就可以清除你想要降速的服務器。 如果你的客戶端已經有自動重新連接的邏輯(就像 socket.io 那樣),你可以讓服務器關閉連接,客戶端會自動重新連接。

至於傳入客戶端連接的負載平衡,您必須決定要使用的負載指標。 最終,您需要為每個服務器進程打分,告訴您您認為它有多“忙”,以便您可以在最不忙的服務器上建立新連接。 一個基本的分數只是當前連接的數量。 如果您的每個服務器進程有大量連接(數以萬計),並且您的應用程序中沒有特別的原因表明某些連接可能比其他的更忙,那么大數定律可能會平均負載,因此您可以逃脫每個服務器有多少連接。 如果連接的使用不是那么公平甚至不公平,那么您可能還必須考慮 CPU 負載的某種時間移動平均值以及連接總數。

如果您要在多個物理服務器之間進行負載平衡,那么您將需要一個每個人最初都連接到的負載平衡器或代理服務,並且該代理可以查看池中所有當前正在運行的服務器的指標並將連接分配給當前得分最低的一個。 這可以通過代理方案或(更具可擴展性)通過重定向來完成,以便代理在初始分配后避開。

然后,您還可以有一個過程來定期檢查集群中所有服務器上的負載分數(無論您決定如何計算它),並決定何時啟動新服務器或何時關閉一個服務器或何時事情太遠了給定服務器上的平衡,並且需要告訴該服務器關閉多個連接,迫使它們重新平衡。

我不明白的是如何有效地將新的套接字連接路由到您選擇的具有低套接字數的服務器。

如上所述,您可以使用代理方案或重定向方案。 在連接時成本稍高的情況下,我更喜歡重定向方案,因為它在運行時更具可擴展性,並且為現有連接創建的故障點更少。 所有客戶端都連接到您的傳入連接網關服務器,該服務器負責了解場中每台服務器的當前負載分數,並根據該分數將傳入連接分配給得分最低的主機,然后重定向此新連接重新連接到您場中的特定服務器之一。


我還看到過純粹由自定義 DNS 實現完成的負載平衡。 客戶端請求farm.somedomain.com IP 地址,並且該自定義 DNS 服務器為他們提供了希望分配給他們的主機的 IP 地址。 查找farm.somedomain.com的 IP 地址的每個客戶端可能會獲得不同的 IP 地址。 您可以通過在自定義 DNS 服務器中添加或刪除主機來啟動或關閉主機,而自定義 DNS 服務器必須包含用於了解負載平衡邏輯和所有正在運行的主機的當前負載分數的邏輯。

將 websocket 請求路由到負載均衡器,負載均衡器決定將連接發送到哪里。

例如, HAProxy有一個用於長連接的leastconn方法,該方法選擇連接數最少的最近最少使用的服務器。

HAProxy 后端服務器權重也可以通過外部輸入修改,@jfriend00在他們的回答中詳細介紹了權重的技術細節。

我發現這個項目可能有用: https : //github.com/apundir/wsbalancer

描述中的一個片段:

Websocket 平衡器是一個有狀態的 websockets 反向代理。 它在多個可用的后端分發傳入的 websocket。 除了負載均衡之外,均衡器還負責在會話中途異常故障的情況下從一個后端透明地切換到另一個后端。 在此故障轉移期間,遠程客戶端連接保持原樣,因此遠程客戶端甚至看不到此故障轉移。 盡一切努力確保在此故障轉移期間不會丟棄任何消息。

關於您的問題:如果配置為這樣做,則該新連接將由負載均衡器路由。

正如@Matt 所提到的,例如使用 leastconn 選項的 HAProxy。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM