1. 负载均衡算法有哪些?
轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
最小连接数法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
2.如何用PHP实现加权轮询?
实现思路
通过传入不同的用户id,然后给他们分配不同的主机。
首先,需要一个接收用户id的数组。
其次,需要一个存主机的数组,这些主机有不同的权重。这里的权重可以这么考虑:
假设有abc三台主机,权重分别为3,1,1,那么a的占比为0.6,b和c的占比各为0.2。
直接遍历主机的数组,假如用户来了100个人,到a的时候,a的占比是0.6,就从用户数组里随机取60个人分给a;轮到b时,b的占比是0.2,就从用户数组里随机取20人;同理,c20人,这样就完成了100个请求的转发。
可是真实场景不是固定一批用户,而是持续不断的用户请求,由于转发非常快,当来的新用户非常少时,每次从用户队列中取完、转发后立马去用户队列中取,很有可能每次只取2条,造成请求全部给了a,b和c一直没有的情况。这时候可以考虑按照不同策略从用户队列中取数据。假设以前5ms就处理完一次转发,则现在定义两种策略,如果用户队列中有100个用户时,就取出来,按着主机占比进行转发,如果用户队列中不足100人,但是当前时间和上一次取值时间相差10ms,就取出来进行转发,这样就可以累积5ms,而这5ms里队列中又会多一些用户请求,这样就不会把所有请求都分给一台机器了。
代码:
<?php
// php实现负载均衡的加权轮询(WRR)
class WRR {// 每次取100人const num = 100;// 上次取值时间,秒级时间戳public $last_time;// 权重 machine=>weightpublic $machines = array('a' => 3, // 0.6'b' => 1, // 0.2'c' => 1  // 0.2
    );// 占比public $proportion = array();// 用户队列public static $user_ids = array();public function __construct() {// 各机器的占比$total = 0;foreach ($this->machines as $machine => $weight) {$total += $weight;}$this->proportion['a'] = $this->machines['a'] / $total;$this->proportion['b'] = $this->machines['b'] / $total;$this->proportion['c'] = $this->machines['c'] / $total;}public function getUsers() {// 用户人数$cnt = count(self::$user_ids);$a_num = 0;$b_num = 0;$c_num = 0;if ($cnt >= self::num) { // 队列超过100人$a_num = round(self::num * $this->proportion['a']);$b_num = round(self::num * $this->proportion['b']);$c_num = $cnt - $a_num - $b_num;} else { // 队列不足100人$last_time = $this->last_time; // 上次访问时间while (true) {$current_time = $this->getMillisecond();if (($current_time - $last_time) >= 10) { // 当前时间和上一次取值时间超过10ms$a_num = round($cnt * $this->proportion['a']);$b_num = round($cnt * $this->proportion['b']);$c_num = $cnt - $a_num - $b_num;$this->last_time = self::getMillisecond();   // 更新访问时间break;}}}$a = array_splice(self::$user_ids, 0, $a_num);$b = array_splice(self::$user_ids, 0, $b_num);$c = array_splice(self::$user_ids, 0, $c_num);return array('a' => $a,'b' => $b,'c' => $c);}// 获取毫秒级时间戳public function getMillisecond() {list($t1, $t2) = explode(" ", microtime());return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);}
}// 测试
$wrr = new WRR();
for ($i = 0; $i < 3; $i++) {// 模拟持续不断的用户请求$random = rand(10, 120);$user_ids = range(1, $random);WRR::$user_ids = $user_ids;$users = $wrr->getUsers();print_r($users);
}

真实的算法比这个复杂多了,它需要考虑一点,就是来过的用户要保持原来分配的机器,除非原来的机器挂了。这样做的原因是缓存。很多基于内存的缓存,都是基于用户级别的,所以相同的用户保持同一台机器,有助于提升性能。

转载于:https://www.cnblogs.com/sunshineliulu/p/7506264.html

2017-5-5/PHP实现负载均衡的加权轮询相关推荐

  1. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...

  2. 负载均衡之加权轮询算法

    在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin). 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法.它的原理 ...

  3. nginx负载均衡之加权轮询

    当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容.nginx尽可能的把请求分摊到各个 ...

  4. 负载均衡算法--加权轮询法(Weight Round Robin)

    接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...

  5. 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  6. js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  7. Nginx负载均衡策略之轮询与加权轮询

    轮询 是upstream模块负载均衡默认的策略.每个请求会按时间顺序逐个分配到不同的后端服务器.轮询不需要额外的配置. upstream backend{server 192.168.200.146: ...

  8. dubbo负载算法之加权轮询算法

    轮询是一种无状态负载均衡算法,实现简单,适用于每台服务器性能相近的场景下.但现实情况下,我们并不能保证每台服务器性能均相近.如果我们将等量的请求分配给性能较差的服务器,这显然是不合理的.因此,这个时候 ...

  9. php管理智能dns,负载均衡之DNS轮询

    域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服务器, ...

  10. 负载均衡与DNS轮询

    负载均衡 load balance 负载均衡(Load Balancing)是一种将工作负载(Workload)分摊到多个计算资源(服务器.存储设备.网络设备等)上的技术,目的是提高系统的可用性.性能 ...

最新文章

  1. 如何使用Node.js获取当前脚本的路径?
  2. 下一个十年需要的五大IT技能
  3. 如何在Windows 10的地图应用程序中获取离线地图
  4. 计算特征矩阵及哈希值(含OpenCV代码)
  5. 微软关闭音乐服务器,微软关闭Zune音乐服务 Zune播放器变为MP3
  6. 不属于python标准库的是_下列哪项不是Python标准库中处理到程序中参量的模块?...
  7. “熊猫烧香”病毒的原理
  8. 最直白的编译原理-词法分析(清华-王书3版)
  9. 12306系统在2015年春运高峰期的稳定运行,采用了哪些具体技术?
  10. 锂电池电量百分比计算_电池soc是什么意思
  11. 在Qt中使用OpenGL(二)
  12. windows2008 R2安装LoadRunner 11提示WindowsInstaller存储空间不足解决方法
  13. c# 指定打开某个路径下的CMD_这招太厉害了,不用鼠标也可以打开指定文件
  14. (转)Android系统WAP上网设置
  15. Linux搭建socks 5代理服务器及使用
  16. 微信公众号前端开发,学习路线图必不可少
  17. 【C4D基础】导入图片、选择工具、线性切割、显示与渲染、旋转
  18. 网站ICP备案流程图解
  19. 解决POI导入EXCEL兼容问题
  20. VS、ReSharper 设置修改代码颜色、提高代码辨识度!附VS超实用快捷!

热门文章

  1. PHP精粹:编写高效PHP代码(资深PHP技术专家多……
  2. SQL重复记录处理(查找,过滤,删除)
  3. pymongo访问数据前数据库名和集合名(表名)校验
  4. EMNLP 2021 | 论辩挖掘在不同领域下的应用
  5. 综述 | 知识图谱技术综述(下)
  6. 爬虫_抓取51job招聘数据
  7. k-近邻算法进行回归拟合
  8. python—datatable加载数据
  9. 白板推导系列Pytorch-期望最大(EM)算法
  10. 大数据:技术与应用实践指南