赞
踩
upstream pc-server {
server 10.0.0.18:80;#默认权重为1,都默认则为轮询
#server 10.0.0.18:80 weight=3; #权重为3,不写默认为1,
server 10.0.0.28:80;
#server 10.0.0.28:80 max_fails=3 fail_timeout=30s max_conns=10; #下线条件,最多连续失败3次,认为服务器挂了,上线条件,后端挂掉的服务器每隔时间30s检查一次,可用就参与调度,这两项为判断后端服务器健康性的依据,设置最多连接10,默认不限
server 127.0.0.1 backup;#其他服务器都挂了,自己的服务器才上线。
}
根据报文字段cookie,uri,ip等值进行hash运算,得到的值除以总权重,取模,得到的数按照权重进行分配给后台服务器,进而按照分配进行调度。
添加节点后,或者服务器宕机,会导致很多的调度的缓存信息失效
需要做两次哈希运算,格局uri最哈希运算,当用户去访问test.html时候,先对test.html进行哈希运算,然后对于一个很大的数字232取模,生成的结果(0-232-1的数字,)放到一个环里面,访问不同的test.html目录,生成的结果放到不同的位置,同时对后端服务器ip做哈希运算,然后把结果放到不同位置,请求按照环的方向调度,谁离得近调度给谁,好处是新上线服务器,则新的服务器ip哈希值放到某一位置,只影响一小段目录的访问关系,影响范围小。但是如果后端服务器的ip哈希值在环的一个局部(偏斜),就会造成,部分服务器没啥工作。但是可以把每个服务器ip权重调为1000,总占比没变,但是可以利用这1000个随机数进行生成虚拟ip,分布在环内部,就可以全火力覆盖。
1.hash $request_uri;#基于用户请求的uri做简单hash
针对于uri(资源路径)进行哈希运算,得到一个字符串,除以总权重,取余数,针对于余数按权重进行分配,权重是x,则余数是0-x的数就分配给此主机,权重大,分配的余数多,调度的概率就高,容易因为后端服务器挂掉,或者新上线机器导致session出问题。
2.hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑定
针对于session进行哈希运算,得到一个字符串,除以总权重,取余数,针对于余数按权重进行分配,权重是x,则余数是0-x的数就分配给此主机,权重大,分配的余数多,调度的概率就高,容易因为后端服务器挂掉,或者新上线机器导致session出问题。
3.ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持
针对于客户端ip进行哈希运算,得到一个字符串,除以总权重,取余数,针对于余数按权重进行分配,权重是x,则余数是0-x的数就分配给此主机,权重大,分配的余数多,调度的概率就高,容易因为后端服务器挂掉,或者新上线机器导致session出问题。
hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算
具体运用
hash $request_uri consistent; #基于用户请求的uri做一致性hash
hash $cookie_session consistent;#基于cookie中的sessionid这个key进行一致性hash调度,实现会话绑定
1.源地址哈希,同一地址访问,哈希值不变,就会发往同一台服务器, [root@proxy:/apps/nginx/conf.d]# vim ../conf/nginx.conf http { upstream pc-servers { hash $remote_addr; [root@proxy:/apps/nginx/conf.d]# nginx -s reload 2.测试 [root@ubuntu18 ~]#curl www.magedu.org 10.0.0.28 [root@ubuntu18 ~]#curl www.magedu.org 10.0.0.28 [root@ubuntu18 ~]#curl www.magedu.org 10.0.0.28
1.在web服务器生成是10个test页面文件, [root@web1:/var/www/html]# for i in {1..10};do echo 10.0.0.18 test$i > test$i.html;done [root@web2:/var/www/html]# for i in {1..10};do echo 10.0.0.28 test$i > test$i.html;done 2.nginx代理修改配置文件 [root@proxy:/apps/nginx/conf.d]# vim ../conf/nginx.conf http { upstream pc-servers { hash $request_uri; server 10.0.0.18:80; server 10.0.0.28:80 max_fails=3 fail_timeout=30s max_conns=10; } [root@proxy:/apps/nginx/conf.d]# nginx -s reload 3.测试 [root@ubuntu18 ~]#curl www.magedu.org/test2.html 10.0.0.28 test2 [root@ubuntu18 ~]#curl www.magedu.org/test3.html 10.0.0.28 test3 [root@ubuntu18 ~]#curl www.magedu.org/test4.html 10.0.0.18 test4 [root@ubuntu18 ~]#curl www.magedu.org/test4.html 10.0.0.18 test4
1.[root@proxy:/apps/nginx/conf.d]#
vim ../conf/nginx.conf
http {
upstream pc-servers {
hash $request_uri consistent;
server 10.0.0.18:80;
server 10.0.0.28:80 max_fails=3 fail_timeout=30s max_conns=10;
}
1.修改配置文件,实现cookie值哈希。 [root@proxy:/apps/nginx/conf.d]# vim ../conf/nginx.conf http { upstream pc-servers { hash $cookie_class consistent; #实现cookie哈希。 server 10.0.0.18:80; server 10.0.0.28:80 max_fails=3 fail_timeout=30s max_conns=10; } [root@proxy:/apps/nginx/conf.d]# nginx -s reload 2.测试指定cookie值(键值对,键是class,值是m44, -b指定cookie访问) [root@ubuntu18 ~]#curl -b 'class=m44' http://www.magedu.org/test1.html 10.0.0.18 test1 [root@ubuntu18 ~]#curl -b 'class=m44' http://www.magedu.org/test1.html 10.0.0.18 test1 [root@ubuntu18 ~]#curl -b 'class=m63' http://www.magedu.org/test1.html 10.0.0.28 test1 [root@ubuntu18 ~]#curl -b 'class=m63' http://www.magedu.org/test1.html 10.0.0.28 test1 #利用cookie的值进行哈希绑定调度,如果服务器挂了,那么session就会丢失。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。