超越自我——带你学haproxy算法一遍过!!!

news2024/9/21 5:46:56

文章目录

  • 前言
    • 介绍
  • 静态算法
    • static-rr
    • first
  • 动态算法
    • roundrobin
    • leastconn
  • 其他算法
    • source算法
    • map-base 取模法
    • 一致性hash
    • uri
    • urI_param 取模法
    • hdr
  • 总结
  • 本文相关连接如下:

前言

本文相关连接如下:

  • 如果想更多了解haproxy的相关知识,请点击:一站式带你深入了解HAProxy
  • 如果想深入探讨haproxy的高级用法,请移步:进阶!haproxy高级功能与配置

介绍

HAProxy算法是为了实现高可用性、‌负载均衡以及基于TCP和HTTP的应用程序代理而设计的。‌HAProxy是一个使用C语言编写的自由及开放源代码软件,‌特别适用于那些负载特大的web站点,‌这些站点通常需要会话保持或七层处理。‌
HAProxy实现了一种事件驱动、‌单一进程模型,‌这种模型支持非常大的并发连接数。‌

  • HAProxyi通过固定参数balance指明对后端服务器的调度算法
  • balance参数可以配置在Elisten或backendi选项中。
  • HAProxy的调度算法分为静态和动态调度算法
  • 有些算法可以根据参数在静态和动态算法中相互转换。

静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。

static-rr

static-rr 基于权重的轮询调度

  • 不支持运行时利用s0ct进行权重的动态调整(只支持0和1,不支持其它值)
  • 不支持端服务器慢启动
  • 后端主机数量没有限制,相当于LVS中的wrr

慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没问题后在给一部分

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

在这里插入图片描述
不可更改体现:
在这里插入图片描述
验证:

[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

在这里插入图片描述


first

  • 根据服务器在列表中的位置,自上而下进行调度
  • 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
  • 其会忽略服务器的权重设置
  • 不支持用soct进行动态修改权重,可以设置0和1,可以设置其它值但无效

配置:

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

在这里插入图片描述

如果需要看效果,需要在两台主机上进行死循环,并设置最大连接数为1、

输出效果:
在这里插入图片描述

[root@haproxy ~]# echo "set weight webcluster/web1 2" | socat stdio /var/lib/haproxy/stats

[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

更改效果并没有成功,权重优先级低
在这里插入图片描述


动态算法

  • 基于后端服务器状态进行调度适当调整,
  • 新请求将优先调度至当前负载较低的服务器
  • 权重可以在haproxyi运行时动态调整无需重启

roundrobin

打在负载小的主机上,先看负载,再看权重

  1. 基于权重的轮询动态调度算法
  2. 支持权重的运行时调整,不同于引vs中的r轮训模式
  3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)
  4. 其每个后端backend中最多支持4095个server
  5. 支持对real server权重动态调整
  6. roundrobin为默认调度算法,此算法使用广泛

配置:

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

在这里插入图片描述

验证:
在这里插入图片描述

[root@haproxy ~]# echo "set weight webcluster/web1 2" | socat stdio /var/lib/haproxy/stats

[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

可以修改权重,但是权重都是2的情况下,因为负载优先,所以两个主机轮流上线
在这里插入图片描述


leastconn

  • leastconn加权的最少连接的动态
  • 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)
  • 比较适合长连接的场景使用,比如:MySQL等场景。

打在链接数少的主机上,先看链接数,后看权重

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service

注意:此处web2的权重,也就是20服务器权重为2,理应访问两次20主机,一次10主机,但因为算法是leastconn,因此效果变成了连接数优先,10和20主机轮番上线
在这里插入图片描述
在这里插入图片描述
连接与权重验证:

[root@haproxy ~]# echo "set weight webcluster/web1 3" | socat stdio /var/lib/haproxy/stats

[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

即使权重修改成功,但是连接优先级更高
在这里插入图片描述

其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法

source算法

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端wb服务器。

此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,很多会话将丢失,默认为静态方式,

如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时source算法的缺陷

缺点:同一家公司主机出去的IP是同一个,同一家访问会导致负载超和

解决方法:取模法和一致性hash

  • 可以通过hash-type支持的选项更改这个算法,一般是在不插入Cookiel的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

在这里插入图片描述
表现为流量只流向同一台服务器:

在这里插入图片描述

map-base 取模法

  • map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。
  • 此方法是静态的,即不支持在线调整权重不支持慢启动,可实现对后端服务器均衡调度
  • 缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type指定的默认值为此算法
  1. 所谓取模运算,就是计算两个数相除之后的余数,10%7=3,7%4=3
  2. map-based算法:基于权重取模,hash(source_.ip)%所有后端服务器相加的总权重

在这里插入图片描述

如果权重改变,则has偏移,导致服务器上下线,会导致会话丢失

在这里插入图片描述
配置:

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

在这里插入图片描述
实际操作验证:

正常访问情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当权重发生改变时,只能修改配置文件,因为不支持在线调整权重
在这里插入图片描述
100主机访问的服务器由原先的20变为10
在这里插入图片描述
10主机由原先的20服务器变为10服务器
在这里插入图片描述
只有20主机访问的还是原先的10服务器
在这里插入图片描述
总结:map-base 取模法当总权重发生改变,将引起会话连接的大面积改变


一致性hash

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动
该hash算法是动态的,支持使用socats等工具进行在线权重调整支持慢启动

  • 后端服务器哈希环点keyA=hash(后端服务器虚拟ip)%(2^32)
  • 客户机哈希环点keyl=hash(c1ient_ip)%(2A32) 得到的值在[0–4294967295]之间,
  • 将keyA和keyl都放在hash环上,将用户请求调度到离key1最近的keyA对应的后端服务器

hash环流程图:
在这里插入图片描述

  • 得到的IP是0到2^32-1之间

  • 为什么要减1:从0开始,所以要减1

客户端hash链接顺时针旋转,寻找最近的第一个服务器,如果第一个服务器关闭,则继续顺时针寻找下一个最近的服务器

面试:什么叫hash环

  1. hash环是一个0到2^32-1的一个数字被落到一个圆上,这个圆就叫hash环
  • 取模法: 对服务器IP和hash环的总数进行取模,是多少就落到上面

余数不会超过hash环的数量,最多2^32-1

后端服务器在线调度方式图解:
在这里插入图片描述

后端服务器离线调度方式图解:

hash一致性特点:即使权重改变或服务器下线,但是我该到的服务器没问题则还是到哪,不会发生服务器偏移

配置:

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done

在这里插入图片描述
验证:

正常运行下
100主机访问的服务器是20
在这里插入图片描述
10主机访问的服务器是10
在这里插入图片描述
20主机访问的服务器是10
在这里插入图片描述

当权重发生改变时
100主机访问的服务器还是20
在这里插入图片描述
10主机访问的服务器是10
在这里插入图片描述
20主机访问的服务器是10
在这里插入图片描述

当某个服务器下线(此处是10服务器下线),就会寻找下一个主机,原先是谁就还是访问谁,此处博主因为只开了两个服务器,效果并不明显,想效果更明显的小伙伴可以多开几台服务器
在这里插入图片描述


uri

  • 基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后
  • 根据最终结果将请求转发到后端指定服务器
  • 适用于后端是缓存服务器场景
  • 默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash(动态)。此算法基于应用层,所以只支持mode http,不支持mode tcp
# 语法格式
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
左半部分:/<path>;<params>
整个uri:/<path>;<params>:?<query>#<frag>

scheme:协议http
user:用户
password:密码
host:主机名
port:端口
path:文件路径/index.html

params:向服务器传递的指令,如Search
?代表
params:搜索的字段
frag:片段(在文件里面做一个索引,快速定位你点击的片段)

params例子:
在这里插入图片描述
uri与url图例
在这里插入图片描述

  1. URI = Uniform Resource Identifier 统一资源标志符
  2. URL = Uniform Resource Locator 统一资源定位符,资源的真实位置
  3. URN = Uniform Resource Name 统一资源名称,只指定到资源名称,没有资源的文件

在这里插入图片描述

向服务器添加网页:
在这里插入图片描述
访问的uri不变,访问的地址就不变

在这里插入图片描述

urI_param 取模法

url_param 对用户请求的 url 中的 params 部分中的一个参数 key 对应的 value 值作 hash计算,并由服务器 总权重相除以后派发至某挑出的服务器 ,后端搜索同一个数据会被调度到同一个服务器,多用与电商,通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server
如果无没 key ,将按 roundrobin 算法

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
#添加
listen webcluster
    bind *:80
    mode http
    balance url_param name,userid #支持对多个url_param hash
    hash-type consistent
    server web1 172.25.254.10:80  check inter 2 fall 3 rise 5  weight 1
    server web2 172.25.254.20:80  check inter 2 fall 3 rise 5  weight 2

在这里插入图片描述

搜索同一个东西,会调度到同一个服务器上
在这里插入图片描述


hdr

  • 针对用户每个http头部(header)请求中的指定信息做hash,

  • 此处由 name 指定的 http 首部将会被取出并做 hash计算,

  • 然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service 

在这里插入图片描述
验证:
在这里插入图片描述
在这里插入图片描述


总结

静态算法
static-rr--------->tcp/http 不支持动态更改,根据权重的轮询算法,服务器的权重越高,被分配到的请求就越多。
first------------->tcp/http 不支持动态更改,只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务

动态算法
roundrobin-------->tcp/http 它将清求轮流分配到各服务器上,此算法对于服务器的负载能力是均衡的。
leastconn--------->tcp/http 优先连接数,这是最少连接数算法,它会根据服务器当前的连接数和队列长度来决定是否分配新的连接

以下静态和动态取决于hash_type是否consistent
source------------>tcp/http ,基于清求来源P的算法,它会把来自同IP的请求分配到同一个服务器
Uri--------->http 基于请求的URI进行hash运算,然后根据得到的hash值选择服务器
urI_param--------->http 基于URL参数的算法,可以指定参数名,然后根据参数值的hash值来选择服务器
hdr–------->http 基于HTTP请求头来的算法,可以指定头名,然后根据头值的hash来选择服务器

各算法应用场景

first #使用较少
static-rr #做了session共享的web集群
roundrobin #任务调试,产品测试
leastconn #数据库

本文相关连接如下:

一站式带你深入了解HAProxy

进阶!haproxy高级功能与配置

  • 如果想更多了解haproxy的相关知识,请点击:一站式带你深入了解HAProxy
  • 如果想深入探讨haproxy的高级用法,请移步:进阶!haproxy高级功能与配置

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

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

相关文章

考试:操作系统知识(03)

分区存储管理 所谓分区存储组织&#xff0c;就是整存&#xff0c;将某进程运行所需的内存整体一起分配给它&#xff0c;然后再执行。有三种分区方式&#xff1a; 固定分区&#xff1a;静态分区方法&#xff0c;将主存分为若干个固定的分区&#xff0c;将要运行的作业装配进去…

ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化

这里在分享一个人口1km精度栅格数据&#xff0c;LandScan是由美国能源部橡树岭国家实验室&#xff08;ORNL&#xff09;提供的全球人口分布数据集&#xff0c;具有最高分辨率的全球人口分布数据&#xff0c;是全球人口数据发布的社会标准&#xff0c;是全球最为准确、可靠&…

架构设计-分层思想

一、为什么要分层设计&#xff1f; 分层设计是为了剥离硬件环境的依赖&#xff0c;使软件系统更好复用&#xff0c;当更换硬件方案时&#xff0c;只需要修改底层函数的初始化&#xff0c;抽象层和服务层完全不需要改动&#xff0c;这样极大的减小时间成本&#xff0c;平台能够很…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第二篇:项目登录功能的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Element UI左侧导航栏写法(递归组件实现)

1、左侧导航栏组件使用的是Element Ui的导航栏组件&#xff0c;思路&#xff1a;首先判断导航栏数据是否存在children&#xff0c;以此来实现一级菜单与多级菜单的渲染&#xff0c;然后使用递归组件实现多级菜单的子菜单渲染&#xff0c;注意使用递归组件需将菜单栏数据在父组件…

SQL— DDL语句学习【后端 10】

SQL— DDL语句学习 在数据管理的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff09;作为操作关系型数据库的编程语言&#xff0c;扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准&#xff0c;还为我们提供了强大的工具来管理、查…

TypeScript教程(四)type、interface、类型断言、非空断言

上一章我们讲解了Typescript的基础类型&#xff0c;接下来我们就来看看Typescript的、type、interface、类型断言、非空断言 type关键字(类型别名) type 关键字可以帮助我们为现有的类型创建别名&#xff0c;提高代码的可读性和可维护性 在前面&#xff0c;我们通过在类型注解…

一切计算皆AI,开放计算再破局

“OpenAI最差的决定就是没有开放它的大模型。”著名科技预言家凯文凯利在2024年最新演讲中强调开源对于AI发展的重要性。 的确&#xff0c;开源大模型近年来迸发出巨大的产业活力&#xff0c;推动了AI的协作与创新&#xff1a;2023年全球新发布的基础模型中有三分之二为开源模…

随笔二、OV5695摄像头测试

摘要&#xff1a;泰山派开发板SDK使用了GStreamer媒体框架作为音视频的编解码器&#xff0c;支持硬件编解码。开发板提供MIPI_CSI摄像头接口连接摄像头。 1. 摄像头信息 开发板MIPI-CPI接口是30pin、4lane&#xff1b;测试用的OV5696是2lane&#xff0c;像素500万&#xff0c;…

GPU云服务器有什么优点?

云服务器是一种通过互联网提供计算资源和服务的灵活、高性能的解决方案。而随着人工智能及数据密集型应用的迅猛发展&#xff0c;GPU&#xff08;图形处理器&#xff09;云服务器逐渐成为许多企业和个人的优选。下面将介绍GPU云服务器的几个优势。 1、GPU云服务器具备强大的计算…

线程的退出

线程退出方式总结&#xff1a; 1.pthread_exit; void pthread_exit(void *retval); 传的是退出状态值对应的地址 2.执行函数中return 3.pthread_cancel // int pthread_cancel(pthread_t thread); 4.在任何一个线程中调用了exit #include <stdio.h> #include <…

软件测试之Linux系统性能调优技巧

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 Linux系统性能调优是一项复杂且系统性的任务&#xff0c;它涉及操作系统内核、硬件资源、应用程序、文件系统、网络设置等多个方面。通过合理的调优策略&#xff0c;可以有效提高Linux系统的性能&#xff0c;满足生产环境…

qt-10基本对话框(文件--颜色--字体)

基本对话框--输入对话框 DialogDialog.hDialog.cpp exdialog.hexdialog.hexdialog.cpp 运行图文件对话框颜色对话框字体对话框输入对话框-字符串输入对话框-选择 Item输入对话框-数字 Dialog Dialog.h #ifndef DIALOG_H #define DIALOG_H#include "exdialog.h"#inc…

数字文创产业园怎么凭借智慧园区建设出圈

在数字化浪潮席卷全球的当下&#xff0c;数字文创产业正以前所未有的速度崛起。而数字文创产业园若想在众多竞争对手中脱颖而出&#xff0c;凭借智慧园区建设出圈无疑是一条明智之路。 首先得明白什么是智慧园区建设&#xff1f; 智慧园区建设指的是通过现代信息技术和智能化手…

超时控制+第三方调用控制

文章目录 第三方调用控制背景介绍一致性抽象同步转异步自动替换第三方压测支持 超时控制目标确定超时时间根据用户体验根据响应时间压力测试根据代码计算 监控超时时间 第三方调用控制 背景介绍 我的系统对可用性要求非常高&#xff0c;为此我综合使用了熔断、限流、降级、超…

mac 链接数据库报错 - Public Key Retrieval is not allowed

使用 DBeaver 链接 MySQL 时&#xff0c;连接失败&#xff0c;提示 Public Key Retrieval is not allowed 发现是需要修改一个链接属性字段&#xff0c;方式如下&#xff1a; 1、选中服务器&#xff0c;点击 编辑连接 2、连接设置 – 驱动属性 – allowPublicKeyRetrieval 改为…

暨南大学2024年硕士研究生报考录取情况统计表

今天暨南大学2024年硕士研究生报考录取情况统计表出来了&#xff0c;在之前的笔记中&#xff0c;我对比过2022年与2023年的硕士研究生报考录取情况统计表中暨南大学智科院人工智能专硕报考情况 2024硕士研究生报考录取情况统计表中智科院的电子信息对应的是人工智能专硕(01方向…

科研项目验收管理系统

TOC springboot245科研项目验收管理系统 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时…

面向对象编程-继承

目录 一、为什么需要继承 二、继承的基本介绍 1、继承的基本介绍 2、继承示意图 3、继承的基本语法 三、快速入门 四、继承的使用细节 五、练习 一、为什么需要继承 1、一个小问题&#xff0c;还是看程序&#xff0c;提出代码复用问题 1&#xff09;我们编写两个类&a…