当前位置:   article > 正文

nginx负载均衡中常见的算法及原理_hash $request_uri

hash $request_uri

1.默认算法:轮询,相当于lvs的rr,也可以进行设置实现权重轮询相当于lvs的wrr

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;#其他服务器都挂了,自己的服务器才上线。
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.基于 hash 的调度算法

根据报文字段cookie,uri,ip等值进行hash运算,得到的值除以总权重,取模,得到的数按照权重进行分配给后台服务器,进而按照分配进行调度。

image-20220703154359896

添加节点后,或者服务器宕机,会导致很多的调度的缓存信息失效

image-20220703154431363

3.一致性hash 算法

需要做两次哈希运算,格局uri最哈希运算,当用户去访问test.html时候,先对test.html进行哈希运算,然后对于一个很大的数字232取模,生成的结果(0-232-1的数字,)放到一个环里面,访问不同的test.html目录,生成的结果放到不同的位置,同时对后端服务器ip做哈希运算,然后把结果放到不同位置,请求按照环的方向调度,谁离得近调度给谁,好处是新上线服务器,则新的服务器ip哈希值放到某一位置,只影响一小段目录的访问关系,影响范围小。但是如果后端服务器的ip哈希值在环的一个局部(偏斜),就会造成,部分服务器没啥工作。但是可以把每个服务器ip权重调为1000,总占比没变,但是可以利用这1000个随机数进行生成虚拟ip,分布在环内部,就可以全火力覆盖。

4.基于hash的基本调度算法

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出问题。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.一致性hash运算调度算法

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6.原地址的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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

7.uri实现hash实践

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
  • 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

8.uri一致性哈希实现:

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

9. 基于Cookie 实现会话绑定

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就会丢失。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/207327
推荐阅读
相关标签
  

闽ICP备14008679号