负载均衡算法

简介: 负载均衡算法包括随机、轮询、最小活跃数、源地址哈希与一致性哈希。随机可加权提升性能利用,轮询实现顺序调用,最小活跃数动态分配请求,源地址哈希保证IP固定路由,一致性哈希减少节点变动影响,适用于分布式系统中高效流量调度。(239字)

随机

调用关系如上图(简化了公网->防火墙处理),适合场景:所有服务器性能基本一致,且无超阈值流量。
private K doSelect(List nodes, String ip) {
// 在列表中随机选取一个节点
int index = random.nextInt(nodes.size());
return nodes.get(index);
}
如果存在部分机器性能更优,此时可以在随机基础上增加权重,升级为:随机权重算法。
private K doSelect(List nodes, String ip) {
int length = nodes.size();
AtomicInteger totalWeight = new AtomicInteger(0);
for (K node : nodes) {
Integer weight = node.getWeight();
totalWeight.getAndAdd(weight);
}

if (totalWeight.get() > 0) {
    int offset = random.nextInt(totalWeight.get());
    for (N node : nodes) {
        // 让随机值 offset 减去当前node权重值
        offset -= node.getWeight();
        if (offset < 0) {
            // 当前node大于随机值offset,返回此Node
            return node;
        }
    }
}
// 随机返回
return nodes.get(random.nextInt(length));

}
轮询

轮询不再是在多台服务器随机挑选,而是按照顺序一个个排队调用,调用完再插入队尾等待下一次调用
protected K doSelect(List nodes, String ip) {
int length = nodes.size();
// 如果位置值已经等于长度重置为0(走一轮了)
position.compareAndSet(length, 0);
N node = nodes.get(position.get());
// 数据原子增加,对应调用从1->2->3->4
position.getAndIncrement();
return node;
}
同加权随机,轮询也同样存在加权轮询的场景,此时流量调度将发生如下变化:

此处逻辑相对复杂,笔者在此说出主要思路,后续有时间补充伪代码,感兴趣的可以参照Dubbo的实现
如上有服务器servers=[A,B],对应权重weights=[3,1],总权重为4。我们可以理解为有4台服务器,3台A,1台B,一次调用过来的时候,需要按顺序访问。如有5次调用,调用顺序为AAABA。
选举思路如下:
次数 WeightedRoundRobin 选择结果 选择后的WeightedRoundRobin
1 3、1 A 2、1
2 2、1 A 1、1
3 1、1 A 0、1
4 0、1 B 0、0(等于0-0时复原成:3、1)
5 3、1 A 2、1
最小活跃数
指:将当前请求转发到连接数/请求数最少的机器上,其特点是根据服务器实时运行状态动态分配,保障服务负载不会过饱和。如下图当请求4过来时,Nginx判断目前服务器1连接数>服务器2,故4会请求到服务器2上:

源地址哈希
根据请求源IP哈希计算得到一个数值,用该数值在候选服务器列表的进行取模运算,得到的结果便是选中的服务器,此操作可以保证固定IP的请求总是到某一台服务器上,伪代码如下:
private K doSelect(List nodes, String ip) {
int length = nodes.size();
int index = hash(ip) % length;
return nodes.get(index);
}
一致性哈希
相同的请求尽可能落到同一个服务器上。一致性哈希解决稳定性问题,可以将所有的存储节点排列在首尾相接的 Hash 环上,每个 key 在计算 Hash 后会 顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在 Hash环上顺时针相邻的后续节点。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
机器学习/深度学习 算法 Shell
【实操:人脸矫正】两次定位操作解决人脸矫正问题
【实操:人脸矫正】两次定位操作解决人脸矫正问题
852 0
|
4月前
|
人工智能 算法 量子技术
下一代互联网的模样:当 AI 会思考、Web3 去中心、量子打破极限
下一代互联网的模样:当 AI 会思考、Web3 去中心、量子打破极限
265 8
下一代互联网的模样:当 AI 会思考、Web3 去中心、量子打破极限
|
UED 开发者
通义千问新增文档解析功能,可处理超万页文档
【2月更文挑战第25天】通义千问新增文档解析功能,可处理超万页文档
1184 6
通义千问新增文档解析功能,可处理超万页文档
|
2月前
|
人工智能 自然语言处理 供应链
行业标准加速成型下,金融智能体平台企业生态构建能力多维评测
行业标准加速成型下,金融智能体平台企业生态构建能力多维评测
811 1
|
6月前
|
监控 JavaScript Java
Serverless冷启动优化
Serverless冷启动是影响性能的关键瓶颈,尤其在实时交互场景中。本文从冷启动原理出发,系统解析语言选型、镜像优化、预热策略、实例复用、内存配置等十大维度,结合API服务实战案例与成本控制技巧,提供可落地的优化方案。通过精简依赖、合理预热、动态调优,企业可在性能提升与成本间实现平衡,充分发挥Serverless降本增效优势。(238字)
510 0
|
5月前
|
存储 人工智能 开发工具
为什么要使用 Git 作为代码版本管理工具?
本文由喵喵侠分享,对比了SVN与Git两大版本管理工具。SVN集中式管理适合小团队,但离线操作受限、分支繁琐;Git凭借分布式架构、高性能和强大分支功能成为主流,尤其适合远程协作。尽管学习曲线较陡,但其生态丰富,未来将向AI集成、图形化界面和更智能的协作发展,是开发者必备技能。
320 1
|
6月前
|
人工智能 数据可视化 数据挖掘
企业如何应用 BI 系统?从数据整合到决策落地全指南
本文解析BI系统核心价值,对比10款主流工具(如瓴羊Quick BI、Tableau、Power BI),涵盖选型、落地步骤及AI赋能,助力企业实现数据驱动转型。
|
11月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
11月前
|
算法 数据库
基于MATLAB的心电信号去噪
基于MATLAB的心电信号去噪
493 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的农业信息管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的农业信息管理系统附带文章源码部署视频讲解等
244 1