Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法

news2024/11/14 18:05:26

负载均衡

  • 在真正的反向代理场景中,必然涉及到的一个概念,就是负载均衡
  • 所谓负载均衡,也就是将Nginx的请求发送给后端的多台应用程序服务器
  • 通常的应用程序服务器,后面的每台服务器都是一个同等的角色,提供相同的功能
  • 用户发送一个request 到我们的这个负载均衡器(Nginx)
  • 负载均衡器会将这个请求发给后端的任何一台服务器
  • 它会依据一定的负载均衡算法去后端的三台服务器中选择其中的一台
  • 从而将这个请求发送给后端这个应用程序服务器
  • 由应用程序服务器处理完之后,再次的返回给负载均衡器
  • 由负载均衡器再把这个响应的结果给传递给我们的用户
  • 在整个这样一个过程中,对于负载均衡器和后端的应用程序服务器来说
  • 它这三台服务器提供的角色通常来说是一样的
  • 比如说在某些场景下,后端的这个应用服务器可能都是一台mysql数据库服务器
  • 在mysql数据库服务器中,通常我们用的最多的一种性能是读请求读,请求压力会很大
  • 在一组两重的架构中,第一台服务器可能是用来写的,第二台和第三台都是用来读的
  • 当然很多情景下,我们第一台服务器也可以用来读
  • 这个时候所有的读请求,就都可以平均的分发到我们后端这些服务器

1 )场景举例1

  • 现在,后端的一个应用程序服务器提供了一个电商站点,
  • 这个时候我的用户可能需要去登录到自己的账户中,然后去买商品
  • 用户会首先发起个请求到负载均行器,负载均行器再发到应用服务器
  • 这个时候我们用户登录账户之后,账号信息保存在应用服务器一上
  • 这个时候我们的用户就去浏览我们的网页,选商品,之后,加到购物车
  • 这个时候,假如他一刷新页面,这会触发一个新的HTTP请求
  • 这个请求也会到负载均容器,但被分配到第二台服务器上了,这样用户信息丢失了
  • 后续操作可能会要重新登录,这种场景对用户来说是不能接受的
  • 对于这样一种情形来说,涉及到后端的三台应用服务器如何去对session进行共享?
  • 这是负载均衡器需要面临的第一个问题

2 )场景举例2

  • 负载均衡器在分发请求的时候,三台服务器,如果所有的角色能力都一样,服务器硬件规格也一样
  • 可能是第一次发给第一,第二次发给第二,第三次发给第三,第四次再发给第一,这样轮询
  • 假如,服务器有些性能处理能力很强,有些性能处理很弱,如何合理的分发这样一些请求 ?
  • 也就是说负载均衡器在选择后端的应用服务的时候,要依据一定的算法, 算法设定的优劣
  • 对于负载均衡的效果起到了决定性的影响的,其实没有一个绝对的优劣之分
  • 所有的这些负载均衡的算法,都各自有一些不同的适用场景,需要去结合业务来进行选择使用

3 )场景举例3

  • 在反向代理的场景下,这些应用服务器上面,某些缓存信息是如何结合Nginx进行保存的?

Nginx 对上游服务负载均衡

1 )回顾 upstream 段

  • 语法:upstream name { … }

  • 默认值:无

  • 上下文:http

  • 示例

    upstream {
    	......
    	......
    }
    
  • 指令:

    • server address [parameters];
      • weight=number
      • max_conns=nuimber
      • fail_timeout=time
      • max_fails=number
      • backup
      • down
    • keepalive connections;
    • keepalive_request number;
    • keepalive_timeout time;
    • queue;
  • 配置示例

upstream back_end {
	server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s max_fails = 2;
	keepalive 32;
	keepalive_requests 50;
	keepalive_timeout 30s;
}

2 ) 实际部署

2.1 应用服务器 (使用 nginx 模拟),比如当前ip地址为:192.168.184.20

server {
	listen 8020;
	location / {
		return 200 'Return Result For Server 8020\n';
	}
}

server {
	listen 8021;
	location / {
		return 200  'Return Result For Server 8021\n';
	}
}

server {
	listen 8022;
	location / {
		return 200 'Return Result For Server 8022\n';
	}
}

这里 模拟3台 应用服务器

2.2 nginx 服务器

upstream demo_server {
	server 192.168.184.20:8020 weight=3 max_conns=50 fail_timeout=10s max_fails=2;
	server 192.168.184.20:8021 weight=2;
	server 192.168.184.20:8022 weight=1;
}

server {
	listen 			80;
	server_name 	balance.baidu.com;
	location /balance/ {
		proxy_pass		http://demo_server;
	}
}

哈希算法

  • 上面的示例,演示的是加权轮询的方式,在分配请求的时候,会保持这个分配比例,而非严格按照顺序分配
  • 现在,来看新的一个负载均衡算法 — 哈希算法
  • 定义:哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值我们称之为哈希值,散落明文到哈希值的映射是不可逆的
  • 简单来说,哈希算法就是根据一个固定内容的值,经过哈希运算之后,可以得到一个唯一的值
  • 哈希算法有很多种,但是它的思想都是一样的,总的来说,它是根据一个内容经过一定的哈希值换算之后得到一个固定长度的一个字符串
  • 对一个文件内容不变的文件来说,它永远会得到一个相同的字符串值,这个算法可以解决文件传输前后校验是否一致的场景
  • 比如说,现在有两个文件,左侧的上和下,是不一样的,别看多了一行,就是多了一个字节,计算出来的内容都不会一样

1 )哈希指令

  • 语法:hash key [consistent];
    • 这个key 通常是一个内容, 可以使用变量,特定内容的变量
    • 可以根据请求头的内容来进行哈希运算,
    • 如果头部的某些内容来源一样,哈希值一定一致
    • 或者根据客户端的ip
  • 默认值:无
  • 上下文:upstream

2 )配置示例

2.1 这里使用Nginx模拟应用服务器

server {
	listen 	10020;
	location / {
		return 200 'Return Result For Server 10020\n';
	}
}

server {
	listen 	10010;
	location / {
		return 200 'Return Result For Server 10010\n';
	}
}

2.2 应用服务器

upstream demo_server_1 {
	hash 		$request_uri;
	server  	192.168.184.20:10020;
	server  	192.168.184.20:10010;
}

server {
	listen 		80;
	server_name balance_hash.baidu.com;
	location / {
		proxy_pass http://demo_server_1;
	}
}
  • 在上述两台服务器中,假如,请求在一台服务器上有缓存,在另一台是用不了的
  • 某一些情形下,为了保证来自同一个客户端的请求,总是能够分配到指定的一台服务器上
  • 可能需要根据这样一个哈希算法,把其永远分配到某一个服务器上,而不会再调度到另外一台服务器上
  • 其实最初它的一个设计应用是在缓存中用的比较多,像CDN这样的场景

IP Hash 算法

  • 哈希算法是可以指定各种不同的key来进行一个哈希运算,这适用于我们一些比较复杂的一个应用场景
  • 我们有一些特殊需求,比如,根据某一些应用层的信息,HTTP请求投入的某一些具体信息
  • 或者是请求行中的某一些具体信息来进行一个哈希运算
  • 它就是根据IP进行哈希运算,因为从这个算法的名称上也能够看出来

1 ) ip_hash 指令

  • 语法:ip_hash

  • 默认值:无

  • 上下文:upstream

  • 示例配置

    upstream demo_server_1 {
    	ip_hash    # 只加这一个配置就行
    	server  	192.168.184.20:10020;
    	server  	192.168.184.20:10010;
    }
    
  • 其实, ip_hash 指令是为了解决Nginx和后端应用程序服务器的一个 session 保持的

  • 它其实对出的一个应用场景,也是对于这种 session 保持的解决而生的

  • 某一些客户端在请求完服务器之后,常会有cookie信息一些

  • 对应到服务器端的时候,会有 session 信息, 对于不同的用户来说是不同的

  • 对于固定的客户端来说,使用ip hash这样一种负载运用算法来进行 session 保持

  • 无疑是一个简错的选择

最少连接数算法

  • 不管是 hash 还是 ip_hash,还是加权轮循的负载均衡算法,其实都忽略了一个重要的事实
  • 对于这些算法来说,没有将后端应用服务器当前的一个负荷状况给考虑在内
  • 只是根据我们从用户发来的请求做一些负带均衡算法的挑选或者是加权轮型就更简单粗暴了
  • 不会把任何因素考虑在内,而只是简单的将请求逐个分发
  • 包括 hash 或者 ip_hash,他们只能根据某一些特定的属性来对后端进行分发的
  • 但是这些属性也仅仅是来自于用户的请求,其实这样一些场景是不合理的
  • 比如说,现在应用服务器一的处理能力很强,应用服务器二和三处理能力特别的弱
  • 你看之前的这些算法就不合理了
  • 都没有将后端服务器的一个当前运行状态就是作为服务器分发请求的一个策略
  • 现在引入最少连接算法,它考虑上游服务器的一个情况所决定的一种算法

1 )最少连接算法

  • 从上游服务器,挑选一台当前已建立连接数最少的分配请求
    • Nginx 在收到用户请求之后,在如何去挑选后端应用服务器的时候
    • 会去考虑当前这个应用服务器具体已经建立了多少个连接,已经正在处理多少用户请求
    • 他会找最少的,将请求分发给这个
    • 在某些情形下,总是挑选当前后端应用服务器正在处理连接数最少的那台进行分发请求
  • 极端情形下退化为 rr 算法
    • 当服务器分配数都一样的场景下
    • 会退化到轮循算法,逐个分发

1.1 least_conn 指令

  • 模块 ngx_http_upstream_least_conn_module
  • 禁用通过 --without-http_upstream_least_conn_module
  • 语法:least conn;
  • 默认值:无
  • 上下文:upstream
  • 基于此算法的Nginx在挑选应用程序服务器的时候会找当前处理请求数最少的一个
  • 存在多个 worker 子进程的时候,Nginx 是一个 worker 子进程的情形下,就有一个work子进程
  • 每一次的请求它都会分配到不同的worker子进程中,不同的worker子进程,是怎么样知道每一个应用服务器,当前正在处理的请求有多少,包括它当前的一个响应状态是怎么样的
  • 也就是说,我们的后端应用服务器的一个具体状态信息,是没办法在不同的worker子进程之间共享的
  • 解决办法:在Nginx上去开辟出一块内存空间
    • worker 子进程在处理这个用户请求的时候,都会将后端对应的应用程序服务器的一个当前状态
    • 比如说它当前正在处理的一个用户连接数,访问失败的次数等服务器的一个共态信息给保存到共享内存中
    • 这样实现了最少连接的算法

1.2 zone 指令

  • 用于指定共享内存空间大小
  • 语法:zone name [size];
  • 默认值:无
  • 上下文:upstream
  • 示例
    upstream demo_server_1 {
    	zone        test     10M;
    	least_conn;
    	server  	192.168.184.20:10020;
    	server  	192.168.184.20:10010;
    }
    
  • 在某一些场景中会有用的,但是它用的也并不是很多

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

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

相关文章

阿里巴巴发布 Qwen2-VL 人工智能模型,具备先进的视频分析和推理能力

中国阿里巴巴集团的云计算部门阿里云周四宣布推出一款名为 Qwen2-VL 的新型人工智能模型,该模型具有高级视觉理解能力和多语言对话能力。 该公司在 Qwen-VL 人工智能模型的基础上,历时一年研发出了新模型,并表示它可以实现对长度超过 20 分钟…

easy_spring_boot Java 后端开发框架

Easy SpringBoot 基于 Java 17、SpringBoot 3.3.2 开发的后端框架,集成 MyBits-Plus、SpringDoc、SpringSecurity 等插件,旨在提供一个高效、易用的后端开发环境。该框架通过清晰的目录结构和模块化设计,帮助开发者快速构建和部署后端服务。…

基于Java+SpringBoot+Vue的学生评奖评优管理系统的设计与实现

基于JavaSpringBootVue的学生评奖评优管理系统的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 某信 gzh 搜索【智…

CGAL 2D Polygons

CGAL 2D Polygons 简单概述 CGAL 2D Polygons使用。 简述 2D Polygon多边形是由一条封闭的边链表组成。对于多边形的操作有若干种常见的算法,有些算法要求多边形是简单多边形。如果边不相交,则多边形为简单多边形,除非连续的边相交于它们的…

django外键表查询存储删除

查询 之前用get 现在用filter,get返回对象,filter返回列表django model的get和filter方法的区别_django模型objects.get-CSDN博客 存储 删除

[001-07-001].Redis中的BigKey使用分析

1、常见面试题: 1.阿里的广告平台,海量数据里面查询某一固定前缀的key2.小红书,如何在生产限制keys*/flushdb/flushall等危险命令以防止误删除误使用3.美团,MEMORU USAGE命令你使用过吗4.Bikey问题,多大算big&#xf…

Spring之配置类解析源码解析

解析配置类 解析配置类流程图:https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd 解析配置类思维脑图:https://www.processon.com/view/link/614c83cae0b34d7b342f6d14 在启动Spring时,需要传入一个AppConfig.class给Appli…

VMware安装Ubuntu Linux Server操作系统

本文主要描述在VMware虚拟机上安装Ubuntu Linux Server操作系统,本版本集成kubernetes云原生对应的microk8s组件。 如上所示,从Ubuntu官方网站上下载Ubuntu服务器版本的安装文件 如上所示,在VMware上新建虚拟机,指定已下载的Ubunt…

基于yolov5的明厨亮灶阳光厨房老鼠检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的明厨亮灶阳光厨房老鼠检测系统是一种高效、智能的食品安全监测解决方案。该系统利用YOLOv5网络模型,结合深度学习技术,实现对厨房环境的实时监控与智能分析。 YOLOv5以其高速和高精度的特性,在实时目标检测任务中…

chapter09-OOP高级部分——(内部类)——day13

413-四种内部类 414-局部内部类1 记住: (1)局部内部类定义在方法中/代码块(2)作用域在方法体或者代码块中(3)本质仍然是一个类 415-局部内部类2 416-匿名内部类本质 匿名内部类只能用一次,并实例化了一个tiger对象, tiger指向它的对象,tig…

18043 找出3个数中最大的数

### 思路 1. 从键盘输入三个整数&#xff0c;使用空格分隔。 2. 比较三个整数&#xff0c;找出其中最大的数。 3. 输出最大的数。 ### 伪代码 1. 读取输入的三个整数。 2. 比较三个整数&#xff0c;找出最大的数。 3. 输出最大的数。 ### C代码 #include <iostream>…

Python编码系列—Python调试秘籍:pdb调试工具的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

《神话:悟空》的破晓之路:文化深度与技术巅峰的交响乐章

在八月的炽热中&#xff0c;《黑神话&#xff1a;悟空》如同一道璀璨的光芒&#xff0c;划破了国产游戏的寂静夜空&#xff0c;不仅以其惊人的销量速度震撼了业界&#xff0c;更以其深厚的文化底蕴与顶尖的游戏设计&#xff0c;在全球玩家心中留下了不可磨灭的印记。这款游戏的…

Masonry的入门学习

Masonry的学习 文章目录 Masonry的学习前言使用MasonryMasonry支持的属性修饰语基础APIAuto Boxing中心点设置边距优先级创建约束更新约束使用Masonry来布局UIScrollview 小结 前言 在日常的开发中&#xff0c;我们如果面对一些很复杂的UI布局&#xff0c;我们如果统一使用fram…

并发编程之AtomicUnsafe魔法类详解

并发编程之Atomic&Unsafe魔法类详解_并发魔法类-CSDN博客

京东2025校招/社招内推信息

社招链接&#xff1a;https://zhaopin.jd.com/web/job/job_info_list/3 社招内推码&#xff1a;JC8DI 校招链接&#xff1a;https://campus.jd.com/home#/ 校招内推码&#xff1a;C49D1 有需要的同学也可私信我姓名、电话、邮箱内推已经投递的同学可私信我获取最新进展哦

国内访问GitHub很卡,steam连接断开怎么办

目录 第一章、问题分析1.1&#xff09;问题1.2&#xff09;解决&#xff1a;下载个加速器就好了 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、问题分析 1.1&#xff09;问题 国内访问GitHub很卡怎…

Docker容器技术详解

一、Docker简介及部署方法 1.1Docker简介 1.1.1什么是docker Docker是管理容器的引擎&#xff0c;为应用打包、部署平台&#xff0c;而非单纯的虚拟化技术 docker的重要特点和优势&#xff1a; 1. 轻量级虚拟化Docker 容器相较于传统的虚拟机更加轻量和高效&#xff0c;能够…

基于langchain的多轮对话RAG

目录 概述 整体架构 代码实现 输出展示 参考 概述 相比于单轮对话&#xff0c;多轮对话要考虑历史对话记录&#xff0c;大模型需要根据对话上下文去回答用户的问题。在RAG的场景中&#xff0c;通常需要通过问题去召回和问题相关的知识&#xff0c;再将知识和问题交给大模型…

江大白 | 大模型时代,CV目标检测任务,会走向何方?

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;大模型时代&#xff0c;CV目标检测任务&#xff0c;会走向何方&#xff1f; 以下文章来源于知乎&#xff1a;深度眸 作者&#xff1a;深度眸 编辑&#…