负载均衡以及权重

目录

负载均衡

前言

所谓负载均衡,就是通过相关技术将特定的业务分配给不同的服务去处理,从而提高系统的业务处理能力和保证系统系统的高可用性,从而保证所有的业务不是被同一个服务器处理而导致该服务器过载。当然负载均衡也不能理解为保证给所有的服务器分配相同的工作量,而是要根据服务器的不同性能、不同网络环境等等来综合考虑。

常用算法

Random(随机)

最简单的算法,通过随机来选定最终的服务器。

Round Robbin(轮询)

顾名思义,依次使用不同的服务器来处理业务。保证每台服务器都能分配到业务。

Least Load(最小负载)

该算法可以根据服务的负载情况来选择,有一定的智能性。衡量服务器负载的度量有很多。在dapneg中,选择的最小连接数(leastActive)来表示。

ConsistentHash (一致性哈希)

根据参数进行hash来选定服务器。在dapeng中目前还未实现。

权重设计

上述算法都是默认所有的服务器的权重是一致的。但是在实际中,根据服务器的性能和环境不同,需要对其配以不同的权重才能满足生产需求,因此在dapeng的负载均衡算法中对其进行了权重设计。因为最小连接数算法并未涉及到权重,因此dapeng仅对随机和轮询算法进行了权重设计。

带权重的随机算法

在服务实例的权重进行更改后或者删减和增加服务实例后,对所有实例进行遍历,在遍历的过程中,判断所有实例的权重是否相同并计算总权重。如果所有实例的权重相同则随机选取一个实例(与权重无关),如果权重不相同,则以总权重为上限,随机产生一个offset,然后遍历实例一次减去当前实例的权重,当offset<0时,则选到目标实例。 如此权重越高的实例,被选中的可能性越高。

带权重的轮询算法

该算法同样是在服务实例的权重进行更改后或者删减和增加服务实例后遍历所有的实例,遍历过程中判断权重是否相同,如果相同则使用无权重的轮询。如果不相同,则要计算所有实例的权重的最大公约数。然后轮询时,使用lastIndex和currentWeight记录上次轮询的状态,每次轮询时使用currentWeight减去权重最大公约数,只有当当前实例的权重大于currentWeight时才选择该实例。例如有3个实例权重比为1:10:1,会选择第二个实例 9次,再依次轮询3个实例。

负载均衡算法及权重配置

在dapeng带权重的负载均衡中支持对全局的配置和服务的配置。

在ZK的节点路径:soa/config/services下配置,即代表全局配置,如下:

   loadBlance/random
   weight/127.0.0.1/9095/700
   weight/127.0.0.1/500

每行表示一个功能配置。该全局配置表示:

  • 对所有服务设置的负载均衡算法为random算法;
  • 对在127.0.0.1:9095下的所有服务设置权重为600;
  • 对在127.0.0.1下的所有服务设置权重为500.

当上述配置中的第二条和第三条同时配置时,前者的优先级高。

在ZK的节点路径:soa/config/services/xxx.service下对相应的服务进行权重设置,根据实际情况动态的改变该服务下的实例的权重值,从而改变负载均衡算法选择的服务实例。该配置即代表对具体服务的配置,配置格式如下:

   loadBalance/random,method1:leastActive,method2:roundRobin
   weight/127.0.0.1/9095/700
   weight/127.0.0.1/500

每行表示一个功能配置,在配置负载均衡算法时,按”/”分割服务级别和方法级别的配置,包含”/”表示服务级别,不包含则表示方法级别。方法名与算法名使用”:”分隔,多个设置使用”,”分隔。

该对服务的配置表示:

  • 对该服务设置的负载均衡算法为random算法,对该服务下的两个方法method1和method2分别设置leastActive和roundRobin算法;
  • 对该服务下的127.0.0.1:9095服务实例设置权重为700;
  • 对该服务下IP为127.0.0.1的所有服务实例设置权重为500;

当出现如上设置情况时:指定设置的特定实例127.0.0.1:9095与指定设定的IP:127.0.0.1相同时,则以配置weight/127.0.0.1/9095/700为准,即前者的优先级高。