Nginx负载均衡之负载均衡策略

        负载均衡技术是将大量的客户端请求通过特定的策略分配到集群中的节点,实现快速响应的应用技术。在应对高并发的应用请求时,单节点的应用服务计算能力有限,无法满足客户端的响应需求,通过负载均衡技术,可以将请求分配到集群中的多个节点中,让多个节点分担高并发请求的运算,快速完成客户端的请求响应。

1.轮询

        轮询(Round Robin)策略是 Nginx 配置中默认的负载均衡策略,该策略将客户端的请求依次分配给后端的服务器节点,对后端集群中的服务器实现轮流分配。轮询策略绝对均衡,且实现简单,但也会因后端服务器处理能力的不同而影响整个集群的处理性能。

        1) 加权轮询

        在 Nginx 的轮询策略中,为了避免因集群中服务器性能的差异对整个集群性能造成影响,在轮询策略的基础上增加了权重参数,让使用者可以手动根据集群中各服务器的性能将请求数量按照权重比例分配给不同的被代理服务器。

        2) 平滑轮询

        在加权轮询策略中,会按照权重的高低分配客户端请求,若按照高权重分配完再进行低权重分配的话,可能会出现的情况是高权重的服务器一直处于繁忙状态,压力相对集中。Nginx 通过平滑轮询算法,使得上游服务器组中的每台服务器在总权重比例分配不变的情况下,均能参与客户端请求的处理,有效避免了在一段时间内集中将请求都分配给高权重服务器的情况发生。

        配置样例如下:

http {upstream backend {server a weight=5;server b weight=1;server c weight=1;}server {listen 80;location / {proxy_pass http://backend;}}
}

        配置样例中 Nginx 平滑轮询策略计算过程如下。

  • 当前配置中 a,b,c 服务器的配置权重为 {5,1,1};
  • 配置样例中 Nginx 平滑轮询计算过程如下表所示。
    轮询次数当前权重选择后权重选择节点
    0{0, 0, 0}{0, 0, 0}--
    1{5, 1, 1}{-2, 1, 1}a
    2{3, 2, 2}{-4, 2, 2}a
    3{1, 3, 3}{1, -4, 3}b
    4{6, -3, 4}{-1, -3, 4}a
    5{4, -2, 5}{4, -2, -2}c
    6{9, -1, -1}{2, -1, -1}a
    7{7, 0, 0}{0, 0, 0}a

关于上表有以下几点需要说明:

  • 有效权重(effective_weight),初始值为配置文件中权重的值,会因节点的健康状态而变化;
  • 当前权重(current_weight),节点被选择前的权重值,由上一个选择后权重值及各节点与自己的有效权重值相加而得;
  • 选择后权重,所有节点中权重最高节点的当前权重值为其初始值与有效总权重相减的值,其他节点的权重值不变;
  • 有效总权重为所有节点中非备份、非失败状态的服务器的有效权重之和;
  • 根据上述平滑轮询算法,选择节点顺序为 {a,a,b,a,c,a,a}。

2.一致性哈希 

        Nginx 启用哈希的负载均衡策略,是用 hash 指令来设置的。哈希策略方法可以针对客户端访问的 URL 计算哈希值,对相同的 URL 请求,Nginx 可以因相同的哈希值而将其分配到同一后端服务器。当后端服务器为缓存服务器时,将极大提高命中率,提升访问速度。
        一致性哈希的优点是,可以使不同客户端的相似请求发送给同一被代理服务器,当被代理服务器为缓存服务器场景应用时,可以极大提高缓存的命中率。
        一致性哈希的缺点是,当上游服务器组中的节点数量发生变化时,将导致所有绑定被代理服务器的哈希值重新计算,影响整个集群的绑定关系,产生大量回源请求。

        配置样例如下:

http {upstream backend {hash $request_uri;  # 以客户端请求URI为计算哈希值的keyserver a weight=5;server b weight=1;server c weight=1;}server {listen 80;location / {proxy_pass http://backend;}}
}

         配置样例中 Nginx 哈希策略计算过程如下。

  • 首先会根据 $request_uri 计算哈希值;
  • 根据哈希值与配置文件中非备份状态服务器的总权重计算出哈希余数;
  • 按照轮询策略选出初始被代理服务器,如果哈希余数大于初始被代理服务器的权重,则遍历轮询策略中被代理服务器列表;
  • 当遍历轮询策略中被代理服务器列表时,要用哈希余数依次减去轮询策略中的上一个被代理服务器的权重,直到哈希余数小于某个被代理服务器的权重时,该被代理服务器被选出;
  • 若循环 20 次仍无法选出,则使用轮询策略进行选择。

        针对哈希算法的缺点,Nginx 提供了 consistent 参数启用一致性哈希(Consistent Hash)负载均衡策略。Nginx 采用的是 Ketama 一致性哈希算法,使用一致性哈希策略后,当上游服务器组中的服务器数量变化时,只会影响少部分客户端的请求,不会产生大量回源。
        Nginx 一致性哈希计算过程如下:
                1) 根据配置文件中非备份状态服务器的总权重乘以 160 计算出总的虚拟节点数量,初始化虚拟节点数组。
                2) 遍历轮询策略中的被代理服务器列表,根据每个服务器的权重数乘以160得出该服务器的虚拟节点数量,并根据服务器的 HOST 和 PORT 计算出该服务器的基本哈希(base_hash)。
                3) 循环每个服务器虚拟节点总数次数,由基本哈希(base_hash)值与上一个虚拟节点的哈希值(PREV_HASH)依次计算出所有属于该服务器的虚拟节点哈希值,并把虚拟节点哈希值与服务器映射关系保存在虚拟节点哈希值数组中。
                4) 对虚拟节点哈希值数组进行排序去重处理,得到新的有效虚拟节点哈希值数组。

        配置样例如下:

http {upstream backend {hash $request_uri consistent;       # 以客户端请求URI为计算哈希值的key,使用一致性# 哈希算法server a weight=1;server b weight=1;server c weight=1;server c weight=1;}server {listen 80;location / {proxy_pass http://backend;}}
}

配置样例中 Nginx 一致性哈希策略计算过程如下。

  • 首先根据 $request_uri 计算哈希值;
  • 通过二分法,快速在虚拟节点列表中选出该哈希值所在范围的最大虚拟节点哈希值;
  • 通过虚拟节点哈希值与虚拟节点集合总数取余,获得对应的服务器作为备选服务器;
  • 遍历轮询策略中被代理服务器列表,判断备选服务器的有效性,选出服务器;
  • 若循环 20 次仍无法选出,则使用轮询策略进行选择。

3.IP哈希 

        IP 哈希(IP Hash)负载均衡策略根据客户端IP计算出哈希值,然后把请求分配给该数值对应的被代理服务器。在哈希值不变且被代理服务器可用的前提下,同一客户端的请求始终会被分配到同一台被代理服务器上。IP 哈希负载均衡策略常被应用在会话(Session)保持的场景。
        HTTP 客户端在与服务端交互时,因为 HTTP 协议是无状态的,所以任何需要上下文逻辑的情景都必须使用会话保持机制,会话保持机制是通过客户端存储由唯一的 Session ID 进行标识的会话信息,每次与服务器交互时都会将会话信息提交给服务端,服务端依照会话信息实现客户端请求上下文的逻辑关联。
        会话信息通常存储在被代理服务器的内存中,如果负载均衡将客户端的会话请求分配给其他被代理服务器,则该会话逻辑将因为会话信息失效而中断。所以为确保会话不中断,需要负载均衡将同一客户端的会话请求始终都发送到同一台被代理服务器,通过会话保持实现会话信息的有效传递。

        配置样例如下:

http {upstream backend {ip_hash;            # 启用IP哈希负载均衡策略server a weight=5;server b weight=1;server c weight=1;}server {listen 80;location / {proxy_pass http://backend;}}
}

        配置样例中 Nginx 的 IP 哈希策略计算过程如下。

  • 在多层代理的场景下,请确保当前 Nginx 可获得真实的客户端源 IP;
  • 首先会根据客户端的 IPv4 地址的前三个八位字节或整个 IPv6 地址作为哈希键计算哈希值;
  • 根据哈希值与配置文件中非备份状态服务器的总权重计算出哈希余数;
  • 按照轮询策略选出初始被代理服务器,如果哈希余数大于初始被代理服务器的权重,则遍历轮询策略中被代理服务器列表,否则初始被代理服务器将被选出;
  • 当遍历轮询策略中被代理服务器列表时,要用哈希余数依次减去轮询策略中的上一个被代理服务器的权重,直到哈希余数小于某个被代理服务器的权重时该被代理服务器被选出;
  • 若循环 20 次仍无法选出,则使用轮询策略进行选择。

4.最少连接

        默认配置下轮询算法是把客户端的请求平均分配给每个被代理服务器,每个被代理服务器的负载大致相同,该场景有个前提就是每个被代理服务器的请求处理能力是相当的。如果集群中某个服务器处理请求的时间比较长,那么该服务器的负载也相对增高。在最少连接(least_conn)负载均衡策略下,会在上游服务器组中各服务器权重的前提下将客户端请求分配给活跃连接最少的被代理服务器,进而有效提高处理性能高的被代理服务器的使用率。
        配置样例如下:

upstream backend {least_conn;         # 启用最少连接负载均衡策略server a weight=4;server b weight=2;server c weight=1;
}server {listen 80;location / {proxy_pass http://backend;}
}

        配置样例中 Nginx 最少连接策略计算过程如下。

  • 遍历轮询策略中被代理服务器列表,比较各个后端的活跃连接数(conns)与其权重(weight)的比值,选取比值最小者分配客户端请求;
  • 如果上一次选择了 a 服务器,则当前请求将在 b 和 c 服务器中选择;
  • 设 b 的活跃连接数为 100,c 的活跃连接数为 60,则 b 的比值(conns/weight)为 50,c 的比值(conns/weight)为 60,因此当前请求将分配给 b。

5.随机负载算法 

        在 Nginx 集群环境下,每个 Nginx 均通过自身对上游服务器的了解情况进行负载均衡处理,这种场景下,很容易出现多台 Nginx 同时把请求都分配给同一台被代理服务器的场景,该场景被称为羊群行为(Herd Behavior)。
        Nginx 基于两种选择的力量(Power of Two Choices)原理,设计了随机(Random)负载算法。该算法使 Nginx 不再基于片面的情况了解使用固有的负载均衡策略进行被代理服务器的选择,而是随机选择两个,在经过比较后进行最终的选择。随机负载算法提供了一个参数 two,当这个参数被指定时,Nginx 会在考虑权重的前提下,随机选择两台服务器,然后用以下几种方法选择一个服务器。

  • 最少连接数,配置指令为 least_conn,默认配置;
  • 响应头最短平均时间,配置指令为 least_time=header,仅对商业版本有效;
  • 完整请求最短平均时间,配置指令为 least_time=last_byte,仅对商业版本有效。

        配置样例如下: 

upstream backend {random two least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;server backend4.example.com;
}

        在只有单台 Nginx 服务器时,一般不建议使用随机负载算法。

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

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

相关文章

DAY 45 企业级虚拟化技术KVM

企业级虚拟化技术KVM 1.kvm是什么 kernel virtualization machine 内核虚拟机 qemu的二次开发 软件全拼 qemu-kvm kvm virtulbox ovm vmware vsphere套件(vmawre-esxi) microsoft hyper-V 2.什么是虚拟化 资源利用 资源隔离 虚拟化管理&…

CleanMyMac X for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、启动台显示软件图标,表示安装成功 三、运行测试1、打开软件,配置2、授权,允许完全磁盘访问 安装完成&a…

驱动、BSP、HAL三者的区别和联系

目录 引言 一、驱动(Driver) 二、板级支持包(BSP, Board Support Package) 三、硬件抽象层(HAL, Hardware Abstraction Layer) 四、区别与联系 五、总结 引言 驱动(Driver)、板…

正规式理解

正规式(Regular Expression)是一种用于描述、识别字符串集合的模式(尤其是正则语言)的序列表达式。在软件设计中,正规式被广泛用于文本处理、搜索和替换、数据验证等场景。以下是对正规式的基本理解: 1. *…

django filter 数据 Response返回

在Django中,你可以使用Django的filter()方法来筛选查询集(QuerySet),并将结果返回给客户端。以下是一个简单的例子,展示了如何在Django视图中筛选数据,并将结果以JSON的形式返回给客户端。 首先,确保你有一个Django模…

vue3 defineComponent + 渲染函数h + 全局注册​

defineComponent 是 Vue 3 中的一个函数,用于定义一个组件。它是 Vue 3 的组合式 API 的一部分,提供了一种更加灵活和组织化的方式来定义组件。在 Vue 2 中,我们通常使用一个对象来定义组件,而在 Vue 3 中,defineCompo…

赶走异味保持清香,何浩明净味爽身香体膏

夏天来了,大家都想要清清爽爽的出门,但是汗味、狐臭这些小问题都在所难免,总要想办法应对,我目前用的是一款香体膏,它不仅能赶走那些让人尴尬的异味,还能让我们享受一整天的清新自在。 我用的这款叫做何浩明…

解决接入sleuth链路追踪后xxl-job定时任务的日志无日志问题

问题背景 随着业务规模的不断的增大, 系统的复杂度也越来越高, 公司软件架构也进入到了分布式微服务的阶段, 在这样的情况下每一次请求都有可能跨越多个项目, 传统的日志监控方式无法满足调用链路追踪, 这就导致问题定位/诊断服务变得复杂。所以我们引入了sleuth这一…

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供,分别是24MHz的HSE、32.768KHz的LSE。原…

重学java 74.Lombok的使用

少点心气,多点干劲 —— 24.6.18 一、lombok的安装使用 1.作用: 简化javabean开发 2.使用: a.下插件 ->如果是idea2022不用下载了,自带 b.导lombok的jar包 安装教程: http://t.csdnimg.cn/wq9MM c.修改设置 二、lombok的介绍 Lombok通过增加一…

gitlab 身份验证手机号验证没86

处理方案 在浏览器中摁 【F12】打开控制台,选择网络模块,找到手机号列表的请求,请求是 https://gitlab.com/-/countries,右击数据区域点击【替换内容】如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/di…

【信息学奥赛】CSP-J/S初赛03 计算机网络与编程语言分类

第1节 计算机网络基础 1.1 网络的定义 所谓计算机网络,就是利用通信线路和设备,把分布在不同地理位置上的多台计算机连 接起来。计算机网络是现代通信技术与计算机技术相结合的产物。 网络中计算机与计算机之间的通信依靠协议进行。协议是计算机收、发…

Linux文件与内容查阅、归档压缩

#Linux系统基础 文件与内容查找、归档压缩 find命令搜索文件 grep对文件的内容进行搜索 tar命令进行文件的压缩与解压缩 一、文件的查找 格式实例:find . -name "123.txt"说明find起始目录查找类型查找条件./ 或 .-name“123.txt”在当前目录中查找…

CIC-DDoS2019-Detection

CIC-DDoS2019 对CIC-DDoS2019数据集进行检测,本文提供了如下内容: 数据清洗与合并机器学习模型深度学习模型PCA,t-SNE分析数据,结果可视化 代码地址:[daetz-coder](https://github.com/daetz-coder/CIC-DDoS2019-Detection) 1、数据集加载…

echart在线图表demo下载直接运行

echart 全面的数据可视化图表解决方案 | 折线图、柱状图、饼图、散点图、水球图等各类图表展示 持续更新中 三色带下表题速度仪表盘 地图自定义图标 动态环形图饼状图 动态水波动圆形 多标题指针仪表盘 温度仪表盘带下标题 横向柱状图排名 环形饼状图 双折线趋势变化

排序——快速排序

目录 思想 演示 代码实现 解释 优化 三数取中 小区间优化 补充 挖坑法 双指针法 非递归实现 思想 快速排序是一种二叉树结构的交换排序方法。 基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列&am…

​【数据结构与算法】冒泡排序:简单易懂的排序算法解析

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​ 目录 一、引言 二、冒泡排序原理 🍃基本思想: 🍃算法…

课程笔记 | 数字设计基础

1.数字ASIC设计流程 2.组合与时序电路 3.同步与异步复位 4.锁存器Latch 5. RTL VS Gate 6.建立与保持时间 7.流水线设计 8.时钟树综合 9.Cell延时 10.PVT特性 11.Wire延时 1.根据ASIC流程的介绍,理解静态和动态验证的区别。请指出以下验证对应ASIC流程中的…

优化:服务队列堵塞,内存不足,CPU打满导致宕机,服务卡死

一.事件:刚接手的项目因消息队列堵塞频繁报警,交接的时候原负责人说项目是最近出现的问题,暂时无法解决,只能靠重启解决; 二.排查:因公司用的是jre,也没有其他第三方工具,只能按照经…

自杀行为的神经生物学认识

自杀行为的神经生物学认识 编译 李升伟 隐藏在自杀行为背后的大脑生化机制正引领人类对自杀的认识从黑暗步入光明。科学家希望未来这些机制能带来更好的治疗和预防策略。 基斯 • 范希林根(Cornelis Van Heeringen)第一次遇见瓦莱丽( Va…