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

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、轮询分发(默认算法)

即请求依次分发给不同的节点,第一次给第一个节点,第二次给第二个节点,轮流请求,如果不显示声明,将会默认该种算法

语法:

upstream xxx { 
	server 192.168.244.11; 
	server 192.168.244.12; 
}
  • 2、按权重分发

按照设置的权重配比,将请求转发给节点,比如权重为1:2,就会将1/3的请求分发给节点1,2/3的请求分发给节点2。
该方式适用于服务器配置有显著差别的场景

upstream xxx { 
	server 192.168.244.11 weight=1; 
	server 192.168.244.12 weight=2; 
}
  • 3、源地址ip哈希法分发

根据请求的发起方的ip计算出来的hash值进行分发,这样可以将相同ip的请求分发到固定节点
以此实现会话保持(如:同一客户的session请求到同一个后台服务)、A/B 测试等应用场景、分布式缓存
但如果客户服务器有多个出口ip的话,这种方式就不再适用

upstream xxx {
    ip_hash;
	server 192.168.244.11; 
	server 192.168.244.12; 
}
  • 4、源地址url哈希法分发

根据其ing求的url的hash值来分发到后端的服务器
为不同业务做分布式缓存的场景下比较适用

upstream xxx {
    hash $remote_addr;
	server 192.168.244.11; 
	server 192.168.244.12; 
}
  • 5、最小连接数法分发

根据后端服务当前的连接情况,动态的选取其中连接数最少的服务器来处理当前请求,简单来说就是哪台服务器处理的越快且资源越空闲就给谁处理。
这样的做法是可以尽可能的提高后台服务器的利用率,合理的分配流量给对应的服务器
这也是几种负载均衡算法中的动态负载算法

upstream xxx {
    least_conn;
	server 192.168.244.11; 
	server 192.168.244.12; 
}

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后再请求该节点

upstream xxx {
	server 192.168.244.11 max_fails=2 fail_timeout=10s; 
	server 192.168.244.12 max_fails=2 fail_timeout=10s;  
}

这里我们还没有定义每次请求的超时时间是多少,所以要结合咱们在第二章中讲到的proxy_connect_timeout,proxy_read_timeout参数进行配置,如果不设置的话默认是60s,很容易导致服务响应不及时

upstream tomcat {
    server 192.168.244.11 max_fails=2 fail_timeout=10s; 
	server 192.168.244.12 max_fails=2 fail_timeout=10s;  
}

server {
    listen       80;

    location / {
       proxy_pass http://tomcat; # 通过别名实现负载均衡转发
       proxy_set_header HOST $host; # 代理过程中添加host头部信息,防止通过ip访问时域名解析不到,不能被server_name解析到
       proxy_http_version 1.1; # 指定http协议版本
       proxy_connect_timeout 3s; # 连接后台服务器的超时时间
       proxy_read_timeout 3s; # 从后台服务器读取数据的超时时间
       proxy_send_timeout 3s; # 向后台服务器发送数据的超时时间
    }
}
  • 2、主备机制

可以通过给节点设置backup,表示当前节点仅为备用节点,平时并不会分发请求给它,只有当主节点宕机后,才会启动备用节点
一般可以搭配重试机制一起使用

upstream xxx {
	server 192.168.244.11 max_fails=2 fail_timeout=10s; 
	server 192.168.244.12 max_fails=2 fail_timeout=10s;  
	server 192.168.244.13 backup;
}

同时也可以给节点设置状态为down,表示该节点不可用,流量将不会分发给该节点

upstream xxx {
	server 192.168.244.11 down; 
	server 192.168.244.12 max_fails=2 fail_timeout=10s;  
	server 192.168.244.13 backup;
}

4. 案例实操

最后我们通过一个案例来总结我们今天的知识

案例:

实现主备配置,当后台服务10s内3次连接超时时则断开连接,2台节点按1:2权重进行分发,并设置一台备用节点,当两台服务都宕机时,启用备用节点

步骤:
1、准备3台tomcat节点,模拟后端服务。这里我为了方便直接在同一个虚拟机上安装了3台,然后tomcat首页上通过不同的端口号显示来区分
在这里插入图片描述
2、修改nginx配置

upstream tomcat {
  server 192.168.244.41:8080 max_fails=2 fail_timeout=10s weight=1;
  server 192.168.244.41:8081 max_fails=2 fail_timeout=10s weight=2;
  server 192.168.244.41:8083 backup;
}

server {
    listen       80;

    location / {
       proxy_pass http://tomcat;
       proxy_set_header HOST $host;
       proxy_http_version 1.1;
       proxy_connect_timeout 3s;
       proxy_read_timeout 3s;
       proxy_send_timeout 3s;
   }

}

3、重启nginx

nginx -t
nginx -s reload

4、访问nginx,多次访问,发现可以按照1:2比例跳转至8080和8081端口,并且不会访问到8083端口

在这里插入图片描述

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

在这里插入图片描述

6、模拟测试成功

5. 总结

今天我们学习了nginx的负载均衡模块upstream,包括nginx支持的负载均衡策略以及容灾策略,通过案例实际演示了我们如何实现负载均衡配置和主备节点搭建,要真正掌握知识,还需要大家一起根据文章实际演练。

除了多节点的负载均衡转发,我们还有单节点的不同业务转发,根据域名的转发,各种各样的转发、代理配置,下一节,我们将继续讲解nginx的各种转发配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262580.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter自定义用户变量模拟多用户

java1234,56a801e9c869452fa092c9657cfc2051 jack,b6e528cca41143dea9c2c3e9ca5d6390

Linux环境安装Hadoop

(1)下载Hadoop安装包并上传 下载Hadoop安装包到本地,并导入到Linux服务器的/opt/software路径下 (2)解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…

基于SpringBoot的教学管理app的开发-计算机毕业设计源码65449

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对教学管理等问题,对其进行研究分…

如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发

目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,…

电气 接近开关

npn:和负载(控制器或者继电器)共阳极,低电平响应 pnp:和负载共阴极,高电平响应

MyBatisX生成时的选项的含义

一般,annotation和template勾选MyBatis-Plus 3 options中各选项的作用 comment:实体类各属性的注释(数据库中有的话)以及生成TableId注解,同时会给serialVersionUID属性加上TableField(exist false) toString/hashCo…

OpenSergo使用详解

简介 OpenSergo是一个基于微服务治理的标准和生态,覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域,覆盖了完整的微服务生命周期(从开发态到测试态,到发布态,再到运…

不用翻箱倒柜找数据线,电脑投屏到另一台电脑,无线、远程投屏方法!

对于职场人士来说,电脑投屏电脑绝对是必不可少的工具,稳定高效的投屏开会是职场人渴望的技能,总比天天抱着笔记本走来走去,还要去翻箱倒柜的找数据线要强。如何实现电脑间的稳定投屏,AirDroid Cast提供了一个好思路。 …

ssm基于vue.js的连锁干洗店后台管理系统论文

摘 要 使用旧方法对连锁干洗店后台管理信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在连锁干洗店后台管理信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次…

最小操作次数问题

思路如下: 1.其他颜色变成红色球的情况:蓝色变红色需要2步 所以"2 绿色变红色需要1步 所以 绿色 2.其他颜色变成蓝色球的情况:绿色变蓝色需要2步 红色变蓝色需要1步 3.其他颜色变成绿色球的情况 红色变绿色需要2步 蓝色变绿色需要1步 代码如下&#xff1a…

免费分享一套Springboot+Vue前后端分离的个人博客系统,挺漂亮的

大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue前后端分离的个人博客系统,分享下哈。 项目视频演示 【免费】SpringbootVue个人博客系统 毕业设计 Java毕业设计_哔哩哔哩_bilibili【免费】SpringbootVue个人博客系统 毕业设计 …

Unity DOTS物理引擎的核心分析与详解

最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。 Unity.Physics的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现, 包含了物理刚体的迭代计算与碰撞检测等查…

什么专业适合学网络安全?

1.选什么专业 想当黑客要学什么专业?首先要明白一个点,当黑客你只需要会攻击手段就可以了,但绝不是只会使用一些工具而已,不然那就是“脚本小子”。 不严格来说,计算机所有的专业都可以当黑客,因为基础的东…

《Nature》预测 2024 科技大事:GPT-5预计明年发布等

《Nature》杂志近日盘点了 2024 年值得关注的科学事件,包括 GPT-5 与新一代 AlphaFold、超算 Jupiter、探索月球任务、生产「超级蚊子」、朝向星辰大海、试验下一代新冠疫苗、照亮暗物质、意识之辩第二回合、应对气候变化。 今年以来,以 ChatGPT 为代表…

【飞凌 OK113i-C 全志T113-i开发板】一些有用的常用的命令测试

一些有用的常用的命令测试 一、系统信息查询 可以查询板子的内核信息、CPU处理器信息、环境变量等 二、CPU频率 从上面的系统信息查询到,这是一颗具有两个ARMv7结构A7内核的处理器,主频最高1.2GHz 可以通过命令查看当前支持的频率以及目前所使用主频 …

fastapi 处理请求参数整理

1、路径参数 app.get("/getfilecontent/{id}/{pre}") def get_filecontent(id,pre):"""路径参数,测试接口,读取当前工作目录下的file.txt文件,返回txt中的内容:param id: The ID of the item to retrieve.:param p…

解决使用傅里叶变换开源库fftw分析音频频谱结果与matlab或audacity不一致的问题

找的一些demo输出结果与实际结果相差巨大,修复后效果如下: 采用一个采样率48000,精度16bit,单通道的46Hz,振幅为32767的正弦波测试(理论上应该得输出一个一模一样的正弦波)。输出如下图,可以看…

工业5G路由器提升驾考效率,实现智慧驾考物联网

为了提高驾考的考试效率,更好地服务广大学员,车管所驻考场监控中心结合物联网技术采用智慧驾考系统,实现考场监控、考试员远程监考、学员视频实时回传、自动评判等功能,为驾考公平公正安全提供保障。 该系统由智能监控管理平台和…

百模大战中的AI行业:新趋势与未来发展

文章目录 每日一句正能量前言技术进步应用拓展行业变革人才竞争后记 每日一句正能量 人生最重要的价值是心灵的幸福,而不是任何身外之物。 前言 随着科技的迅猛发展,人工智能(AI)已经成为引领技术革命的重要驱动力之一。在当前的…

使用Java实现合并两个数组[归并排序]

package org.example;import java.util.Scanner;public class incorporateSort {public static void main(String[] args) {Scanner scannernew Scanner(System.in);System.out.println("请输入第一个数组的长度和元素(数组内部必须为升序)");int len1scanner.nextIn…