|
|
|
|
移动端

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

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

作者:等你归去来来源:博客园|2017-12-28 11:05

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


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

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

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

  1. int chooseOneRoute ( LB_SvrInfo * & pSvr ) 
  2.     double dblTotalWeight = 0.0; 
  3.     int i = 0; 
  4.     time_t curTime = time(NULL); 
  5.     //权重的计算方法是Late方法 
  6.     if ( curTime - calWeightTime >= CAL_WEIGHT_TIME_INTERVAL ) 
  7.     { 
  8.         calculateWeight(); 
  9.     } 
  10.     //先把各服务器权重加起来 
  11.     for ( i = 0; i < MAX_SERVER_NUM; i++ ) 
  12.     { 
  13.         if ( !oServerInfo[i].isOkForRoute() ) continue
  14.         dblTotalWeight += oServerInfo[i].getWeight(); 
  15.     } 
  16.     dblTotalWeight *= rand() / ( RAND_MAX + 1.0 ); 
  17.     //做减法 
  18.     for ( i = 0; i < MAX_SERVER_NUM; i++ ) 
  19.     { 
  20.         if ( !oServerInfo[i].isOkForRoute() ) continue
  21.         dblTotalWeight -= oServerInfo[i].getWeight(); 
  22.     //找到对应服务器 
  23.         if ( dblTotalWeight < 0 ) break; 
  24.     } 
  25.     pSvr = &( oServerInfo[i] ); 
  26.     return 0; 

分步解释就是:

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

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

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

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

算法示意图如下:

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

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

【编辑推荐】

  1. 实现基于LVS负载均衡集群的电商网站架构
  2. 分布式、多活数据中心如何实现DNS域名解析和负载均衡?
  3. 巧妙利用DNS突破AWS云环境中隔离的网络
  4. Linux下Nginx+多Tomcat负载均衡实现详解
  5. Nginx的反向代理与负载均衡
【责任编辑:武晓燕 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢

视频课程+更多

热门职位+更多

读 书 +更多

网管员必读—-网络安全

本书共10章,介绍的内容包括恶意软件(包括病毒、木马和蠕虫等)的深度防御方法,黑客的主要类型和防御方法,企业网络内、外部网络防火墙系...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊