一个巧妙的负载均衡算法 :翘动你的大脑

服务器 算法
刚开始的时候,我以为是哪个数学家搞出来的公式得到的呢,结果原理却出奇的简单,所以好的东西不一定是复杂的,或者说看起来牛逼的东西,不一定就很复杂,但是肯定是大多数人意想不到的。

现在的负载均衡技术,可以说是满大街都是,但是我们基本都停留在了使用的阶段上,并没有真正深入去了解其核心。如果真的出现了问题,可能就很难知道是什么原因导致了,只能去google,百度了。 因此,了解一些核心的东西,还是不错的。

负载均衡大概流程就是,随时收集各服务器信息或者各服务器主动上报信息,由配置主心进行保存,计算出权重,然后根据相应算法进行服务机器选择。(当然了,这不是本文的重点,我也说得不一定对)

我要展示的是,一个根据权重进行机器选择的一个巧妙算法,如下:

int chooseOneRoute ( LB_SvrInfo * & pSvr ) 

    double dblTotalWeight = 0.0; 
    int i = 0; 
    time_t curTime = time(NULL); 
    //权重的计算方法是Late方法 
    if ( curTime - calWeightTime >= CAL_WEIGHT_TIME_INTERVAL ) 
    { 
        calculateWeight(); 
    } 
    //先把各服务器权重加起来 
    for ( i = 0; i < MAX_SERVER_NUM; i++ ) 
    { 
        if ( !oServerInfo[i].isOkForRoute() ) continue
        dblTotalWeight += oServerInfo[i].getWeight(); 
    } 
    dblTotalWeight *= rand() / ( RAND_MAX + 1.0 ); 
    //做减法 
    for ( i = 0; i < MAX_SERVER_NUM; i++ ) 
    { 
        if ( !oServerInfo[i].isOkForRoute() ) continue
        dblTotalWeight -= oServerInfo[i].getWeight(); 
    //找到对应服务器 
        if ( dblTotalWeight < 0 ) break; 
    } 
    pSvr = &( oServerInfo[i] ); 
    return 0; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

分步解释就是:

先计算得到各机器的权重值,保存起来;

[[214964]]

按顺序将各机器权重相加,相加之后就相当于各机器在总权重上占了各相应的一段比例;

取随机数,得到一个0~1的随机值,并乘以总权重,作为选中机器的标志;

再按顺序减去各机器的权重,当减到选择机器的权重范围时,就得到了机器号,从而选定该机器。

算法示意图如下:

服务器权重越高,在线段上占的长度越长,被随机数选中的概率也越大。

刚开始的时候,我以为是哪个数学家搞出来的公式得到的呢,结果原理却出奇的简单,所以好的东西不一定是复杂的,或者说看起来牛逼的东西,不一定就很复杂,但是肯定是大多数人意想不到的。

责任编辑:武晓燕 来源: 博客园
相关推荐

2019-12-27 09:29:46

负载均衡算法哈希算法

2019-12-26 09:13:00

算法硬件软件

2019-08-29 09:15:30

负载均衡算法备份

2019-12-25 11:22:19

负载均衡集群算法

2018-04-10 10:49:17

负载均衡算法服务器

2015-05-22 11:40:00

希捷

2021-09-27 10:03:55

装饰器代码

2017-07-03 08:08:25

负载均衡分类

2010-05-10 15:35:27

负载均衡技术

2010-05-04 16:10:51

负载均衡算法

2010-05-10 14:11:41

负载均衡算法

2009-05-01 09:33:27

应用交换负载均衡

2023-09-06 13:58:01

负载均衡算法

2011-12-09 10:59:35

负载均衡故障MSS值

2021-07-12 07:08:54

责任链模式对象

2010-05-04 17:05:29

DNS负载均衡

2010-04-22 11:19:11

LVS负载均衡

2023-03-03 08:26:32

负载均衡算法服务

2020-04-10 10:15:29

算法开源Github

2020-06-23 16:28:25

Nginx负载均衡服务器
点赞
收藏

51CTO技术栈公众号