Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

  • 计算机网络

  • 数据结构和算法

  • MySQL

  • Redis

  • Nginx

    • Nginx入门之安装部署
    • Nginx高级用法总结
    • Nginx使用常见问题汇总
    • Nginx与HAProxy负载均衡比较
    • Nginx status状态详解
    • Nginx常见问题之Location优先级
    • Nginx+Keepalived搭建高可用集群
    • Nginx实战灰度发布
    • 常见负载均衡算法
      • 轮询法
      • 随机法
      • 源地址哈希法
      • 加权轮询法
      • 加权随机法
      • 最小连接数法
  • MongoDB

  • 其他

  • 计算机基础
  • Nginx
Ravior
2018-12-13
目录

常见负载均衡算法

负载均衡算法的种类有很多种,常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等。

# 轮询法

轮询((Round Robin)法,即将请求按照顺序轮流的分配到服务器上,均衡的对待每一台后端的服务器,不关心服务器的的连接数和负载情况,以下是算法演示代码:

// 算法1: 轮训 round robin
function rb($servers)
{
	static $pos = 0;

	$server = null;

	if ($pos >= count($servers)) {
		$pos = 0;
	}

	$server = $servers[$pos];

	$pos++;

	return $server;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

轮询的策略目的在于请求的绝对均衡,但是在实际的情况下,可能服务器并不是完全一样,导致有些性能高的服务器不能完全发挥出来。

# 随机法

根据服务器列表的大小来随机获取其中的一台来访问,随着调用量的增大,实际效果越来越近似于平均分配到没一台服务器,和轮询的效果类似,代码如下:

// 算法2:随机(random)
function random($servers)
{
	$pos = mt_rand(0, count($servers)-1);
	return $servers[$pos];
}
1
2
3
4
5
6

# 源地址哈希法

源地址hash法的思想是获取客户端访问的ip地址,通过hash函数计算出一个hash值,用该hash值对服务器列表的大小进行取模运算,得到的值就是要访问的服务器的序号,代码如下:

// 算法3: 源址哈希算法 ip_hash
function ip_hash($servers, $ip)
{
	$strlen = strlen($ip);
	$ip_hash = 0;
	for ($i=0; $i < $strlen; $i++) { 
		$ip_hash+= ord($ip[$i]);
	}
	// 取模
	$pos = $ip_hash%count($servers);
	return $servers[$pos];
}
1
2
3
4
5
6
7
8
9
10
11
12

hash法的好处是,在服务器列表不变的情况下,每次客户端访问的服务器都是同一个服务器.利用这个特性可以有状态的session会话.无需额外的操作就可以实现粘性会话.

# 加权轮询法

加权轮询(Weight Round Robin)法是对轮询发的优化,考虑到不同的服务器性能不同,所以不能一概而论,需要给性能低的服务器给比较低的权重,性能高的给跟高的权重,代码如下:

// 算法4: 加权轮训
function weight_rb($servers) {
	static $pos = 0;
	$server_list = [];
	foreach ($servers as $server => $weight) {
		for ($i=0; $i < $weight; $i++) { 
			$server_list[] =  $server;
		}
	}

	$server = null;
	if ($pos >= count($server_list)) {
		$pos = 0;
	}

	$server = $server_list[$pos];
	$pos++;
	return $server;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 加权随机法

与加权轮询法类似,加权随机(Weight Random)法也是根据后端服务器不同的配置和负载情况来配置不同的权重。不同的是,它是按照权重来随机选择服务器的,而不是顺序。加权随机法的代码实现如下:

// 算法5: 加权随机
function weight_random($servers) {
	$server_list = [];
	foreach ($servers as $server => $weight) {
		for ($i=0; $i < $weight; $i++) { 
			$server_list[] =  $server;
		}
	}
	$pos = mt_rand(0, count($server_list)-1);
	return $server_list[$pos];

}
1
2
3
4
5
6
7
8
9
10
11
12

# 最小连接数法

前面我们费尽心思来实现服务消费者请求次数分配的均衡,我们知道这样做是没错的,可以为后端的多台服务器平均分配工作量,最大程度地提高服务器的利用率,但是,实际上,请求次数的均衡并不代表负载的均衡。因此我们需要介绍最小连接数法,最小连接数法比较灵活和智能,由于后台服务器的配置不尽相同,对请求的处理有快有慢,它正是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器。

#Nginx
上次更新: 2022/12/01, 11:09:34
Nginx实战灰度发布
MongoDB入门实践

← Nginx实战灰度发布 MongoDB入门实践→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式