socket.io服務多節點(負載均衡)和反向代理部署方案


(1)使用nginx做長連接服務(websocket、socket.io)的負載均衡

(2)使用nginx做長連接服務(websocket、socket.io)的反向代理

(3)通過ip_hash的均衡策略保證長連接服務(websocket、socket.io)的正常訪問。

 

 

為提高用戶的訪問效率,生產環境需要部署至少兩台socket.io服務,那么就需要保證長連接的請求正常。

(1)服務性能可通過水平拓展節點來提高

(2)保證了長連接的正常訪問

 

3、成效說明

(1)提高了服務的性能,緩解高並發下單節點響應速度慢的問題。

(2)提高了服務的可用性,當其中一個服務宕機時,另外至少一個服務正常運行中,可保證用戶的繼續使用。

(3)提高了服務的穩定性,當流量飆升時,可以通過水平拓展服務節點來保證服務的穩定,避免宕機。

 

 

技術方案的詳細說明

1、技術說明

架構圖如下所示:

 

 

nginx配置文件內容:

upstream collaboration_servers { ip_hash; server 172.24.126.2:3000; server 172.24.126.2:3001; server 172.24.126.2:3002; server 172.24.126.2:3003; } server { listen 3333; server_name collaboration.com; location /socket.io/ { proxy_pass http://collaboration_servers; # WebScoket Support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 900; proxy_send_timeout 900; proxy_read_timeout 900; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; } access_log /var/log/nginx/collaborationserverLog.log main; }

 

 

2、難點說明 

使用nginx做負載均衡后,測試時發現長連接經常斷開,導致游戲流程無法繼續。

經過查看,是由於長連接都是有狀態的,每個長連接都會有一個固定的id,要保證這個id的連接一直穩定訪問同一台服務器實例,否則會出現不斷登錄登出的問題。

那么就需要讓Nginx實現讓同一個用戶訪問同一個服務。

經過對nginx負載策略的資料查閱,經過測試后確認,可以使用ip_hash的方式進行負載均衡。

通過配置Nginx的均衡策略為ip_hash來解決:

ip_hash介紹:

Specifies that a group should use a load balancing method where requests are distributed between servers based on client IP addresses. The first three octets of the client IPv4 address, or the entire IPv6 address, are used as a hashing key. The method ensures that requests from the same client will always be passed to the same server except when this server is unavailable. In the latter case client requests will be passed to another server. Most probably, it will always be the same server as well. 譯文:指定一個組應該使用負載平衡方法,其中請求基於客戶端IP地址分布在服務器之間。客戶端IPv4地址的前三個八進制數,或者整個IPv6地址,用作一個散列鍵。該方法確保來自同一客戶端的請求將始終傳遞到同一服務器,除非該服務器不可用時。在后一種情況下,客戶機請求將被傳遞到另一個服務器。最可能的情況是,它也將始終是同一台服務器。

 

 

ip_hash是以client_ip作為key進行hash的一個負載均衡算法,保證了同一個client_ip可以一直訪問到同一個服務器,適合有狀態請求。

解決了上述長連接無法穩定訪問一個服務的問題。

 

collaboration長連接服務分流效果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM