关于负载均衡的一切

简介: 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行,负载均衡的关键在于均匀。

什么是负载均衡?

负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行,负载均衡的关键在于均匀。

常见的负载均衡方案有哪些?

image.png

常见互联网分布式架构如上,分为:

  • 客户端层
  • 反向代理层
  • 站点层
  • 服务层
  • 数据层

可以看到,每一个下游都有多个上游调用,只需要做到,每一个上游都均匀访问每一个下游,就能实现整体的均匀分摊。

第一层:客户端层到反向代理层

image.png

客户端层到反向代理层的负载均衡,是通过“DNS轮询”实现的。

DNS-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问DNS-server,会轮询返回这些ip,保证每个ip的解析概率是相同的。这些ip就是nginx的外网ip,以做到每台nginx的请求分配也是均衡的。

第二层:反向代理层到站点层

image.png

反向代理层到站点层的负载均衡,是通过“nginx”实现的。

画外音:nginx是反向代理的泛指。

修改nginx.conf,可以实现多种均衡策略:

(1) 请求轮询:和DNS轮询类似,请求依次路由到各个web-server;

(2) 最少连接路由:哪个web-server的连接少,路由到哪个web-server;

(3) ip哈希:按照访问用户的ip哈希值来路由web-server,只要用户的ip分布是均匀的,请求理论上也是均匀的,ip哈希均衡方法可以做到,同一个用户的请求固定落到同一台web-server上,此策略适合有状态服务,例如session;

画外音:站点层可以存储session,但强烈不建议这么做,站点层无状态是分布式架构设计的基本原则之一,session最好放到数据层存储。

(4) …

第三层:站点层到服务层

image.png

站点层到服务层的负载均衡,是通过“服务连接池”实现的。

上游连接池会建立与下游服务多个连接,每次请求会“随机”选取连接来访问下游服务。除了负载均衡,服务连接池还能够实现故障转移、超时处理、限流限速、ID串行化等诸多功能。

第四层:访问数据层

在数据量很大的情况下,由于数据层(db/cache)涉及数据的水平切分,所以数据层的负载均衡更为复杂一些,它分为“数据的均衡”,与“请求的均衡”。

数据的均衡是指:水平切分后的每个服务(db/cache),数据量是均匀的。

请求的均衡是指:水平切分后的每个服务(db/cache),请求量是均匀的。

业内常见的水平切分方式有这么几种:

一、按照range水平切分

image.png

每一个数据服务,存储一定范围的数据:

  • user0服务:存储uid范围1-1kw
  • user1服务:存储uid范围1kw-2kw

这个方案的好处是:

  • 规则简单,service只需判断一下uid范围就能路由到对应的存储服务
  • 数据均衡性较好
  • 比较容易扩展,可以随时加一个uid[2kw,3kw]的数据服务

不足是:

请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大range的服务请求压力会更大

二、按照id哈希水平切分

image.png

每一个数据服务,存储某个key值hash后的部分数据:

  • user0服务:存储偶数uid数据
  • user1服务:存储奇数uid数据

这个方案的好处是:

  • 规则简单,service只需对uid进行hash能路由到对应的存储服务
  • 数据均衡性较好
  • 请求均匀性较好

不足是:

  • 不容易扩展,扩展一个数据服务,hash方法改变时候,可能需要进行数据迁移

总结
负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行,其的关键在于均匀:

  • 反向代理层的负载均衡,是通过“DNS轮询”实现的
  • 站点层的负载均衡,是通过“nginx”实现的
  • 服务层的负载均衡,是通过“服务连接池”实现的
  • 数据层的负载均衡,要考虑“数据的均衡”与“请求的均衡”两个点,常见的方式有“按照范围水平切分”与“hash水平切分”

希望大家有收获。

架构师之路-分享可落地的技术文章

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
数据采集 存储 监控
InfluxDB与Telegraf:数据采集与监控实战
【4月更文挑战第30天】本文介绍了InfluxDB和Telegraf在数据采集与监控中的应用。InfluxDB是高性能的时序数据库,适合高吞吐量和实时查询,而Telegraf是数据采集代理,能收集多种系统指标并发送至InfluxDB。实战部分涉及安装配置两者,通过Telegraf收集数据,然后使用InfluxDB查询分析,配合Grafana实现可视化展示,从而实现有效的监控解决方案。
1107 0
proteus数字电路仿真——入门实例
proteus数字电路仿真——入门实例
609 0
proteus数字电路仿真——入门实例
|
运维 监控 安全
SysAK 应用抖动诊断篇—— eBPF又立功了! | 龙蜥技术
且看 SysAK 是如何打造一款性能开销不大、安全可靠、且灵活的关中断检测工具。
SysAK 应用抖动诊断篇—— eBPF又立功了! | 龙蜥技术
|
Java 应用服务中间件 Spring
Spring boot 配置访问日志
Spring boot 配置访问日志
Spring boot 配置访问日志
|
Python
Python|yield的解析及用法
Python|yield的解析及用法
691 0
|
网络协议 Python
ipaddress库:Python中网络地址的处理
ipaddress库:Python中网络地址的处理
340 0
ipaddress库:Python中网络地址的处理
|
应用服务中间件 容器 数据安全/隐私保护
Servlet中request请求Get和Post方法以及乱码解决
前言: 传递的请求参数如何获取 GET方式: 参数放在URI后面 POST方式: 参数放在实体内容中 后台获取前台数据方法: 核心的API: request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数) request.
3434 0
|
XML Java API
[JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag、TagSupport、BodyTagSupport、SimpleTagSupport(JSP2.0)。
1052 0
|
5天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
6890 47
|
2天前
|
人工智能 安全 API
CoPaw:3分钟部署你的 AI助理
源自阿里巴巴开源生态的个人 AI 助理——CoPaw。作为阿里倾力打造的开源力作,CoPaw 完美打通钉钉、飞书、Discord 等多平台对话通道,支持定时任务自动化。内置 PDF/Office 深度处理、新闻摘要等强大技能,更开放自定义扩展接口。坚持数据全程私有化部署,绝不上传云端,让每一位用户都能在大厂技术加持下,拥有安全、专属的智能助手。