Nginx快速入门:负载均衡upstream设置详解(四)

打印 上一主题 下一主题

主题 685|帖子 685|积分 2055

0. 引言

我们在第二章的时候简朴演示了关于nginx实现负载均衡的演示,而实际上nginx支持很多负载均衡算法,而且多节点的转发也有多种计谋。今天我们继承深入学习这块。
1. 负载均衡的应用场景

所谓负载均衡,Load Balance ,就是将请求进行分流,减轻单点压力,实现将流量均摊到各个节点的操作,以此实现分布式化
负载均衡的常见实现方式:


  • 硬件
   F5
  

  • 软件
   Nginx
LVS
HAproxy
  

  • 云负载
   阿里云 SLB
腾讯云 CLB
华为云 ELB,之前观察云负载的日志与nginx一样,所以本身也怀疑云负载均衡是基于nginx开发的
  由于云负载一样平常就是购买云厂商的,所以本身不必要我们参与太多设置,F5基于硬件级别,代价昂贵,平凡公司也用不起。比较常见的就是基于软件层实现负载均衡,其中比较着名的更是我们今天的主题——nginx。
Nginx负载均衡的应用场景主要有以下2个方面:


  • 1、解决高并发题目,通太过发流量到多个节点,以此拓展整体的并发本领
  • 2、解决单点故障题目,通过部署多节点,当其中一个节点宕机后,还能保障有其他节点提供服务
2. Nginx的负载均衡算法

Nginx自带5种负载均衡算法,是基于ngx_stream_upstream_module模块来实现的,所以语法中主要是利用upstream关键字


  • 1、轮询分发(默认算法)
   即请求依次分发给差异的节点,第一次给第一个节点,第二次给第二个节点,轮流请求,如果不显示声明,将会默认该种算法
  语法:
  1. upstream xxx {
  2.         server 192.168.244.11;
  3.         server 192.168.244.12;
  4. }
复制代码


  • 2、按权重分发
   按照设置的权重配比,将请求转发给节点,好比权重为1:2,就会将1/3的请求分发给节点1,2/3的请求分发给节点2。
该方式适用于服务器设置有明显差异的场景
  1. upstream xxx {
  2.         server 192.168.244.11 weight=1;
  3.         server 192.168.244.12 weight=2;
  4. }
复制代码


  • 3、源地点ip哈希法分发
   根据请求的发起方的ip盘算出来的hash值进行分发,这样可以将雷同ip的请求分发到固定节点
以此实现会话保持(如:同一客户的session请求到同一个背景服务)、A/B 测试等应用场景、分布式缓存
但如果客户服务器有多个出口ip的话,这种方式就不再适用
  1. upstream xxx {
  2.     ip_hash;
  3.         server 192.168.244.11;
  4.         server 192.168.244.12;
  5. }
复制代码


  • 4、源地点url哈希法分发
   根据其ing求的url的hash值来分发到后端的服务器
为差异业务做分布式缓存的场景下比较适用
  1. upstream xxx {
  2.     hash $remote_addr;
  3.         server 192.168.244.11;
  4.         server 192.168.244.12;
  5. }
复制代码


  • 5、最小毗连数法分发
   根据后端服务当前的毗连环境,动态的选取其中毗连数最少的服务器来处理当前请求,简朴来说就是哪台服务器处理的越快且资源越空闲就给谁处理。
这样的做法是可以尽可能的提高背景服务器的利用率,合理的分配流量给对应的服务器
这也是几种负载均衡算法中的动态负载算法
  1. upstream xxx {
  2.     least_conn;
  3.         server 192.168.244.11;
  4.         server 192.168.244.12;
  5. }
复制代码
3. Nginx容灾计谋

所谓容灾是指当某一节点宕机时,可以自动将流量切换给另一台节点,或者某一个节点不稳定,我们可以设置一个不稳定的判断条件,好比毗连3次则以为该服务不可用,以此对服务的可用性进行提升。
Nginx支持2种容灾计谋:


  • 1、重试机制
   max_fails:可以设置最大重试次数,即进行毗连节点,如果毗连失败,重新发起毗连的次数
fail_timeout:在周期fail_timeout时间内到达max_fails次失败次数后,fail_timeout时间内不再重试
好比设置的max_fails=2,fail_timeout=10s, 那么就是10s如果出现2次超时,则10s内不再请求该节点,待10s后再请求该节点
  1. upstream xxx {
  2.         server 192.168.244.11 max_fails=2 fail_timeout=10s;
  3.         server 192.168.244.12 max_fails=2 fail_timeout=10s;  
  4. }
复制代码
这里我们还没有界说每次请求的超时时间是多少,所以要联合咱们在第二章中讲到的proxy_connect_timeout,proxy_read_timeout参数进行设置,如果不设置的话默认是60s,很容易导致服务相应不及时
  1. upstream tomcat {
  2.     server 192.168.244.11 max_fails=2 fail_timeout=10s;
  3.         server 192.168.244.12 max_fails=2 fail_timeout=10s;  
  4. }
  5. server {
  6.     listen       80;
  7.     location / {
  8.        proxy_pass http://tomcat; # 通过别名实现负载均衡转发
  9.        proxy_set_header HOST $host; # 代理过程中添加host头部信息,防止通过ip访问时域名解析不到,不能被server_name解析到
  10.        proxy_http_version 1.1; # 指定http协议版本
  11.        proxy_connect_timeout 3s; # 连接后台服务器的超时时间
  12.        proxy_read_timeout 3s; # 从后台服务器读取数据的超时时间
  13.        proxy_send_timeout 3s; # 向后台服务器发送数据的超时时间
  14.     }
  15. }
复制代码


  • 2、主备机制
   可以通过给节点设置backup,表示当前节点仅为备用节点,平时并不会分发请求给它,只有当主节点宕机后,才会启动备用节点
一样平常可以搭配重试机制一起利用
  1. upstream xxx {
  2.         server 192.168.244.11 max_fails=2 fail_timeout=10s;
  3.         server 192.168.244.12 max_fails=2 fail_timeout=10s;  
  4.         server 192.168.244.13 backup;
  5. }
复制代码
同时也可以给节点设置状态为down,表示该节点不可用,流量将不会分发给该节点
  1. upstream xxx {
  2.         server 192.168.244.11 down;
  3.         server 192.168.244.12 max_fails=2 fail_timeout=10s;  
  4.         server 192.168.244.13 backup;
  5. }
复制代码
4. 案例实操

最后我们通过一个案例来总结我们今天的知识
案例:
   实现主备设置,当背景服务10s内3次毗连超时时则断开毗连,2台节点按1:2权重进行分发,并设置一台备用节点,当两台服务都宕机时,启用备用节点
  步骤:
1、准备3台tomcat节点,模仿后端服务。这里我为了方便直接在同一个假造机上安装了3台,然后tomcat首页上通过差异的端口号显示来区分

2、修改nginx设置
  1. upstream tomcat {
  2.   server 192.168.244.41:8080 max_fails=2 fail_timeout=10s weight=1;
  3.   server 192.168.244.41:8081 max_fails=2 fail_timeout=10s weight=2;
  4.   server 192.168.244.41:8083 backup;
  5. }
  6. server {
  7.     listen       80;
  8.     location / {
  9.        proxy_pass http://tomcat;
  10.        proxy_set_header HOST $host;
  11.        proxy_http_version 1.1;
  12.        proxy_connect_timeout 3s;
  13.        proxy_read_timeout 3s;
  14.        proxy_send_timeout 3s;
  15.    }
  16. }
复制代码
3、重启nginx
  1. nginx -t
  2. nginx -s reload
复制代码
4、访问nginx,多次访问,发现可以按照1:2比例跳转至8080和8081端口,而且不会访问到8083端口

5、将8081,8080端口的tomcat停掉,模仿宕机,发现请求转发到8083端口的tomcat了

6、模仿测试乐成
5. 总结

今天我们学习了nginx的负载均衡模块upstream,包罗nginx支持的负载均衡计谋以及容灾计谋,通过案例实际演示了我们如何实现负载均衡设置和主备节点搭建,要真正把握知识,还必要大家一起根据文章实际演练。
除了多节点的负载均衡转发,我们另有单节点的差异业务转发,根据域名的转发,各种各样的转发、代理设置,下一节,我们将继承解说nginx的各种转发设置。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表