• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

nginx负载均衡常见的算法和原理

武飞扬头像
wwzroom
帮助1

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;#其他服务器都挂了,自己的服务器才上线。
    }

2.基于 hash 的调度算法

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

学新通

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

学新通

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

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调度,实现会话绑定

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
学新通

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
学新通

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;
    }

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就会丢失。
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjaiii
系列文章
更多 icon
同类精品
更多 icon
继续加载