标题索引
-
追朔原因
-
反代原理
-
调度算法
-
算法评估
追朔原因
http调度算法有多种,在nginx、haproxy、apache、keepalive中等等都有相对应的算法,但是算法根本原理是不变的
反代原理
图解http协议中提到的端到端首部,“分到此类别中的首部会转发给请求/响应对应的最终接受目标,且必须保持在由缓存生成的响应中”(图解http协议83页)通过在varnish抓包分析可知,端到端的请求报头从http请求、到varni代理请求、组后到后端服务器收到请求,一直变化的时源目IP地址,请求头部的端到端时一直尚未发生变化的。
调度算法
加权调度调度算法:加权轮询调度算法为,后端服务器根据权重进行虚拟逻辑服务器,调度服务器使用URL或其他参数进行hash,将hash的数值对权重值之和进行取模计算,最后根据计算结果决定调度逻辑服务器计算节点,从而调度到物理真实服务器,具体可参考下图所示:
图1-1WRR调度算法图
根据上图举例说明,如反向代理服务器调度算法为WRR,若客户端访问URI为http://www.a.com/mp4/fire.mp4,调度器接受到此URI并进行hash计算,计算结果对6(3+2+1)取模,取模结果可定为0、1、2、3、4、5,将URI请求调度到相对应的逻辑服务器,进而调度到真实物理服务器。
致命权限:在并发量较大的情况下,通常反向代理服务器先调度到后端varnish等缓存服务器,若其中一台缓存服务器异外宕机时,权重总和发生变化,取模结果发生变化,严重导致varnish等缓存服务器命中率大大降低,从而增加后端物理服务器的压力,若并发量极大的情况下有可能使得后端服务器无法承载众多流量而罢工。
如采用nginx做反向代理调度配置可参考如下方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[ root@centos7 ~ ]
#vim /etc/nginx/nginx.conf
http {
upstream www.jncsy.com {
server 10.2.3.1 weight=3;
server 10.2.3.2 weight=2;
server 10.2.3.3 weight=1;
}
server
{
listen 80;
server_name www.jncsy.com;
location / {
#关闭重定向
proxy_redirect off;
#让真实服务器端接受的真实的host,真实请求IP地址和代理转发的IP地址
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_pass http:
//www
.jncsy.com;
}
access_log logs
/jncsy
.access.log;
}
}
|
如采用apache做反向代理调度可参考如下方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#配置加载模块
LoadModule proxy_module modules
/mod_proxy
.so
LoadModule proxy_balancer_module modules
/mod_proxy_balancer
.so
LoadModule proxy_http_module modules
/mod_proxy_http
.so
#在反向代理模
[ root@centos7 ~ ]
#vim /etc/httpd/conf.d/vhost.conf
#定义基于http的负载均衡模块
<Proxy balancer:
//www
.jncsy.com>
BalancerMember http:
//10
.2.3.1 loadfactor=3
BalancerMember http:
//10
.2.3.2 loadfactor=2
BalancerMember http:
//10
.2.3.3 loadfactor=1
ProxySet lbmethod=byrequests
<
/Proxy
>
<VirtualHost *:80>
ServerName www.jncsy.com
#对代理进行授权
<Proxy *>
Require all granted
<
/Proxy
>
#apache2.4中需要进行授权
<Location />
Require all granted
<
/Location
>
#关闭正向代理
ProxyRequests Off
#响应头部添加Via首部,添加X-Forward-for相关信息
ProxyVia On
#正常情况下host被解析为IP地址,开启此项目保留host的主机名防止后端为虚拟主机
ProxyPreserveHost On
ProxyPass / balancer:
//www
.jncsy.com/
#将URI等进行缓存避免再次获取URI
ProxyPassReverse / balancer:
//www
.jncsy.com/
<
/VirtualHost
>
|
算法评估
建议采用的方案
本文转自 薛伟博 51CTO博客,原文链接:http://blog.51cto.com/weiboxue/1979612,如需转载请自行联系原作者