一、定义
负载均衡(Load Balancing)是一种计算机网络和服务器管理技术,旨在分配网络流量、请求或工作负载到多个服务器或资源,以确保这些服务器能够高效、均匀地处理负载,并且能够提供更高的性能、可用性和可扩展性。
二、负载均衡算法
1.Round Robin-轮询
轮询,顾名思义,把请求按顺序分配给每个服务器,然后重复执行这个顺序,进行请求分配。如下图:
如上图,有3台服务器,分别为服务器A、服务器B和服务器C,当客户端有请求过来时,请求会按照 A->B->C->A->B->C->… 这种轮询的顺序分配给各个服务器。
(1) 原理:
- 服务器列表:维护一个服务器列表,有服务器加入/剔除时,相应的更新服务器列表;
- 服务器游标:记录需要处理下一个请求的服务器;
- 请求分发:新请求到达,选择当前服务器来处理该请求,然后服务器游标+1;
- 循环:不断重复步骤3,以确保每个服务器都有机会处理请求;
(2) 算法实现
方法1:
轮询算法的实现非常简单,可以定义一个服务器的列表和当前服务器指针,如下伪代码:
# 服务器列表
servers = ["ServerA", "ServerB", "ServerC"]
# 当前服务器
current_server = 0
# 轮询算法
if(req):
# 选择当前服务器来处理请求
process_request(servers[current_server])
# 将当前服务器移到服务器列表的末尾
if current_server == length(servers):
current_server = 0
else:
# 指针+1
current_server += 1
当客户端有新的请求到达时,负载均衡器会选择服务器指针(current_server)指向的服务器来处理请求,然后将当前服务器指针移到下一个服务器(current_server += 1), 如果 current_server=服务器总数,则把current_server设置为0,进行下一场轮询。
方法2: 循环列表
循环列表是一个环形数据结构,用于按照顺序循环遍历服务器列表。当指针指向列表的末尾时,指针会回到列表的开头,从而实现循环。如下伪代码:
servers = ["Server1", "Server2", "Server3"] # 服务器列表
current_index = 0 # 当前服务器的索引
def get_next_server(self):
if not self.servers:
return None
# 获取当前服务器
current_server = self.servers[self.current_index]
# 更新索引,移到下一个服务器
self.current_index = (self.current_index + 1) % len(self.servers)