原文地址:http://www.yangguo.info/2014/6/25/10.html
目标
根据指定的key对websocket连接进行负载均衡,达到一致性哈希的效果。
调度模式
Haproxy,负载均衡调度模式有如下几种:
- roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
- static-rr,表示根据权重;
- leastconn,表示最少连接者先处理;
- source,表示根据请求源IP;
- uri,表示根据请求的URI;
- url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name
- hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
- rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
方案及实现
模式:url_param
前端:通过带参的uri,来向server端(Haproxy/Socketserver)发起请求,如:
- ws://localhost/ws?userid=111,来向server端发起请求。
Haproxy:通过acl来配置规则,如:
- acl is_websocket hdr(Upgrade) -i WebSocket
- acl is_websocket hdr_beg(Host) -i ws
反向代理负载均衡配置,如:
- backend socket_backend_url_param
- balance url_param userid
- option forwardfor
- timeout queue 5000
- timeout server 5000
- timeout connect 5000
- server server1 test:8081
- server server2 test:8082
整体配置
global
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 2
defaults
mode http
frontend all 0.0.0.0:80
timeout client 5000
default_backend www_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend socket_backend_url_param if is_websocket
backend www_backend
balance roundrobin
option forwardfor # This sets X-Forwarded-For
timeout server 5000
timeout connect 4000
server server1 test:8081 weight 1 maxconn 1024 check
server server2 test:8082 weight 1 maxconn 1024 check
backend socket_backend_url_param
balance url_param userid
option forwardfor
timeout queue 5000
timeout server 5000
timeout connect 5000
server server1 test:8081
server server2 test:8082