haproxy调度算法详解一

HAProxy调度算法

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

haproxy基于socat动态调整权重

socat是linux下的一个多功能网络工具,socat的主要特点是在两个数据流之间建立通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPV6、socket文件等。
使用echo把命令打印出来,通过管道传送给socat;socat需要添加stdio,以标准io(标准输入输出)的方式接收管道传送过来的指令,把传送过来的指令发送socket文件,socket文件会调用进程处理发送过来的请求;unix socket只能用于本地通讯,不能跨服务器通信
1 [[email protected] ~]# yum install socat
2 [[email protected] ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock         #查看haproxy的socket帮助信息
3 [[email protected] ~]# echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock    #查看haproxy的状态信息
4 [[email protected] ~]# echo "disable server yewu-service-80/web1" | socat stdio /var/lib/haproxy/haproxy.sock #以动态的方式禁用web1这个后端服务器;指定listen的name及需要禁用的后端服务器的name
6 [[email protected] ~]# echo "get weight yewu-service-80/web1" | socat stdio /var/lib/haproxy/haproxy.sock    #查看后端web1服务器的权重
7 [[email protected] ~]# echo "set weight yewu-service-80/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock  #修改后端web1服务器的权重为3,只能修改动态算法的权重;静态算法修改权重只能修改配置文件


注:使用命令行修改的信息,只是临时修改,只要重启服务就会失效,所以以配置文件为准。

静态算法

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

static-rr静态轮询

static-rr:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动(慢启动是新增加的服务器会逐渐增加请求数,而不会一次性添加流量),其后端主机数量没有限制。

示例:
1 listen yewu-service-80
2  bind 192.168.38.37:80
3  mode http
4  balance static-rr
5  option forwardfor
6  server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
7  server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5
只能通过修改配置文件修改权重,修改完重启服务或者reload

first

first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数(TCP连接)达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置。

示例:
1 listen yewu-service-80
2  bind 192.168.38.37:80
3  mode http
4  balance first
5  option forwardfor
6  server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
7  server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

动态算法

动态算法:基于后端服务器状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。

roundrobin

roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中(每个listen)最多支持4095个real server,roundrobin为默认调度算法,且支持对real server权重动态调整。

示例:
1 listen yewu-service-80
2  bind 192.168.38.37:80
3  mode http
4  balance roundrobin           #默认设置,可以不添加
5  option forwardfor
6  server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
7  server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

leastconn

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

示例:
1 listen yewu-service-80
2  bind 192.168.38.37:80
3  mode http
4  balance leastconn
5  option forwardfor
6  server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
7  server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

其他算法

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

source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
用户第一次请求会通过hash被分配到一台服务器,第二次请求则也会通过对用户的源地址做hash运算,然后对后端服务器的总权重进行取模,根据取得的模,分配到对应权重的后端服务器,以此实现会话保持(取模的得数是不可能等于总权重的,如果取模的得数等于总权重,则会进1,就会取不到模,所以取模的得数只会小于总权重)。
源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
map-base取模法
map-based:取模法,基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变,不推荐使用此算法
所谓取模运算,就是计算两个数相除之后的余数,10%7=3, 7%4=3,(2^32-1)%(1+1+2)
一致性hash

haproxy会把用户请求的源地址做hash,并且把hash后的值存放到内存中的一个虚拟表中,虚拟表中记录了一个范围内的hash值所对应的后端服务器;haproxy会根据hash值顺序寻找所对应的主机,当一个后端服务器宕机,haproxy会把代理到宕机服务器的请求顺序重定向到宕机服务器的hash范围后面的主机上。不会影响宕机服务器的hash范围前的请求,只会影响宕机服务器当前hash范围内的请求。 一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n 。

示例:

1 listen yewu-service-80
2  bind 192.168.38.37:80
3  mode http
4  balance source
5  hash-type consistent          #必须添加此项,不添加此项算法将会为取模法,并且不支持动态修改权重
6  option forwardfor
7  server web1 192.168.38.27:80 weight 1 check inter 3000 fall 3 rise 5
8  server web2 192.168.38.47:80 weight 1 check inter 3000 fall 3 rise 5

原文地址:https://www.cnblogs.com/dongzhanyi123/p/12173558.html

时间: 2024-10-04 05:14:18

haproxy调度算法详解一的相关文章

haproxy 基础详解 及 动静分离的实现

haproxy 介绍 1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器 负载均衡调度器分类 工作在四层: # lvs 工作在七层: # nginx (web,http reverse proxy,cache) # haproxy (http reverse proxy,tcp proxy) # tcp: 实现MySQL的读写中读的负载均衡 # ats (apache traffic server) # perlbal # pound

HAproxy指南之haproxy配置详解(理论篇)

一.haproxy配置文件详解 haproxy配置分为五部分,分别如下: 1 global:  (全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关) 2 default : (配置默认参数,这些参数可以被用到frontend,backend,Listen组件) 在此部分中设置的参数值,默认会自动引用到下面的frontend.backend.listen部分中,因引,某些参数属于公用的配置,只需要在defaults部分添加一次即可.而如果frontend.backend.l

高性能Web服务之haproxy应用详解及实现论坛的动静分离机制

HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. 下面通过案例架构详解HAproxy应用,架构图如下所示: 以上架构实现过程如下: (1).在node1,node

HAproxy配置文件详解

global # 全局参数的设置 log 127.0.0.1 local0 info   # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志 user haproxy group haproxy    # 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之 daemon     # 以守护进程的方式运行 nbproc

haproxy 配置详解

OPTION 选项: option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送 此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略 此cookie值会影响处理结果.如果避免这种情况配置此选项,防止产生多余的cookie信息. option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项

LVS三种模式及常见的四种调度算法详解

LVS三种工作模式: 1. Virtual server via NAT(VS-NAT) 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配Internet的保留私有地址,只有负载均衡器需要一个合法的IP地址. 缺点:扩展性有限.当服务器节点(普通PC服务器)数据增长到20个或更多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包都需要经过负载均衡器再生.假使TCP包的平均长度是536字节的话,平均包再生延迟时间大约为60us(在Pentium处理器上计算

haproxy 配置文件详解 之 配置文件示例

此示例文件在haproxy1.8.20 测试没有问题: global log 127.0.0.1 local0 info maxconn 4096 user nobody group nobody daemon nbproc 1 pidfile /usr/local/haproxy/logs/haproxy.pid defaults mode http retries 3 timeout connect 10s timeout client 20s timeout server 30s time

短进程优先的调度算法详解

一.SPF算法简介 SJF算法 SJF(shortest job first)是以进程的运行时间长度作为优先级,进程运行时间越短,优先级越高. SJF算法的缺点 必须预知进程的运行时间.即使是程序员也很难准确估计进程运行时间.如果估计过低,系统就可能按估计的时间终止进程的运行,但此时进程并未完成,故一般都会偏长估计 对长进程不利.长进程的周转时间会明显地增长.可怕的是,SJF算法完全忽视进程等待时间,可能使进程等待时间过长,出现饥饿现象. 人机无法实现交互. 完全未考虑进程的紧迫程度.不能保证紧

【转】haproxy详解

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载.HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,并且