• 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 [root@localhost ~]# yum install socat
    2 [root@localhost ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock         #查看haproxy的socket帮助信息
    3 [root@localhost ~]# echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock    #查看haproxy的状态信息
    4 [root@localhost ~]# echo "disable server yewu-service-80/web1" | socat stdio /var/lib/haproxy/haproxy.sock #以动态的方式禁用web1这个后端服务器;指定listen的name及需要禁用的后端服务器的name
    6 [root@localhost ~]# echo "get weight yewu-service-80/web1" | socat stdio /var/lib/haproxy/haproxy.sock    #查看后端web1服务器的权重
    7 [root@localhost ~]# 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
  • 相关阅读:
    Oracle exp/imp导出导入命令及数据库备份 (转载)
    多表初始化
    调用别的窗体
    修复k8s内存泄露问题
    如何高效的学习(转)
    Ansible11:变量详解【转】
    沟通的方式方法
    shell中的循环及条件判断
    Tomcat参数优化
    将DataReader转化为DataTables的一个简单实现
  • 原文地址:https://www.cnblogs.com/dongzhanyi123/p/12173558.html
Copyright © 2020-2023  润新知