负载均衡算法介绍

背景

负载均衡的概念实在太普遍了,从Nginx、Haproxy到Dubbo、Thrift、Hessian等到处都能看到,就不多介绍了。

常用负载均衡算法

轮询和加权轮询

轮询比较简单,在一个Server列表中请求会按顺序打到不同服务器上。
加权轮询也比较简单,即Server列表中权重高的出现的次数更多,参考资料中有提到加权轮询应当注意分散权重高的Server在列表中出现的位置,比如在{a:5, b:1, c:1}的情况下{a, a, b, a, c, a, a}列表会比{a, a, a, a, a, b, c}合理。

优点

  • 基本可以保证每个Server负载绝对均衡或加权均衡

缺点

  • 请求和处理请求的Server无关,要另外维护Session状态
  • 并发情况下需要考虑对下标修改的线程安全问题

随机和加权随机

从Server列表中随机或加权随机选一个调用。随着调用次数增加,Server的负载情况会越来越接近轮询或加权轮询的结果。

优点

  • 除了Server的增添之外,不需要考虑线程安全问题

缺点

  • 请求和处理请求的Server无关,要另外维护Session状态

源地址哈希

源地址哈希算法对相同来源的IP等于来源相关的信息进行哈希,保证相同来源的请求打到相同的Server。

优点

  • 对Session状态维护友好

缺点

  • 对Server的上下线非常不友好,一旦出现Server上下线,极有可能导致大规模的请求无法命中原来的Server

一致性哈希

与源地址哈希类似,能做到尽量保证相同来源的请求打到相同Server。
一致性哈希具体介绍可参考以前的博客。

优点

  • 对Session状态维护友好
  • 对Server上下线友好,但Server上下线也会有少部分请求无法命中原Server

缺点

  • 算法实现相对复杂

最小连接及加权最小连接

每次选择当前连接数最小或按权重缩放连接数以后连接数最小的Server。
某个Server当前连接数小说明其当前任务少,相对而言负载更低,侧面说明其可以承担更多的负载。

优点

  • 并非从请求调用方考虑,而是从服务方来考虑负载问题

缺点

  • 需要另外维护Session状态
  • 实现较为复杂

参考资料

几种简单的负载均衡算法及其Java代码实现 - 五月的仓颉 - 博客园

本文搬自我的博客,欢迎参观!

你可能感兴趣的:(负载均衡算法介绍)