WebSocket連接的負載平衡方法

2018-04-09 14:27


負載均衡問題一直是管理大型系統的熱點問題。負載平衡旨在優化資源使用,最大化吞吐量,最小化響應時間,避免任何單一資源的過載,因此解決此問題對于性能至關重要。在本文中,我們將介紹可能的問題解決方案。

為了更好地了解WS負載平衡,讓我們深入一下TCP套接字背景。默認情況下,單個服務器可以處理65,536個套接字連接,因為它是可用的TCP端口的最大數量。因此,作為WS連接具有TCP性質,每個WS客戶端都需要一個端口,我們可以肯定地說,websocket連接的數量也受到限制。

其實這是一個半真相。服務器可以處理每個IP地址65,536個套接字。因此,可以通過向服務器添加額外的網絡接口來輕松擴展數量。同時,跟蹤服務器上存在多少連接非常重要。

一旦超出限制,您可能會遇到其他TCP連接的許多問題(例如,無法通過ssh連接到服務器)。因此,限制應用程序代碼中每個節點的WS連接是一個好主意。當我們處理websockets時,我們在應用程序中也是一樣的。

一旦我們得到了主要的限制和克服它的方法,我們繼續進行負載平衡。下面我將介紹我們在一個項目中嘗試過的3種方法。請注意,所有系統部件已部署到AWS,一些提示和提示僅適用于Amazon配置。

ELB方法

實現負載平衡的最簡單方法就是使用彈性負載平衡器AWS提供的。可以將ELB切換到TCP模式,從而實現任何類型的TCP連接(包括websockets)的負載平衡。這種方法給出:

  • LB自動故障切換

  • 負載平衡節點自動縮放;

  • 非常容易的設置

基本上,對于大多數常見的情況來說,這是一個很好的解決方案,直到你的負載飛速增長。在這種情況下,ELB變得太慢,無法建立新的連接。有可能聯系亞馬遜并要求他們“預熱”ELB,但是由于負載測試的目的,當我們需要快速建立數千個WS連接并且由于系統的可用性而為我們的客戶而不是我們的選擇。

軟件負載均衡器

我們已經嘗試過HAProxy作為負載均衡器。但是要使HAProxy正常工作,請記住我們上面已經討論過的端口限制問題。為了使HAProxy處理65k以上的連接,我們應該通過以下步驟:

1.創建一堆私有IP地址。要做到這一點,選擇您的Amazon Instance - >操作 - >網絡 - >管理專用IP地址。也就是增加了3個IP地址:192.168.1.1,192.168.1.2,192.168.1.3。只要記住,IP應該在與真實應用服務器相同的子網中;

2.通過SSH連接到您的HAProxy實例并運行以下命令:

$> ifconfig eth0:1 192.168.1.1  $> ifconfig eth0:2 192.168.1.2  $> ifconfig eth0:3 192.168.1.3

這將向實例添加3個虛擬網絡接口;

3.配置HAProxy。以下是haproxy.cfg3個Erlang節點接受WS連接的文件。

listen erlang_front :8888          mode            http          balance         roundrobin          timeout connect 1s          timeout queue 5s          timeout server 3600s          option httpclose          option forwardfor          server          erlang-1 192.168.0.1:8888  source 192.168.1.1          server          erlang-2 192.168.0.2:8888  source 192.168.1.2          server          erlang-3 192.168.0.3:8888  source 192.168.1.3

現在,HAProxy可以處理超過65,536個websocket連接,并且可以通過添加虛擬網絡接口輕松增加連接的限制。此外,它可以建立新的連接相當快。

這種方法似乎是可行的,盡管存在以下缺點:

  • 故障轉移HAProxy實例應使用以下工具手動設置keepalived;

  • 在添加新的Erlang節點時,必須完成重新配置HAProxy的任務;

  • 隨著連接數量的增加,水平方向不能縮放HAProxy。我們只有垂直選項可用,所以當我們有越來越多的活躍用戶時,我們應該為HAProxy(和HAProxy鏡像節點)獲得越來越多昂貴的實例。

我們很好,這些缺點,但更簡單的解決方案被實施。這是可能的,因為我們已經有一些代碼實現了,我們的系統設計允許我們使用自定義的方法。

定制方法

要繼續前進,請查看顯示系統架構的下圖。

北京Web軟件開發公司

我們有一個JavaScript客戶端應用程序,一個負責用戶授權的認證應用程序和具有主要應用程序功能的Erlang應用程序。流程如下:

  1. 客戶端向認證應用程序發送具有憑據的HTTP請求;

  2. 認證應用程序檢查信譽,生成令牌并通過HTTP請求將其發送到Erlang群集;

  3. Erlang應用程序確認收到的令牌并向Auth應用程序發送確認的HTTP響應;

  4. 認證應用程序向客戶端應用程序發送HTTP響應。此響應包括生成的令牌;

  5. 客戶端使用令牌通過我們的HAProxy負載平衡器與Erlang應用程序建立websocket連接。

這是我們的基本流程略有修改。我們向Erlang應用程序添加了一個簡單的模塊來跟蹤每個Erlang節點上的Websocket連接數。由于Erlang的“分布式”性質,每個節點都知道其他節點的連接。

所以我們可以選擇一個連接較少的節點。我們拿這個節點的公共IP地址,然后發送回auth應用程序。然后,認證應用程序將該IP與令牌一起發送回客戶端。客戶端建立與接收的IP地址和令牌的WS連接。所以最終圖如下所示:

北京WebSocket軟件開發公司

現在我們可以:

  • 擺脫WS負載平衡器,這使得我們的系統變得不那么復雜;

  • 添加Erlang節點,而不需要重新配置系統的其他部分。

此外:

  • WS連接現在均勻分布在Erlang節點之間;

  • 系統容易水平縮放;

  • 我們不必為Ellang節點使用Elastic IP。



服務支持

我們珍惜您每一次在線咨詢,有問必答,用專業的態度,貼心的服務。

讓您真正感受到我們的與眾不同!

广西快三计划软件手机