负载均衡算法

简介: 本文介绍了多种负载均衡算法:随机、轮询、最小活跃数、源地址哈希及一致性哈希。涵盖适用场景、实现原理与优化策略,如加权随机与加权轮询,并结合代码与图示解析调度逻辑,适用于分布式系统流量分配设计。

随机

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

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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
4月前
|
设计模式 人工智能 架构师
面对"祖传代码"不敢动?用这条指令让AI做你的首席重构架构师
面对"屎山"代码不敢动?本文介绍了一套专业的AI重构指令,化身拥有15年经验的首席架构师。它能精准识别代码异味,提供基于设计模式的重构方案,并生成验证清单,帮助开发者安全高效地偿还技术债务。
359 7
|
4月前
|
数据采集 人工智能 分布式计算
只靠国产算力与开源数据,端侧模型预训练行不行?我们做到了全流程开源
鹏城实验室与清华联合发布全流程开源大模型“开元-2B”,基于国产算力实现高效端侧训练。涵盖数据、代码、训练框架与技术报告,推动开放AI生态发展。
291 1
|
4月前
|
人工智能 物联网 测试技术
ModelScope魔搭社区发布月报 -- 25年12月
魔搭社区12月重磅更新DeepSeek 3.2、Mistral-3等模型,Z-Image-Turbo引领文生图生态,平台全面升级加速开源模型落地。
549 8
|
4月前
VTP:MiniMax海螺视频团队,首次开源!
MiniMax视频团队推出首个开源工作VTP,首次将视觉tokenizer作为scaling主角,通过融合通用表征学习,实现生成性能随参数、算力、数据规模持续提升,展现tokenizer在视觉生成系统中的核心潜力。
307 3
|
4月前
|
应用服务中间件 测试技术 数据库
0-1教程 ChatGPT Apps Store应用提交教程——和MCP开发部署
本文以“A2Z Bill Agent”为例,详细介绍如何提交应用至ChatGPT App Store。涵盖准备App图标、MCP服务器配置、域名验证、测试用例编写、截图要求等全流程,助开发者高效完成上架。
0-1教程 ChatGPT Apps Store应用提交教程——和MCP开发部署
|
4月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细介绍Nacos作为配置中心的实现原理与实战步骤,涵盖配置管理、热更新、共享配置优先级及集群搭建,帮助微服务应用实现配置动态化、高可用部署。
211 4
|
4月前
|
存储 Dubbo API
SpringCloud工程部署启动
本文介绍SpringCloud微服务工程搭建全过程,涵盖项目初始化、模块创建、依赖配置及数据库部署。通过两种方案实现工程导入,并基于RestTemplate完成服务间远程调用,解析微服务拆分与协作机制,助力掌握分布式架构核心技能。(239字)
74 0
|
4月前
|
存储 Java 关系型数据库
微服务概述
本文对比单体应用与微服务架构,解析微服务的定义、核心特征及优缺点,介绍其技术选型与实现路径,帮助理解从单体到分布式架构的演进逻辑。
135 0
|
人工智能 IDE Java
沉浸式演示:在新老项目中如何快速上手通义灵码 AI 程序员
沉浸式演示:在新老项目中如何快速上手通义灵码 AI 程序员
|
并行计算 数据处理 Python
Python并发编程迷雾:IO密集型为何偏爱异步?CPU密集型又该如何应对?
在Python的并发编程世界中,没有万能的解决方案,只有最适合特定场景的方法。希望本文能够为你拨开迷雾,找到那条通往高效并发编程的光明大道。
376 2

热门文章

最新文章