Nginx实现负载均衡的原理:
负载均衡在服务端开发中算是一个比较重要的特性。因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求(最大可以接收50000个请求),把这些并发请求hold住之后就可以分发给后台服务端(backend servers, 后面简称backend)来做复杂的计算、处理和响应,并且在业务量增加的时候可以方便地扩容后台服务器(Nginx只是分发,并不做处理)。
负载均衡可以分为硬件负载均衡和软件负载均衡,前者一般是专用的软件和硬件相结合的设备,设备商会提供完整成熟的解决方案,通常也会更加昂贵。软件的负载均衡以Nginx为主。
1、Nginx反向代理
先说明一下前向代理。代理 (Proxy) 也称网络代理,是一种特殊的网络服务,通俗来讲,就是在客户端和目标服务器之间的充当中间人,接收客户端的请求,再根据客户端请求向目标服务器发起相应的请求,从目标服务器获得指定资源后返回给客户端。且代理服务器可以对目标服务器的资源下载至本地缓存,如果客户端所要获取的资源在代理服务器的缓存之中,则代理服务器并不会再向目标服务器发起请求,而是直接返回缓存的资源。
而反向代理则是在服务器端作为代理使用,而不是客户端。也就是说,前向代理是代理内部网络用户访问 Internet 上服务器的连接请求,反向代理是以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时的代理服务器对外就表现为一个服务器。
前向代理:代理服务器可以做一些预处理,比如作为前向代理的时候,可以存放一些缓存,在客户端想要获取缓存的数据的时候,可以直接在代理服务器获取,并不需要访问到后端的服务器了;
反向代理:此时的代理服务器,就充当一个转交的角色,将客户端发送的请求转发给后端的服务器,后端的服务器在经过处理后,将数据返回给代理服务器,然后代理服务器再将数据返回给客户端。当然,对于cache缓存,反向代理也是拥有这个功能的。
Nginx利用自身反向代理功能,在conf配置文件中添加反向代理地址,以代理服务器的身份接受客户端发送过来的请求,然后将请求转发给内部网络上的应用服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器,不过它只负责转发请求,不负责处理。
2、Nginx实现转发的5种方式
Nginx转发请求可按照调度规则通过轮询、ip哈希、URL哈希、权重等多种方式对应用服务器做负载均衡,同时还支持后端服务器的运行状态检查,也就是故障移除和恢复添加功能。
Nginx 的 upstream目前支持的分配算法:
(1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,能自动剔除。
(2)、权重 – weight–>指定轮询比率
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。
(3)、ip_哈希算法(即Nginx的前置服务器或者客户端IP)— 保证会话一致性
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。
(4)fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即(rt)小的后端服务器优先分配请求。
(5)url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下(url_hash用途cache服务业务)。
1 upstream backend {
2 server 192.168.1.101;
3 server 192.168.1.102;
4 server 192.168.1.103;
5 hash $request_uri;
6 hash_method crc32;
7 }
hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
Nginx本身不具备这个功能,如果需要使用的化,需要安装Nginx的hash包。
3、负载均衡的实现过程
(1)转发功能
按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
(2)故障移除
通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到其他应用服务器。
(3)恢复添加
如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
4、配置Nginx的负载均衡与分发策略
通过在upstream参数中添加的应用服务器IP后添加指定参数即可实现,如:
1 upstream myserver {
2 server 192.168127.147:8080 weight=3;
3 server 192.168.127.148:8081;
4 }
5 server {
6 listen 80;
7 server_name 8080.mini.com;
8 location / {
9 proxy_pass http://myserver ;
10 index index.html index.htm;
11 }
12 upstream myServer {
13 }
通过以上配置,便可以实现,在访问8080.mini.com这个网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 myserver 的地址,读取分发策略,配置myserver1权重为3,所以nginx会将大部分请求发送给49服务器上的myserver1,也就是8080端口;较少部分给myserver2来实现有条件的负载均衡,当然这个条件就是服务器1、2的硬件指数处理请求能力。
5、nginx其他配置
1 server 192.168.72.49:9090 down;
2 server 192.168.72.49:8080 weight=2;
3 server 192.168.72.49:6060;
4 server 192.168.72.49:7070 backup;
}
(1)down
表示当前的server暂时不参与负载,一般配合ip_hash使用
(2)Weight
默认为1,weight越大,负载的权重就越大。
(3)max_fails
允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
(4)fail_timeout
max_fails 次失败后,暂停的时间。
(5)Backup
其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
6、使用Nginx的高可用
除了要实现网站的高可用,也就是提供n多台服务器用于发布相同的服务,添加负载均衡服务器分发请求以保证在高并发下各台服务器能相对饱和的处理请求。同样,负载均衡服务器也需要高可用,以防如果负载均衡服务器挂掉了,后面的应用服务器也紊乱无法工作。
为了让学习变得轻松、高效,今天给大家免费分享一套阿里架构师传授的一套教学资源。帮助大家在成为架构师的道路上披荆斩棘。这套视频课程详细讲解了(Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构)等这些成为架构师必备的内容!而且还把框架需要用到的各种程序进行了打包,根据基础视频可以让你轻松搭建分布式框架环境,像在企业生产环境一样进行学习和实践。
为了帮助大家少走弯路,我总结出一个Java程序员的工作2-5年成长路线图。
一、开源框架解析
二、架构筑基
三、高性能架构
四、微服务架构
五、团队协作开发
六、B2C商城项目实战
免费获取学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取
架构群:960439918
网友评论