当前位置: 首页 > news >正文

Nginx从入门到入土(四):负载均衡策略

软负载和硬负载的概念前文提起过,那接下来我们便讲讲什么是负载均衡。

前言

Nginx负载均衡解决的是高并发的问题。

定义:

负载均衡(Load Balancing)是一种技术策略,它旨在将工作负载(如网络流量、计算任务等)均匀地分配多个操作单元(如服务器、计算机、网络链接、磁盘驱动器或其他资源)上,以优化资源的使用效率、最大化吞吐量、最小化响应时间,并防止任何单个资源的过载

由上图可见,比如突然来了十个任务,全部交由一个服务节点来做可能会崩溃,如果摊开去做,就会变得轻松。

负载均衡在带来诸多好处的同时也会引入一些与服务器集群相关的问题

 1.分布式Session一致性问题,例如会话丢失、数据不同步以及会话亲和性问题等等。我们可以使用Spring-session或者redis Token(常见)替代解决

2.分布式任务调度重复执行:在分布式系统中由于各种原因会出现任务被多次执行的问题,可以使用某某shell-job分布式任务调度平台解决。

3.分布式日志收集问题 elk+kafka日志收集

负载均衡策略内容

前三个重点掌握,后两个了解

1.轮询(默认) 每个请求按时间顺序注意分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2.指定权重  指定轮询几率,weight和访问率成正比,用于服务端性能不均的情况。

3.IP绑定  ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4.fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5.url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到一个后端服务器,后端服务器为缓存时比较有效。

Nginx作为负载均衡器,提供了对上游服务器(处理真实业务逻辑的服务器)的负载均衡、故障转移、失败重试、容错以及健康检查等机制。当某个上游服务器发生故障或不可用时,Nginx能够自动将其从服务池中移除,并将流量转移到其他健康的上游服务器,从而确保应用的持续可用性和稳定性。

轮询机制

1.准备工作,先将服务器的端口打开

这个端口是匹配下文用到的server下的监听端口

具体步骤见上文(三)

2.打开nginx.conf,加上下列配置

解释: 

(一)

upstream backServer{server 127.0.0.1:8071;server 127.0.0.1:8072;
}
  • upstream:这是一个Nginx配置块,用于定义一组上游服务器,即后端服务器。这些服务器可以是同一台机器上的不同服务,也可以是不同机器上的服务。

  • backServer:这是自定义的上游服务器组的名称。在Nginx的其他配置部分,可以通过这个名称来引用这个服务器组。

  • server:这个指令用于指定上游服务器组中的一个服务器地址和端口。在这个例子中,定义了两个服务器:

    • 127.0.0.1:8071:这是本机上的一个服务,监听在端口8071。
    • 127.0.0.1:8072:这是本机上的另一个服务,监听在端口8072。

当Nginx接收到匹配的请求时,它将根据配置的负载均衡策略(如轮询、最少连接等)将请求转发到backServer组中的服务器。如果其中一个服务器发生故障或无法响应,Nginx会尝试将请求转发到其他可用的服务器。

(二)

这一步,连接上你自定义的上游服务器组 

3.开启本地8071,8072端口两个服务

用的还是前文(一)中的例子,我们要用同一个程序,执行两个服务,操作如下

小编用的是21版的,其他版本请自行搜索

点击箭头所指

编辑配置  

在配置窗口里找到左上角加号,添加SpringBoot配置 

在右边具体配置里这么操作,名称自定义 

点击确定后你会发现有两个配置

 

 

4.具体操作 

我们现在有两个配置,我们例如用8071配置启动,那么需要做到端口号和8071匹配,配置完了启动了,修改yml文件里的端口号,使之与第8072匹配,再启动。这么做是减少再新建一个程序,当然,新建也可以,两个程序同时运行。

控制台两个一起运行。

操作无误的话,输入www.boyatop.cn:8079,会访问到两个中的一个,点击刷新会访问到另一个

权重配置 

上面我们看过了轮询,那么权重是怎么一回事呢,其实就是通过为Nginx中的上游服务器分配不同的权重,以控制它们各自接收流量的比例,实现基于服务器性能的负载均衡

配置里面新加了weight

实操就是当你访问www.boyatop.cn:8079的时候会出现两下 8071,一下8072.概率比是2:1。

ip绑定

IP哈希(ip_hash)主要用于确保来自同一客户端的请求在整个会话中能够被定向到同一台服务器。

  1. 工作原理:当请求到达负载均衡器时,ip_hash模块会根据客户端的IP地址计算一个哈希值。然后,这个哈希值用来确定哪个后端服务器应该处理该请求。由于哈希算法的一致性,同一个IP地址在会话期间通常会映射到同一台服务器。

  2. 会话保持:这种方法可以看作是一种会话保持机制,对于需要保持用户会话状态的应用(如购物车、用户登录信息等)非常有用,因为它确保了用户的状态信息不会因为请求被分发到不同服务器而丢失。

  3. 优点

    • 简单易实现:相较于其他会话保持技术,ip_hash实现起来较为简单。
    • 无需额外存储:不需要在负载均衡器上存储会话信息。
  4. 缺点

    • IP地址变化:如果客户端的IP地址发生变化(如使用动态IP),会话可能会被重置到不同的服务器。
    • 负载不均:如果某些IP地址被哈希到同一台服务器,可能会导致后端服务器之间的负载不均。
  5. 适用场景:适用于那些对客户端IP地址相对固定,且需要保持会话状态的应用场景。

ip_hash在配置文件中的配置很简单:

故障转移

当Nginx配置了负载均衡,并且某个上游服务器(转发地址)发生宕机或无法访问时,Nginx默认会自动将流量故障转移到下一个可用的上游服务器。集群的目的是确保服务器端的高可用性,当发生故障时,故障转移机制会立即将流量切换到下一台健康的服务器,以保障服务的连续性和可靠性。

  1. 自动故障转移:Nginx的负载均衡配置中,如果某个上游服务器无法响应请求(如连接超时或服务器错误响应),Nginx会自动尝试将请求转发到其他健康的上游服务器。

  2. 立即切换:在检测到服务器故障时,Nginx会尽快将流量切换到其他服务器。但是,“立即”并不意味着没有延迟,实际上可能会有短暂的延迟,尤其是在配置了健康检查间隔或失败重试次数的情况下。

  3. 健康检查:为了实现故障转移,通常需要配置健康检查。Nginx可以通过第三方模块或内置功能(如ngx_http_upstream_hc_module)来定期检查上游服务器的健康状态。

  4. 故障转移策略:Nginx的故障转移策略可能包括最大失败次数(max_fails)和失败时间间隔(fail_timeout)的设置,这些参数会影响故障检测和转移的速度。

  5. 高可用性:集群的目的是提高系统的整体可用性,不仅仅是在故障发生时的故障转移,还包括负载均衡、冗余部署等策略。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Go语言流程控制
  • “跨链桥“的危害
  • docker zookeeper集群启动报错:Cannot open channel to * at election address /ip:3888
  • 数据驱动农业——农业中的大数据
  • 【已解决】使用JAVA语言实现递归调用-本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。
  • 通信系统中频偏估计补偿的流程
  • 12. Scenario Analysis for greedy algorithm
  • 使用云服务器构建langchin
  • parameters()函数 --- 获取模型参数量
  • ConcurrentHashMap的使用
  • 如何选择光伏业务监管系统软件
  • 2024.09.18 leetcode 每日一题
  • 排序算法C++
  • AWS EKS 中的负载均衡和 TLS 配置:全面指南
  • Matplotlib-数据可视化详解
  • php的引用
  • Apache的基本使用
  • JavaScript函数式编程(一)
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS实现简单的MVC模式开发小游戏
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Promise面试题,控制异步流程
  • Python进阶细节
  • Shell编程
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • spring security oauth2 password授权模式
  • springboot_database项目介绍
  • 分享几个不错的工具
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 译有关态射的一切
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 带你开发类似Pokemon Go的AR游戏
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (vue)页面文件上传获取:action地址
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (区间dp) (经典例题) 石子合并
  • (三)docker:Dockerfile构建容器运行jar包
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)http协议
  • .Net OpenCVSharp生成灰度图和二值图
  • .net 反编译_.net反编译的相关问题
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .net操作Excel出错解决
  • .NET命名规范和开发约定
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET未来路在何方?
  • .Net中ListT 泛型转成DataTable、DataSet
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ACM] hdu 1201 18岁生日
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗