常见负载均衡算法
负载均衡算法的种类有很多种,常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等。
# 轮询法
轮询((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;
}
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];
}
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];
}
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;
}
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];
}
2
3
4
5
6
7
8
9
10
11
12
# 最小连接数法
前面我们费尽心思来实现服务消费者请求次数分配的均衡,我们知道这样做是没错的,可以为后端的多台服务器平均分配工作量,最大程度地提高服务器的利用率,但是,实际上,请求次数的均衡并不代表负载的均衡。因此我们需要介绍最小连接数法,最小连接数法比较灵活和智能,由于后台服务器的配置不尽相同,对请求的处理有快有慢,它正是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器。