Nginx 实战-负载均衡

news2025/1/17 6:12:55

一、负载均衡

今天学习一下Nginx的负载均衡。由于传统软件建构的局限性,加上一台服务器处理能里的有限性,在如今高并发、业务复杂的场景下很难达到咱们的要求。但是若将很多台这样的服务器通过某种方式组成一个整体,并且将所有的请求平均的分配给这些机器处理,那么这个“系统”就能处理尽可能多的请求,这就是负载均衡最初的设计思想。

当然可以使用的技术包含软件、硬件,咱们本次就着重谈谈Nginx的负载均衡。下图是一个四层 + 七层的负载均衡。采用lvs+nginx的拓扑结构。

二、负载均衡概念

1、什么是负载均衡

负载均衡,简称LB(Load Balancing),是一种计算机技术。用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。宏观上的意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行以解决高性能,单点故障(高可用),扩展性(水平伸缩)等高流量下常见的问题。

2、负载均衡分类

由于载均衡技术是要对网络传输中的报文进行控制,涉及到网络七层模型,因此负载均衡分类可以按照网络层次进行分类,比如二层、三层、四层、七层负载均衡。其中最常见的是四层和七层负载均衡。此外,还有其他方面进行分类的,有软衡、硬件负载均衡等,比如SpringCloud全家桶中的Eureka组件、各种分库分表的中间件都属于负载均衡的范畴。二层、三层、四层、七层负载均衡都都工作在OSI模型,接下来会对做一个简单的解释。业界已经有很多开源的负载均衡工具,大部分是工作在第四层和第七层的。代表的开源工具有Nginx、LVS、Haproxy。LVS 主要用来做四层负载均衡,Nginx 和 Haproxy 主要是做七层的负载均衡,但它们都支持四层的负载均衡,例如在 Nginx 中的 stream 模块除了支持四层的反向代理功能,也支持四层负载均衡功能。

2.1 二层负载均衡

负载均衡服务器对外提供一个VIP(虚拟IP),集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。二层负载均衡发生在数据链路层,所以也称为“数据链裤层负载均衡”它是属于OSI模型。

2.2 三层负载均衡

负载均衡服务器对外提供一个VIP(虚拟IP),但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。三层负载均衡发生在网络层故又称为“网络层负载均衡”,同样的它也是属于OSI模型。

2.3 四层负载均衡

四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。

2.4 七层负载均衡

七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 http、dns 等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个 Web 服务器的负载均衡,除了根据 IP 加端口进行负载外,还可根据七层的 URL、浏览器类别、语言来决定是否要进行负载均衡。

3、负载均衡算法

负载均衡算法可以分成两大类,一类是静态的负载均衡算法,常见的有轮询、权重等;另一大类动态的负载均衡算法,常见的有最少的连接、最快响应、服务类型、服务质量等等。下面就着重记录几种常用的负载均衡算法。

3.1 轮询 (默认)

每一个来自网络中的请求,轮流分配给内部的服务器,从 1 到 N 然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求 相对均衡的情况。

3.2 加权轮询(weight)

根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如:服务器 A 的权值被设计成 1,B 的权值是 3,C 的权值是6,则服务器 A、B、C 将分别接受到 10%、30%、60% 的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。

3.2 ip-hash(ip_hash)

我们都知道,每个请求的客户端都有相应的 ip 地址,该均衡策略中,nginx 将会根据相应的 hash 函数,对每个请求的 ip 作为关键字,得到的 hash 值将会决定将请求分发给相应 Server 进行处理。iphash算法的情况下,每一个IP在不变的情况下都会路由到首次请求的服务上。

3.2 最少连接数(least_conn)

最少连接,也就是说 nginx 会判断后端集群服务器中哪个 Server 当前的 Active Connection 数是最少的,那么对于每个新进来的请求,nginx 将该其分发给对应的 Server。

4. Nginx中的负载均衡配置

Nginx 的 stream 模块和 http 模块分别支持四层和七层模块的负载均衡。其用法和支持的负载均衡策略大致相同。首先使用 upstream 指令块 和 server 指令指定上游的服务,upstream 指令的用法如下

upstream name { ... }

官网示例如下:下面定义了4台服务器,分别是域名、IP+端口、socket形式指定地址,默认情况下upstream指令块中采用的是加权轮训的方式轮询配置得服务,当然我们可以指定一些服务的静态配置,比如注定服务的权重、server的最大并发连接max_conns,(max_fails 和 fail_timeout)失败几次之后将服务标记为故障服务,在设置的时间内不在路由到标记为故障的服务。

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

三、 负载均衡实践

基础知识梳理完毕,接下来进行实践来感受一下相关的概念,俗话说的:好纸上得来终觉浅,绝知此事要躬行!希望可以通过这些实验让咱们更加巩固这些技术点。

1、Nginx中负载均衡

环境准备:mac,我这边使用的是docker安装的nginx,安装教程可以根据我的这篇文章:传送门:Nginx教程,两给SpringBoot服务。首先咱们搭建环境。因为我们之前学习过docker挂载,所以这次修改Nginx文件就方便很多,需要的同学可以参考:docker 挂载、修改文件,如果没有进行挂载想要修改文件的可以参考这篇文章。废话不多说直接上case.

1.1 两个微服务

首先提供两个微服务模拟一份代码两台机器。两个服务都有一个路径相同的对外接口。

@RestController
@Slf4j
public class Demo1LBController {

    @GetMapping("/lb/start")
    public String demo1() {
        String str = "demo1 lb start ...";
        log.info(str);
        System.out.println(str);
        return str;
    }
}

@RestController
@Slf4j
public class Demo2LBController {

    @GetMapping("/lb/start")
    public String demo2() {
        String str = "demo2 lb start ...";
        log.info(str);
        System.out.println(str);
        return str;
    }
}

1.2 Nginx配置修改

upstream 块在http块中,用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡。咱们定义负载均衡的服务叫做:myserver,然后在 server 块里的 location 配置代理:proxy_pass http://myserver;。

nginx.config里的配置
    # ######## 负载均衡开始 ########
    upstream myserver {
       server 10.33.148.23:8081;
       server 10.33.148.23:8082;

       # 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;
   }
    # ######## 负载均衡结束 ########
    
default.config里的配置
   location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_pass http://myserver;

    }

1.2 验证

咱们启动NG之后,在浏览器输入:http://localhost:8010/lb/start,即可得到请求到不同服务的返回,默认走的轮询所以都是规律性的返回。

2、轮询

轮询的配置就是不设置任何静态参数,采用 Nginx 默认的负载均衡策略,上面的验证就是,我这边就做赘述。

3、加权轮询

顾名思义就是根据服务器的不同处理能力,给每个服务器分配不同的权值。具体配置如下,8081的服务权重占4/5,大家可以在浏览器操作感受一下。

4、ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。配置上ip hash之后即使有权重也不会重新请求其他的服务上。大家可以操作感受。

ip_hash;

5、参数说明

weight=number 设定服务器的权重,默认是1,权重越大被访问机会越大,可以根据机器的配置情况来配置。

max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不 可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。

默认配置时,http_404状态不被认为是失败的尝试。 可以通过指令proxy_next_upstream 和memcached_next_upstream来配置什么是失败的尝试。

fail_timeout=time
统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。默认情况下,该超时时间是10秒。 

backup
标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器,配置这个指令可以实现故障转移。

down 标记服务器永久不可用,可以跟ip_hash指令一起使用。

负载均衡的相关知识就梳理完毕啦,本次对 Nginx 中的负载均衡的相关配置指令,实战 Nginx 的负载均衡功能,同时测试多种负载均衡算法的学习和记录希望可以帮助大家更好的里解Nginx。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka的命令行操作

一、topic命令 下面Windows命令需要把cmd路径切换到bin/windows下。 而Linux命令只需要在控制台切换到bin目录下即可。 下面都以Windows下的操作为例,在Linux下也是一样的。 1.1 查看主题命令的参数 kafka-topics.bat # Windows kafka-topics.sh # Linux输…

机器学习中的数学——学习曲线如何区别欠拟合与过拟合

通过这篇博客,你将清晰的明白什么是如何区别欠拟合与过拟合。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言&…

关于人工智能前沿信息获取的精品课程

通过观看在线课程可以很方便掌握获取人工智能前沿信息的方法,本文将介绍一些相关课程。 1. 武汉大学黄如花教授的信息检索中文课程知识面广泛,内容详尽,讲解清晰,课程的视频见课程 56。 ​ 课程 56 武汉大学黄如花教授的《信息检…

图神经网络GNN介绍

目录标题图神经网络基础图基本模块定义图的邻接矩阵点特征的更新(重构)多层GNN图卷积GCN模型GCN基本思想网络层数:基本计算图注意力机制graph attention networkT-GCN序列图神经网络图相似度图神经网络基础 图基本模块定义 三个特征&#x…

C++ 模板初阶

目录 一、函数模板 1.函数模板的概念 2.函数模板的定义 3.函数模板的原理 4.函数模板的实例化 ①隐式实例化 ②显式实例化 5.非模板函数与同名的函数模板同时存在 6.模板参数的匹配原则 二、类模板 1.类模板的定义格式 2.采用类模板的类外函数的定义格式 3.类模板…

【Linux-计算机网络】-TCP协议通信流程

1.TCP协议通信流程图 1.1TCP协议的通讯流程可以分为以下步骤: 应用层:应用程序通过系统调用API(如socket)创建一个TCP套接字(socket),并设置好相关的选项。 传输层:当应用程序调用c…

机器学习中的数学原理——过拟合、正则化与惩罚函数

通过这篇博客,你将清晰的明白什么是过拟合、正则化、惩罚函数。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言…

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…

分布式监控平台-Zabbix

分布监控平台-Zabbix一、Zabbix概述1、Zabbix是什么?2、Zabbix监控原理二、部署Zabbix服务端(端口:10051)1、关闭防火墙 修改主机名2、获取Zabbix下载资源3、安装SCL(Software Collections),修改 Zabbix-front 前端源4…

SQL Server的子查询

SQL Server的子查询一、子查询基础知识二、子查询规则三、限定子查询中的列名四、子查询的多层嵌套五、相关子查询六、子查询类型总结一、子查询基础知识 子查询是嵌套在SELECT、INSERT、UPDATE、DELETE语句中或另一个子查询中的查询。 可以在允许表达式的任何位置使用子查询。…

【MySQL】联合查询

目录 1、前言 2、联合查询 3、内连接和外连接 4、案例演示 4.1 查询篮球哥每科的成绩 4.2 查询所有同学的总成绩及邮箱 5、自连接 5.1 显示所有计算机原理成绩比java成绩高的同学 6、子查询 6.1 查询出篮球哥的同班同学 6.2 多行子查询 7、合并查询 1、前言 在实际…

macOS Monterey 12.6.5 (21G531) 正式版发布,ISO、IPSW、PKG 下载

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…

如何使用Midjourney辅助建筑平面设计和室内设计,常用的建筑平面效果图提示和使用效果展示(内附Midjourney提示词网站)

文章目录一、室内建筑平面设计1.AutoCAD图纸(别墅图为例)2.平面效果图3.三维平面透视图二、建筑室内设计1.现代简约2.波西米亚风格3.工业风格4.沿海风格5.法国风格6.现代风格7.提示增加颜色倾向8.提示中增加设计师9.其它一些尝试三、好用的Midjourney提示…

unity 全局光照

全局光照由两部分组成:直接光照和间接光照。 直接光照由直接光照射到物体上以后直接弹射到人眼接收到的光照。 间接光照为直接光照照射到物体上又弹射到其它物体上面以后多次弹射才被人眼接收的光照(两次及以上的光照统称为间接光照) 材质光…

消息队列RocketMQ、Kafka小计

1、消息队列模型 点对点模式 (一对一,消费者主动拉取数据,消息收到后消息清除)点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是…

Observability: Elastic RUM (真实用户监控)演示

在之前的文章 “Elastic RUM(真实用户监测)浅谈”,我们详细描述了 Elastic RUM (Real User Monitor)。在今天的文章中,我将详细一步一步地对该文章进行演示以便大家也能和我一样进行展示。在今天的展示中&a…

Docker6种网络配置详解,网络模式应该这么选

文章目录一、Bridge网络模式二、Host网络模式三、Overlay网络模式四、None网络模式五、Macvlan网络模式六、Ipvlan网络模式七、网络模式选择在Docker中,网络配置是一个重要的主题,因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和…

GPT-4 和ChatGPT API的定价分析

OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…

2023年美赛春季赛 赛题浅析

由于今年各种各样的原因,导致美赛头一次,据说也将是最后一次,临时调整,加设春季赛。这对于急需建模奖项的大家来说是一个很好的机会。无论怎样的原因,今年美赛我们可能有所遗憾。但,春季赛也许就是弥补遗憾…

在不丢失数据的情况下解锁锁定的 Android 手机的 4 种方法

尽管您可以使用指纹解锁手机,但大多数智能手机都需要 PIN 码、图案或字母数字代码作为主密码。如果您有一段时间没有输入手机密码,很容易忘记。正是由于这个原因,即使您打开了指纹解锁,大多数智能手机也会让您每天至少输入一次 PI…