负载均衡算法

简介: 本文介绍多种负载均衡算法:随机、加权随机、轮询、加权轮询、最小活跃数、源地址哈希及一致性哈希。涵盖其实现原理与适用场景,如加权算法提升高性能节点利用率,最小活跃数实现动态负载分配,哈希类算法保障请求粘性,提升系统稳定性与性能。(238字)

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));

}
轮询
轮询不再是在多台服务器随机挑选,而是按照顺序一个个排队调用,调用完再插入队尾等待下一次调用
同加权随机,轮询也同样存在加权轮询的场景,此时流量调度将发生如下变化:
此处逻辑相对复杂,笔者在此说出主要思路,后续有时间补充伪代码,感兴趣的可以参照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的请求总是到某一台服务器上,伪代码如下:
一致性哈希
相同的请求尽可能落到同一个服务器上。一致性哈希解决稳定性问题,可以将所有的存储节点排列在首尾相接的 Hash 环上,每个 key 在计算 Hash 后会 顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在 Hash环上顺时针相邻的后续节点。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
Docker安装Mysql
本文介绍Docker安装MySQL 5.7的完整流程,涵盖单机部署与主从复制。通过容器卷映射解决中文乱码与数据持久化问题,并详细演示主从配置步骤,实现数据同步,适用于生产环境搭建与学习参考。
130 0
|
2月前
|
网络协议 关系型数据库 MySQL
nexus搭建docker私仓 使用nexus创建docker私有仓库
本文介绍如何使用Nexus搭建Docker私有仓库,包括Nexus中启用Docker仓库、创建Blob存储、配置docker-hosted仓库及端口设置,并说明防火墙开放与Docker客户端配置insecure-registry的方法,实现镜像的推送与拉取。
185 0
|
2月前
|
安全 Linux Shell
Docker镜像
镜像是包含软件运行所需代码、依赖库、配置等的轻量级可执行包。Docker利用联合文件系统实现分层结构,通过bootfs和rootfs构成镜像底层,支持镜像共享与复用。容器启动时在镜像顶层添加可写容器层,所有修改仅作用于该层,保障镜像安全与高效。
82 0
|
2月前
|
关系型数据库 MySQL Linux
Docker下载加速
通过配置网易数帆、阿里云镜像加速器或Docker代理,可显著提升Docker镜像下载速度。推荐使用阿里云加速器,配置简单,支持官方镜像标签;也可结合代理实现更高效拉取。
166 0
|
2月前
|
Java 大数据 Apache
Excel工具-HUTOOL-输出Excel
基于Hutool与Apache POI,封装Excel写入功能,提供ExcelWriter和BigExcelWriter,支持List、Map、Bean等数据类型导出,可自定义样式、多Sheet操作,并避免内存溢出,适用于高效生成Excel文件及Web下载场景。
156 0
|
2月前
|
Web App开发 JavaScript Java
SpringBoot跨域处理
本文介绍了跨域(CORS)问题的产生原因及解决方案。当协议、域名、端口不同时,请求即为跨域。浏览器因同源策略限制,默认阻止跨域请求。通过使用`@CrossOrigin`注解、全局配置`WebMvcConfigurer`或自定义`Filter`添加响应头,可实现跨域资源共享。示例展示了Spring Boot中三种解决CORS的方法,并验证其有效性。
140 0
|
2月前
|
XML 存储 SQL
SpringBoot整合Logback,滚动记录+多文件
logback-spring.xml配置文件实现日志分级输出,支持控制台、文件滚动存储,按模块(如SQL、支付、任务等)分离日志,通过LogProxy获取指定名称的Logger,便于定位问题。配置灵活,适用于多环境部署。
54 0
|
2月前
|
缓存 Java 开发工具
QLExpress使用及源码分析
QLExpress是阿里巴巴开源的轻量级规则引擎,支持通过YAML配置规则脚本,结合注解实现Java方法与表达式映射。通过别名机制、AST解析和上下文赋值,实现灵活的动态逻辑执行,适用于复杂业务规则场景。
78 0
|
2月前
|
消息中间件 算法 网络协议
选举机制理解描述
本文深入解析Zookeeper的Leader选举机制,涵盖服务器启动与运行期间的选举流程,重点介绍FastLeaderElection算法的核心规则:优先比较ZXID(数据最新性),再比较SID(服务器标识)以确保数据一致性。详细阐述投票过程、状态变更及逻辑时钟(electionEpoch)作用,揭示分布式系统中高可用与数据恢复的关键实现。
47 0
|
10月前
|
存储 人工智能 安全
一文了解:阿里云对象存储OSS是什么?
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,数据持久性达99.9999999999%,适用于互联网音视频、教育、AI/物联网、影视渲染及基因等行业。OSS提供标准、低频、归档等多种存储类型,支持按量付费与资源包两种计费模式,公网出流量收费,内网流量免费。
11962 7