Nginx系列之负载均衡算法策略

news/2024/5/4 5:21:08/文章来源:https://blog.csdn.net/qiaotl/article/details/127053964

负载均衡实际上是一种网络技术,主要是基于现有的网络结构,增加吞吐量、加强网络数据处理能力、提高应用系统的灵活和可用性。利用Nginx可实现负载均衡,Nginx支持加权Round-Robin负载均衡算法,即加权轮询方式访问server指令指定的后端服务的功能。该功能是集成在Nginx的upstream框架中,指令中涉及多个参数,各个参数含义说明如下:

weight:服务访问的权重,默认是1
max_conns:server的最大并发连接数,仅作用于单worker进程,默认是0,表示没有限制
max_fails: 在fail_timeout时间段内,最大的失败次数,当达到最大失败时,会在fail_timeout秒内这台server不允许再次被选择
fail_timeout: 单位为妙,默认10秒

下图是负载均衡配置,下图右边是实验结果,可以看到通过配置upstream和proxy_pass,当用curl命令访问nginx服务时,会根据权重将请求代理到8011或者8012的服务上(备注:这里另外启动了一个nginx服务来模拟后端服务,即监听在8011和8012的服务)。

上图的配置中,还开启了keepalive,开启keepalive的作用是使用长连接,通过复用连接,降低nginx与后端服务建立、关闭连接的消耗,提升吞吐量的同时还可以降低延迟。下图是开启keepalive的情况下,使用tcpdump命令监听8011端口,连续往8011端口发送两次请求,从打印的信息中可以看到只有刚开始的时候有Flag=S的请求。

关闭keepalive设置后,用curl命令连续往连续往8011端口发送两次请求,可以看到有两段Flag=S的请求,说明重新建立了TCP连接。

上面介绍了加权轮询的负载均衡策略,Nginx还支持基于客户端IP地址的Hash算法实现负载均衡,模块是upstream_ip_hash,使用ip_hash模式,工作原理是hash表记录了每个客户端IP和后端服务器的对应关系,客户端每次都访问都是同一个后端服务器响应。另外,Nginx还支持基于任意关键字实现Hash算法的均衡策略,模块是upstream_hash模块,可以通过指定关键字作为hash key。下图是iphash的配置,实验结果如右图所示:

使用ip_hash模式,本质上是hash表记录了每个客户端IP和后端服务器的对应关系,客户端每次的访问都发往同一个后端服务器。如果后端服务出现扩容或者宕机,那么路由信息会随着服务器的改变而改变。ip_hash的模式下,如果出现扩容或者服务宕机会带来一个问题:hash算法引发大量路由变更,可能导致缓存大范围失效的情况,从而引发性能问题。针对这种情况,Nginx提供了一致性Hash算法来缓解此问题。采用一致性Hash算法语法配置上很简单,添加consistent即可,语法格式:hash key[consistent]。配置内容如下所示

upstream firstCluster{hash $remote_addr consistent;...}

除前面介绍的负载均衡算法外,nginx还支持最小连接数负载均衡算法,即找出当前后端服务中,连接数最小的一个,将请求转发过去。如果出现多个服务连接数一样,那么将采用round-robin
算法来决定最终将请求转发到哪台服务上。

upstream firstCluster{least_conn;...
}

默认情况下Nginx的负载均衡算法是单worker进程的,如果要支持多worker进程,需要使用upstream_zone模块。该模块的功能是分配出共享内存,将其他upstream模块定义的负载均衡策略数据、运行时每个后端服务的状态数据存放在共享内存中,这样就达到了在所有worker进程中都生效的效果,配置方式如下所示

upstream firstCluster{zone zone_name 16k;...
}

前面介绍的负载均衡策略都在upstream指令块中配置,下面列举了upstream提供的不包含cache的变量,通过$变量名称,可以获取这些变量的值。

upstream_addr: 后端服务器IP地址,例如127.0.0.1:8001
upstream_connect_time: 与后端服务器建立连接消耗的时间,时间为秒
upstream_header_time: 接收到后端法务发回响应中http头部所消耗的时间,单位秒
upstream_response_time: 接收完整后端服务返回的响应所消耗的时间,单位秒
upstream_http_字段名称: 从后端法务返回的响应头部某个字段的值
upstream_bytes_received: 从后端服务接收到的响应长度,单位字节
upstream_response_length: 从后端服务返回的响应包体的长度,单位字节
upstream_status: 从后端服务返回的状态码
upstream_cookie_名称: 从后端服务发回的响应头Set-Cookie中取出cookie值

以上就是对Nginx提供负载均衡算法策略的介绍。

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

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

相关文章

CMSC5724-关于条件概率和朴素贝叶斯分类器

文章目录条件概率公式朴素贝叶斯分类器不同假设下的贝叶斯分类贝叶斯分类器候选集相关题目这节课讲述了另一种和概率有关的分类器,老师也改变了讲课方式,直接摆上例子,然我们通过例子将课件上的内容串联起来,减少了纯粹的理论公式…

行人重识别

一、什么是行人重识别 行人重识别(Person Re-identification也称行人再识别,简称为ReID,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术;或者说,行人重识别是指在已有的可能来源与非重叠摄像机视域…

Stack Smashing

Stack Smashing 当canary被覆盖后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认是程序的名字,如果我们把它覆盖为其他的地址时,它就会把其他内存地址的信息给打印出来 Example:wdb2018_guess Analyze Arch: amd64-64-little RELRO: Partial RELRO…

3个超实用功能,华为手机负一屏应该这么用

现在越来越多人使用华为手机,但是你知道华为手机的负一屏吗?华为手机负一屏有哪些功能?华为手机的负一屏有以下3个超实用的功能,以后打开手机,你就可以快速找到自己想查看的东西了! 你可能会问华为手机的负…

C语言刷题(二)

✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步! 📃个人主页:嵌入式基地 🔥系列专栏:牛客网C语言刷题专栏 💬推荐一…

保姆级, 使用 KotlinScript 构建 SpringBootStarter

因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. .kts本文主要分几个步骤: 用 Kotlin 写一个简单 SpringBoot Starter 进阶一: 复杂配置参数的写法 进阶二: starter 单元测试 使用 Kotlin …

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理一、前言二、硬布线控制器(一)、安排微操作时序的原则1. 安排微操作时序-取指周期2. 安排微操作时序-间址周期3. 安排微操作时序-执行周期4. 安排微操作时序-间址周期…

Python算法性能分析-时间复杂度

时间复杂度: 算法的运行时间。 什么是大O: 大O用来表示上界的。 数据规模: 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模&am…

没有项目经验,如何书写漂亮的简历?

嗨,同学 你们是不是也开始 国庆假期倒计时啦!!! 一想到熬过这周,接下来可以嗨7天7夜 就按捺不住自己内心的雀跃! 但是,有人却高兴不起来,因为在这个“金九银十”,一些同学还没找到…

接口(关注我还有后续哦)

👍 棒棒有言:现在学习Java变得比以前容易多了,除了有大量的视频教程外,还有专业的机构,这都使学习变得更加简单化。如果仅仅学了些皮毛,高手写的程序你是望尘莫及的。在学习的过程中,书籍永远是…

后台系统接入udesk在线客服(vue前端方式)

SDK最舒服的一点就是买来服务,直接Ctrl CV脚本进项目基本就能完成目标功能,要做的无非就是自定义属性的添加。 楼上项目组用的是java后端接入,我这儿是vue前端接入,做法略有不同。 简单点做就是复制上面script标签内代码到index.h…

关于SignalR的内容延续:1.协商协议 2.分布式部署

既然项目中用到了,那就搞搞清楚,搞不懂就死 : > 前置内容: 长轮询问题在ABP中的解决方案,SignalR_董厂长的博客-CSDN博客 “SingalR是对webSocekt的封装” ,这句话是片面的。 因为: SignalR支持多…

vue-----组件通信/传值

一 父子组件通信分为父给子传和子给父传 父给子传: 1.在子组件标签中写传入的值 2.在子组件内使用props接收父组件传递的值。 子给父传: 1.在子组件内部使用$emit发射自定义事件和传递给父组件的值 2.在父组件内声明自定义事件接受参数 二 兄弟组件…

真无线蓝牙耳机哪款音质最好?真无线蓝牙耳机音质排行榜

随着蓝牙技术的飞速发展,很多耳机的质量和质量都很好。喜欢音乐的人,往往会沉迷于这种美妙的感觉,也正是因为如此,他们才会对音质有更高的要求。除了音质之外,还有很多新的特性,例如主动降低噪音、声音操控…

全流程调度

目录 Azkaban 配置mysql 配置 Executor Server 配置Web Server Sqoop导出脚本 Azkaban 安装azkaban并改名 配置mysql 启动 [doudouhadoop102 ~]$ mysql -uroot -p123456登陆 MySQL,创建 Azkaban 数据库 mysql> create database azkaban;设置密码有效长度 …

一文入门Qt Quick

很高兴可以来到这一章,终于可以开始讲讲最近几年Qt的热门技术Quick这一块了。希望通过这个比较简短的例子可以带领有兴趣的朋友快速跨过Qt Quick的入门这道槛!以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733…

m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法(包括matlab仿真录像)

目录 1.源码获取方式 2.算法描述 3.部分程序 4.部分仿真图预览 1.源码获取方式 使用版本matlab2013b 获取方式1: 点击下载链接(解压密码C123456): m基于matlab的光通信的信道估计,均衡,抑制papr误码…

libxml编译时问题解决记录

在对libxml进行模糊测试时,需要先将其拉去并进行编译,可参考此链接:magma本地编译 或者直接参考这个链接:magma编译libxml2 然而在编译的过程中,拉去完libxml2执行到这一句时报错如下: configure.ac:42: e…

Python骚操作,实现驾考自动答题,这就直接满分了?

Python骚操作来了~ 用Python来实现科目一/四自动答题,100分不要太简单! 最初是表弟最近想买车,但是驾照都没有,买什么车,只能先考驾照~ 看他在网页上练习题目慢吞吞的,我就看不下去了,直接给他…

《数据结构》队列及其经典面试题

前言 上一篇讲了栈和栈的经典面试题,链接如下: 栈与栈的经典面试题 其实栈和队列是一码事,都是对只能再线性表的一端进行插入和删除。 因此,其实栈和队列可以互相转换! 一、队列的特点 先进先出的数据结构&#…