>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19540 个阅读者 刷新本主题
 * 贴子主题:  Haproxy支持的调度算法 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-03-15 13:29:13     消息  查看  搜索  好友  邮件  复制  引用

  目前 haproxy 支持的负载均衡算法有如下 8 种  

1.roundrobin

  动态加权轮询算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机;在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。

2.leastconn

最小连接数算法,连接数最少的服务器优先接收连接。建议用于长会话场景中使用,例如LDAP、SQL等协议,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。

3.static-rr

静态轮询算法,不支持权重的运行时调整和慢启动机制。每个服务器根据权重轮流使用,类似roundrobin。另外,它对服务器的数量没有限制。

4 、source

源地址哈希算法,对请求源IP地址进行哈希;

取模法:将源地址hash计算后除以服务器总权重,服务器变动会影响全局调度效果;根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;

一致性hash:服务器变动仅影响局部调度;动态调度;

5、uri

表示根据请求的URI左端(问号之前)或整个URI做hash进行哈希计算,并与服务器的总权重相除后根据结果派发至某挑选出的后端主机。只要服务器正常,以最大限度的提高缓存的命中率。

作用是能够将对同一个uri的请求始终发往一个后端主机;适用于后端为缓存服务器和反病毒代理的场景; 该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。该算法只能用于HTTP后端。

6 、url_param

在HTTP GET请求的查询串中查找<param>中指定的URL参数的值做hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;基本上可以锁定使用特制的URL到特定的负载均衡器节点的要求;

此算法常用来追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个后端主机;

该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

7 、hdr(name)

对于每个http请求,此处由<name>指定的http首部会被取出;如果此首部没有有效值,则用roundrobin代替;否则,对其值进行hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;

该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

8 、rdp-cookie (name )

为每个进来的TCP请求查询并哈希RDPcookie<name>;

该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。如果没有cookie,则使用roundrobin算法代替;

该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据 “hash-type” 的变化做调整。

————————————————————————————————————————————

hash-type算法类型:可作用于所有需要进行hash计算的算法中【可定义在defaults,listen,backend】,在balance 指令中选定与hash 有关的算法,都会受此影响。

hash-type <method> <function> <modifier>

    <method>:map-based/consistent    <function>:sdbm/djb2/wt6

默认采取的方法为map-based
< method > 如下:

map-based:取模法,hash数据结构是静态数组;该hash是静态的,不支持在线调整权重,不支持慢启动;

该算法调度平滑,后端服务器能够均匀承受负载;缺点也是明显的:当服务器的总权重发生变化时,即有服务器上线或下线,都会导致调度结果整体改变。如果想避免此种情况应采用consistent 方法;

consistent:一致性哈希,哈希的数据结构是“树”;该hash是动态的,支持在线调整权重,支持慢启动

每一个server 会在"树"中出现多次, 在树中查找hash key,并选择最近的server;
该方法的优点在于,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动。所以十分适合缓存服务器;
缺点:该算法不够平滑,很容易导致后端服务器负载不均衡。所以很有必要对服务器的权重以或者服务器ID进行调整;
为保持均匀负载,应该保证所有服务器ID保持一致;

            

----------------------------
原文链接:https://blog.51cto.com/jinyudong/1910219

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-19 11:40:52 重新编辑]
  Java面向对象编程-->数组
  JavaWeb开发-->JSP技术详解(Ⅰ)
  JSP与Hibernate开发-->映射组成关系
  Java网络编程-->ServerSocket用法详解
  精通Spring-->CSS过渡和动画
  Vue3开发-->Vue CLI脚手架工具
  整理得吐血了,二叉树、红黑树、B、B+树超齐全,快速搞定数据...
  常见的调度算法
  HAProxy 之 算法介绍
  银行家算法范例
  Java 选择排序算法
  如何面对“算法”的困惑?
  AES算法,DES算法,RSA算法JAVA实现
  ipvsadm及lvs的调度算法
  有趣的位图排序算法
  天干地支算法
  用Java实现回文数算法
  Binary Search二分查找算法
  微软面试题:买卖股票的最佳时机
  LinkedList,LinkedHashMap,LruCache源码解析
  谷歌面试算法题:两个排序数组的中位数
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。