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

负载均衡

  • 在真正的反向代理场景中,必然涉及到的一个概念,就是负载均衡
  • 所谓负载均衡,也就是将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.rhkb.cn/news/411281.html

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

相关文章

类与ES6类之间的继承

前言 ● 下面是之前学习ES6 classes的代码 class PersonCl {constructor(fullName, birthYear) {this.fullName fullName;this.birthYear birthYear;}calcAge() {console.log(2037 - this.birthYear);}greet() {console.log(你好${this.fullName});}get age() {return 2037…

debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)

文章目录 debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)概述笔记G480上安装debian12配置debian12现在用WindTerm_2.6.0按照telnet方式去连接试试配置debian12中的telnet安装telnet服务查看所有服务当前ssh, telnet状态准备更新openssl3.2和openssh在真机上更新openssl…

自动分词代码

代码 from wordsegment import load, segment# 加载模型 load()# 示例 actions ["seeyoulater","turnleft","turnr" ]segmented_actions [segment(action) for action in actions] segmented_actions [" ".join(action) for actio…

云计算概述

云计算的产生以及发展 分布式计算:包含了云计算和网格计算 云计算:以数据为中心进行的计算 网格计算:以计算为中心进行的计算 诞生-1999 初期的发展-2007-2008 加速发展-2009-2014 日渐成熟阶段-2015-目前 云计算的种类 公有云-第三方提供…

chapter08-面向对象编程——(chapter08作业)——day10

343-作业01 package chapter08.homeworks;public class Homework01 {public static void main(String[] args) {/*1.定义一个Person类{name, age, job},初始化Person对象数组,有3个person对象,并按照age从大到小进行排序,提示,使用冒泡排序 H…

Day50 | 108.冗余连接 109.冗余连接II

108.冗余连接 108. 冗余连接 题目 题目描述 树可以看成是一个图(拥有 n 个节点和 n - 1 条边的连通无环无向图)。 现给定一个拥有 n 个节点(节点标号是从 1 到 n)和 n 条边的连通无向图,请找出一条可以删除的边&…

一个简单的CRM客户信息管理系统,提供客户,线索,公海,联系人,跟进信息和数据统计功能(附源码)

前言 在当今快速发展的商业环境中,企业管理面临着种种挑战,尤其是如何有效管理和维护客户关系成为了一个关键问题。现有的一些处理方案往往存在功能分散、操作复杂、数据孤岛等痛点,这不仅影响了工作效率,也难以满足企业对客户关…

使用kafka完成数据的实时同步,同步到es中。(使用kafka实现自动上下架 upper、lower)

文章目录 1、发送消息 KafkaService2、生产者 service-album -> AlbumInfoServiceImpl2.1、新增 saveAlbumInfo()2.2、更新 updateAlbumInfo()2.3、删除 removeAlbumInfo() 3、消费者 service-search - > AlbumListener.java 上架:新增专辑到 es下架&#xff…

【归纳总结】常见排序算法及其实现:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快排、归并排序

思维导图: 目录 思维导图: 一、插入排序 1.直接插入排序: a:基本思想: b:基本步骤: c:复杂度分析 d:Java代码实现: 2.希尔排序(缩小增量排序) a:基本思想: c…

用AI来学习英语口语(白嫖,所以稍微麻烦些)

写在前面 本文看下如何使用AI来免费学习英语口语。 1:正文 首先,我们点击这里来到一个对话窗口,你可以在这个窗口中使用英语来询问你的问题,比如what can i do when i am not happy: 接着复制机器人回答内容&#…

离散数学中的逻辑基础(1)

目录 引言 1. 命题及其逻辑运算 2. 逻辑等价与范式 3. 逻辑推理规则 4. 逻辑问题练习 5. 总结 引言 逻辑是离散数学的核心概念之一,它用于精确描述数学命题并分析其关系。逻辑不仅是数学证明的基础,也是计算机科学中算法设计和编程的基石。本篇文…

minio文件存储+ckplayer视频播放(minio分片上传合并视频播放)

文章目录 参考简述效果启动minio代码配置类RedisConfigWebConfigMinioClientAutoConfigurationOSSPropertiesapplication.yml 实体类MinioObjectResultStatusCodeOssFileOssPolicy 工具类FileTypeUtilMd5UtilMediaTypeMinioTemplate 文件分片上传与合并MinioFileControllerMini…

Avalonia与WPF开发时的差异总结

1.一个控件绑定到另外一个控件的属性 WPF: <TextBox Height"30" Width"100" x:Name"tb"></TextBox><TextBlock Text"{Binding ElementNametb,PathText}" ></TextBlock>Avalonia: <TextBox Height"3…

YarnClient发送和接收请求源码解析

YarnClient发送和接收请求流程 Yarn是通过RPC协议通信的&#xff0c;协议类型可以通过查看RpcKind类得知&#xff0c;总共有三种类型&#xff1a; RPC_BUILTIN ((short) 1), // Used for built in calls by tests RPC_WRITABLE ((short) 2), // Use WritableRp…

比特币的签名和验证(基于ECDSA)

比特币&#xff08;Bitcoin&#xff09;和以太坊&#xff08;Ethereum&#xff09;等区块链技术使用了加密算法来确保交易的安全性。私钥签名和公钥验证是这些算法的核心部分&#xff0c;主要用于证明交易的发起者拥有交易中使用的资金的控制权&#xff0c;而不需要暴露私钥本身…

浪潮服务器NVME 硬盘通过 Intel VROC 做RAID

INTEL VROC Configuration solution 1.VMD configuration in BIOS Processor > IIO Configuration> Intel(R) VDM Technology> Intel(R) VMD for volume Management Device on Socket 0 “CPU 0”, Intel VMD for volume management device for “PStack0” or “PSta…

【香橙派系列教程】(十七) 视觉垃圾桶-功能完善优化

【十七】视觉垃圾桶-功能完善优化 文章目录 【十七】视觉垃圾桶-功能完善优化一、增加垃圾桶开关盖1.引脚2.PWM 频率的公式3.PWM_APIsoftPwmCreatesoftPwmWrite附加说明softPwmStop 4.代码pwm.cpwm.hmain.c 二、项目代码优化编译运行 三、增加OLED 屏幕显示功能myoled.hmyoled.…

小白之 FastGPT Windows 本地化部署

目录 引言环境步骤1. 安装 docker2. 启动 docker3. 浏览器访问4. One API 配置语言模型、向量模型渠道和令牌5. 创建 FastGPT 知识库6. 创建 FastGPT 应用 官方文档 引言 部署之前可以先看一下 RAG 技术原理&#xff0c;也可以后面回过头来看&#xff0c;对一些概念有些了解&a…

Qt+FFmpeg开发视频播放器笔记(一):环境搭建

一、FFmpeg介绍 FFmpeg是一个开源的跨平台多媒体处理工具集&#xff0c;它可以用于处理音频、视频和其他多媒体数据。FFmpeg提供了一组功能强大的命令行工具&#xff0c;用于音频和视频的编解码、转换、处理、流媒体传输等任务。 FFmpeg支持多种音频和视频格式&#xff0c;包…

【自动化】考试答题自动化完成答案,如何实现100%正确呢

一、科目仿真考试不能自动答题 我的答案是可以的&#xff0c;电脑程序可以模拟人的操作完成所有的答题并提交结束考试 二、分析页面内容 完成一个题目&#xff0c;包括判断题&#xff0c;对与错2选1答案&#xff0c;单选题ABCD4选1答案&#xff0c;多选题大家想一想 F12查看按…