负载均衡算法

简介: 本文介绍了五种负载均衡算法:随机、轮询、最小活跃数、源地址哈希与一致性哈希,涵盖适用场景及核心实现逻辑,结合代码与图示解析其工作原理与优化策略。

随机

调用关系如上图(简化了公网->防火墙处理),适合场景:所有服务器性能基本一致,且无超阈值流量。

private K doSelect(List<K> nodes, String ip) {
    // 在列表中随机选取一个节点
    int index = random.nextInt(nodes.size());
    return nodes.get(index);
}

如果存在部分机器性能更优,此时可以在随机基础上增加权重,升级为:随机权重算法。

private K doSelect(List<K> 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<K> 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<K> 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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
JSON 自然语言处理 数据库
索引库、文档操作
本文介绍了Elasticsearch(ES)的核心概念及其与MySQL的对比,阐述了ES作为分布式搜索引擎,在海量数据搜索、分析方面的优势,并详细讲解了索引库、映射(Mapping)、文档等核心概念的创建与操作方法。同时,结合Kibana和RestClient演示了索引与文档的CRUD操作,帮助读者掌握ES在实际项目中的应用。
索引库、文档操作
|
2月前
|
Java 测试技术 API
从Google线上故障,谈灰度发布的重要性
2025年6月12日,Google Cloud因未灰度发布的新功能引发空指针异常,导致全球服务中断超7小时。本文剖析故障根源,详解配置灰度发布策略,并以Nacos为例,介绍基于IP和标签的灰度实现方案,强调灰度发布对系统稳定性的重要意义。
从Google线上故障,谈灰度发布的重要性
|
2月前
|
存储 数据库
数据库设计三范式
本文介绍了数据库设计中的三大范式:第一范式要求字段原子性,不可再分;第二范式要求消除部分依赖,确保主键唯一决定非主键属性;第三范式要求消除传递依赖。通过实例解析,说明范式旨在减少数据冗余与操作异常,但实际设计应结合项目需求灵活应用。
|
存储 Java 应用服务中间件
SpringBoot 存储图片 tomcat服务器存图片 数据库图片路径
SpringBoot 存储图片 tomcat服务器存图片 数据库图片路径
1179 0
SpringBoot 存储图片 tomcat服务器存图片 数据库图片路径
|
2月前
|
人工智能 运维 安全
GPT-5.2 Codex来了:能独立跑7+小时的AI程序员,老金手把手教你玩转
OpenAI发布GPT-5.2 Codex,支持异步自主编程,7小时持续任务不断线。采用上下文压缩技术,胜任复杂重构与安全审计。对比Claude Code的同步交互,Codex更像远程员工,适合甩手任务。Plus用户可免费体验,API性价比高,配合本地工具高效开发。
GPT-5.2 Codex来了:能独立跑7+小时的AI程序员,老金手把手教你玩转
|
搜索推荐 API 定位技术
一文看懂Elasticsearch的技术架构:高效、精准的搜索神器
Elasticsearch 是一个基于 Lucene 的开源搜索引擎,以其强大的全文本搜索功能和快速的倒排索引技术著称。它不仅支持数字、文本、地理位置等多类型数据,还提供了可调相关度分数、高级查询 DSL 等功能。Elasticsearch 的核心技术流程包括数据导入、解析、索引化、查询处理、得分计算及结果返回,确保高效处理大规模数据并提供准确的搜索结果。通过 RESTful API、Logstash 和 Filebeat 等工具,Elasticsearch 可以从多种数据源中导入和解析数据,支持复杂的查询需求。
757 0
|
人工智能 运维 测试技术
SEMIKONG:专为半导体领域设计的大型语言模型,支持制造优化、辅助 IC 设计等半导体制造任务
SEMIKONG 是专为半导体行业定制的大型语言模型,能够优化制造过程、辅助 IC 设计,并整合专家知识,推动领域特定 AI 模型的研究与应用。
930 7
SEMIKONG:专为半导体领域设计的大型语言模型,支持制造优化、辅助 IC 设计等半导体制造任务
|
关系型数据库 机器人 OLAP
智答引领|AnalyticDB与通义千问大模型联手打造社区问答新体验
PolarDB开源社区推出基于云原生数据仓库AnalyticDB和通义千问大模型的“PolarDB知识问答助手”,实现一站式全链路RAG能力,大幅提升查询效率和问答准确率。该系统整合静态和动态知识库,提供高效的数据检索与查询服务,支持多种场景下的精准回答,并持续优化用户体验。欢迎加入钉群体验并提出宝贵意见。
智答引领|AnalyticDB与通义千问大模型联手打造社区问答新体验
|
11月前
|
云安全 机器学习/深度学习 人工智能
课时12:阿里云安全产品之态势感知
阿里云态势感知是基于人工智能的安全产品,帮助企业应对高隐蔽性网络攻击。它通过机器学习全面感知网络威胁,覆盖网络层、主机层和应用层,提供实时入侵检测与响应。具备威胁模型、专家定制、超强检索及全网威胁情报等六大核心优势,显著增强企业网络安全防御能力。在G20峰会期间,成功实现平台用户网站安全运营零干扰。
619 0
|
算法 UED 开发者
🚀短链(Short Link):发展动态与工具推荐🚀
短链是将冗长的URL通过特定算法压缩成简短的字符串,便于用户在社交媒体和营销活动中分享。短链不仅美化了链接,还提升了用户体验,并具有易于传播和跟踪分析的优势。本文介绍了短链的作用、发展历程,以及在goo.gl退出后,推荐的替代工具如Dub.co,帮助用户继续享受短链带来的便利与营销价值。
1562 1
🚀短链(Short Link):发展动态与工具推荐🚀

热门文章

最新文章