nginx负载均衡原理简介_nginx负载均衡配置详解

nginx负载均衡原理简介_nginx负载均衡配置详解nginx负载均衡中常见的算法及原理有哪些?Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能httpupstream配置参数#自定义一组服务器,配置在http块内upstreamname{server………..}#示例upstreambackend{serverbackend1.example.comweight=5;server127.0.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

nginx负载均衡中常见的算法及原理有哪些?

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

http upstream配置参数

#自定义一组服务器,配置在http块内
upstream name { 
   
    server .....
    ......
}

#示例
upstream backend { 
   
    server backend1.example.com weight=5;
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
    
    server backup1.example.com backup;
}

server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
定义服务器的address和其他parameters 。该地址可以指定为域名或 IP 地址,带有可选端口。
如果未指定端口,则使用端口80。

#server支持的parameters如下:
weight=number #设置服务器的权重,默认为1,实现类似于LVS中的WRR加权轮询、WLC加权最少连接等

max_conns=number #给当前后端server设置最大活动链接数,默认为0,表示没有限制

max_fails=number #设置在参数设置的持续时间内与服务器通信的不成功尝试次数。后端服务器的下线条件,
当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用。
默认情况下,不成功的尝试次数设置为 1。可以设置为3。
当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测

fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次
进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒,可以设置为1秒。

backup #设置为备份服务器,当主服务器不可用时,才会启用此备用服务器
#注意:该参数不能与 hash、ip_hash和random 随机负载均衡算法一起使用。

random [two [method]];  #该指令出现在版本 Nginx1.15.1版本中。
#随机负载均衡算法,将请求传递到随机选择的服务器,同时考虑服务器的权重。
可选two参数指示 nginx 随机选择两个服务器,然后使用指定的method. 
默认方法是least_conn,将请求传递给活动连接数最少的服务器。

down #将服务器标记为不可用状态,可以平滑下线后端服务器

resolve #监控服务器域名对应的IP地址变化,此指令为Nginx的商业版本所支持
当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
为了使此参数起作用,resolver必须在 http块或相应的upstream块中指定该指令。

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

1、rr轮询

rr轮询算法为nginx默认调度算法,按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于LVS中的rr轮询算法。如果后端节点服务器宕机,宕机的服务器会被自动从节点服务器池中剔除,以使客户端的用户访问不受影响。新的请求会分配给正常的服务器。

    upstream webservers { 
   
        server 10.0.0.17;
        server 10.0.0.27;
}
#代码实现
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         server 10.0.0.17:80;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#vim /apps/nginx/conf/conf.d/pc.conf
server{ 
   
    listen 80;
    server_name www.linux2022.com;
    location / { 
   
        root /data/nginx/html/pc;
        proxy_pass http://webservers;
    }
[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

#测试验证
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27

#Nginx默认带健康性检查
#后端服务器健康性检查,停掉后端10.0.0.27的Apache服务器,再次测试
[root@httpd ~]#hostname -I
10.0.0.27
[root@httpd ~]#systemctl stop httpd
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17

2、wrr加权轮询

在rr轮询算法的基础上加上权重,即为权重轮询算法。权重越高,在被访问的概率越大 。可以根据服务器的配置和性能指定权重值大小,达到合理有效的地利用主机资源 。

upstream webservers { 
   
    server 10.0.0.17 weight=2;
    server 10.0.0.27 weight=8;
}
#代码实现
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         server 10.0.0.17:80 weight=3;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

#测试验证
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27

3、ip_hash源地址hash

源地址hash调度算法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持。该方法确保来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用。在该服务器不可用的情况下,客户端请求将被传递到另一台服务器。很可能,它也将始终是同一台服务器。

注意:当负载均衡算法为ip_hash时,后端服务器在负载均衡调度中的状态不能有weight和backup。

upstream webservers { 
   
    ip_hash;
    server 10.0.0.17;
    server 10.0.0.27;
}

如果需要临时下线其中一台服务器,则应使用down参数对其进行标记,以保留客户端 IP 地址的当前散列。

upstream backend { 
   
    ip_hash;
    server 10.0.0.17;
    server 10.0.0.27;
    server 10.0.0.37 down;
}
#代码实现
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         ip_hash;
         server 10.0.0.17:80;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

#测试验证
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27

4、least_conn最少连接

最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC加权最少连接算法。同时考虑服务器的权重,如果后端服务器的连接数都相同时,则使用WRR加权轮询调度算法。

upstream backserver { 
    
    least_conn;
    server 10.0.0.17; 
    server 10.0.0.27; 
} 
#代码实现
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         least_conn;
         server 10.0.0.17:80;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

#测试验证,后端服务器的连接数都相同时,则使用WRR加权轮询调度算法,默认权重是1
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27
[root@client ~]#curl http://www.linux2022.com/
10.0.0.17
[root@client ~]#curl http://www.linux2022.com/
10.0.0.27

5、hash KEY [consistent] 一致性hash算法

基于指定请求报文中首部字段或者URI等key做hash计算。可以包含文本、key变量及其组合。

如果consistent指定了参数,将使用ketama一致性hash算法。该方法确保在将服务器添加到组或从组中删除时,只有少数密钥将重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。

一致性hash算法适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算

注意:从组中添加或删除服务器可能会导致将大部分密钥重新映射到不同的服务器。

在这里插入图片描述

hash $request_uri consistent;  #基于用户请求的uri做hash,使用一致性hash运算

hash $cookie_sessionid  #基于cookie中的sessionid这个key进行hash调度,实现会话绑定
#基于用户请求的uri做hash
#代码实现
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         hash $request_uri;
         server 10.0.0.17:80;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

[root@nginx2 html]#pwd
/apps/nginx/html
[root@nginx2 html]#for i in {1..10};do echo 10.0.0.17 test$i > test$i.html;done
[root@nginx2 html]#ls
50x.html    test10.html  test2.html  test4.html  test6.html  test8.html
index.html  test1.html   test3.html  test5.html  test7.html  test9.html
[root@nginx2 html]#cat test1.html
10.0.0.17 test1
[root@nginx2 html]#cat test2.html
10.0.0.17 test2

[root@httpd html]#pwd
/var/www/html
[root@httpd html]#for i in {1..10};do echo 10.0.0.27 test$i > test$i.html;done
[root@httpd html]#ls
index.html   test1.html  test3.html  test5.html  test7.html  test9.html
test10.html  test2.html  test4.html  test6.html  test8.html

#测试验证
[root@client ~]#curl http://www.linux2022.com/test1.html
10.0.0.27 test1
[root@client ~]#curl http://www.linux2022.com/test1.html
10.0.0.27 test1
[root@client ~]#curl http://www.linux2022.com/test1.html
10.0.0.27 test1
[root@client ~]#curl http://www.linux2022.com/test2.html
10.0.0.27 test2
[root@client ~]#curl http://www.linux2022.com/test3.html
10.0.0.27 test3
[root@client ~]#curl http://www.linux2022.com/test4.html
10.0.0.17 test4
[root@client ~]#curl http://www.linux2022.com/test4.html
10.0.0.17 test4
[root@client ~]#curl http://www.linux2022.com/test4.html
10.0.0.17 test4
[root@client ~]#curl http://www.linux2022.com/test4.html
10.0.0.17 test4

#基于用户请求的uri做hash,使用一致性hash运算
#代码实现
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         hash $request_uri consistent;
         server 10.0.0.17:80;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

#测试验证
[root@client ~]#curl http://www.linux2022.com/test3.html
10.0.0.27 test3
[root@client ~]#curl http://www.linux2022.com/test3.html
10.0.0.27 test3
[root@client ~]#curl http://www.linux2022.com/test3.html
10.0.0.27 test3
[root@client ~]#curl http://www.linux2022.com/test3.html
10.0.0.27 test3


#基于Cookie实现会话绑定
#代码实现
[root@client ~]#curl -b 'name=xiaoming' http://www.linux2022.com/test3.html
10.0.0.27 test3
[root@nginx1 ~]#vim /apps/nginx/conf/nginx.conf
http { 
   
     upstream webservers { 
   
         hash $cookie_name consistent;
         server 10.0.0.17:80;
         server 10.0.0.27:80;
    }

[root@nginx1 ~]#nginx -t
[root@nginx1 ~]#nginx -s reload

#测试验证
[root@client ~]#curl -b 'name=xiaoming' http://www.linux2022.com/test4.html
10.0.0.17 test4
[root@client ~]#curl -b 'name=xiaoming' http://www.linux2022.com/test3.html
10.0.0.17 test3
[root@client ~]#curl -b 'name=xiaoming' http://www.linux2022.com/test2.html
10.0.0.17 test2
[root@client ~]#curl -b 'name=xiaoming' http://www.linux2022.com/test1.html
10.0.0.17 test1

#修改cookie值
[root@client ~]#curl -b 'name=xiaohong' http://www.linux2022.com/test1.html
10.0.0.17 test1

#再次测试
[root@client ~]#curl -b 'name=xiaohong' http://www.linux2022.com/test2.html
10.0.0.17 test2
[root@client ~]#curl -b 'name=xiaohong' http://www.linux2022.com/test3.html
10.0.0.17 test3
[root@client ~]#curl -b 'name=xiaohong' http://www.linux2022.com/test4.html
10.0.0.17 test4

#停掉后端Nginx2服务器
[root@nginx2 html]#hostname -I
10.0.0.17
[root@nginx2 html]#systemctl stop nginx

#再次测试,之前绑定的会话会丢失,会自动调度到另一台服务器
[root@client ~]#curl -b 'name=xiaohong' http://www.linux2022.com/test4.html
10.0.0.27 test4

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189576.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • [iOS Animation]-CALayer 图层几何学

    [iOS Animation]-CALayer 图层几何学

  • 标签的含义_新建标签页的网址

    标签的含义_新建标签页的网址功能说明版权信息适用范围首页模板,列表模板,内容模板基本语法[NT:unLoop,NT:SiteID=0,NT:LabelType=CopyRight][/NT:unLoop]必填参数NT:SiteID表示站群ID,0表示总站NT:LabelType标签类型:值为CopyRight,表示版权信息后台设置:控制面板—系统…

  • 适合于初学者—软路由全探索系列(一):探索 VMware 虚拟机旁路由安装及设置

    适合于初学者—软路由全探索系列(一):探索 VMware 虚拟机旁路由安装及设置软路由系列:VMware虚拟机旁路由配置全过程一、背景知识1、路由器2、软路由3、旁路由二、旁路由的网络配置及特性1、网络配置2、网络特性三、OpenWrt旁路由虚拟机安装1、安装准备一、背景知识1、路由器路由器(Router)是连接两个或多个网络的硬件设备,在网络间起网关的作用,是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。它能够理解不同的协议,例如某个局域网使用的以太网协议,因特网使用的TCP/IP协议。这样,路由器可以分析各种不同类型网络传来的数据包的

  • pythonrandom函数用法_python之random模块函数的使用

    pythonrandom函数用法_python之random模块函数的使用1)random.random()#用于生成一个0到1的随机浮点数,(0,1】2)random.randint(a,b)#用于生成一个指定范围内的整数,【a,b】3)random.randrange([start],stop[,step])#从指定范围内,按指定基数递增的集合中获取一个随机数。注意参数是整数,且不包括stop。random.randrange(10,30,2),结果相当…

  • ES集群搭建「建议收藏」

    ES集群搭建「建议收藏」1.设置内核参数:/etc/sysctl.confvm.max_map_count=6553602.设置文件描述符限制:/etc/security/limits.conf*softnofile65536*hardnofile131072*softnproc2048*hardnproc4096&&1和2的配置,可以等到启动时候报错,再修改(可以清晰地知道1、2在处理什么问题)3.es不允许root用户启动,修改用户和分组chownuser1.

    2022年10月13日
  • C语言数组 一维数组篇

    C语言数组 一维数组篇前言:本文章主要用于个人复习,追求简洁,感谢大家的参考、交流和搬运,后续可能会继续修改和完善。因为是个人复习,会有部分压缩和省略。一、数组1.数组的定义:2.C语言规定:数组的每个元素都有下标,且下标是从0开始的。3.数组的使用4.数组使用时可能出现的错误越界访问:经典题型5.判断两个数组类型是否相同:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号