常用负载均衡算法

常用负载均衡算法

简介

所谓负载均衡,就是当有多个服务节点时,尽可能地把请求均匀的分配到这些节点上。

在如今这个分布式架构盛行的时代,可以说从web入口到数据库的各个层,都能见到负载均衡的身影。本文不具体探讨nginx或者其他具体技术框架的负载均衡算法实现,而是笼统地介绍一些常用的负载均衡算法。

负载均衡的意义

  • 最优化资源使用,提高整个系统吞吐率
  • 增强系统可靠性,避免单点故障问题

选择负载均衡算法需要考虑哪些问题?

  1. 不同节点的服务能力是否一样,包含CPU、网络等
  2. 是否需要保持会话状态,或者说是否需要同一个请求发到同一个节点

负载均衡算法

  1. 轮询算法(round-robin) & 加权轮询(weight round-robin)

    以轮询的方式依次请求不同的服务器。一般设置个权重,例如有3台服务器[(s1, 1), (s2, 2), (s3, 0)],在一个周期里,s1权重为1所以执行1次,s2权重为2所以执行2此,s3权重为0不执行。设置权重为0,是间接摘掉服务器的一种方式。

    • 优点:实现简单、高效;
    • 缺点:请求到目的结点的不确定,造成其无法适用于有写的场景(缓存,数据库写)。
  2. 随机算法 & 加权随机算法

    请求随机分布到各个服务器;非加权随机,各个服务器被调度的概率一样。加权随机,权重不同则被调度的概率也不同。

    • 优缺点同round-robin
  3. 哈希法(会话保持算法)

    根据key值,将请求落在hash(key) % serverSize号服务器。可以保证一个同一个键一定落在相同的服务器上

    • 优点:相同key一定落在同一个结点上,这样就可用于有写有读的缓存场景;
    • 缺点:在某个结点故障后,会导致哈希键重新分布,造成命中率大幅度下降;
  4. 一致性哈希 可以解决上面哈希法存在的缺点。一致性哈希的详细介绍请阅读本博另一篇文章一致性哈希算法的原理

  5. 最少连接算法(least connection)

    连接数最少的服务器优先被调度。

    • 优点:考虑了服务器运行时状态,性能好的服务器获得更多机会。