架构思维:如何设计一个支持海量数据存储的高扩展性架构_数据分片、存储、复制与一致性的原理性问题

文章目录

  • PRE
  • 引言
  • 1. 数据分片策略
    • Hash取模分片
    • 一致性Hash分片
    • Range分片
      • 分片设计原理
      • 核心设计模块
        • 分片规则定义
        • 动态分片调整
        • 路由与负载均衡
      • 应对热点的关键技术
        • 多级分片(Hierarchical Sharding)
        • 副本分散策略
        • 缓存层配合
      • 典型应用场景
      • 优缺点分析
  • 2. 应对热点数据
  • 3. 数据复制与一致性
  • 4. 分片元数据管理
  • 5. 一致性算法对比
  • 6. 扩展性与容灾
  • 总结

在这里插入图片描述

PRE

每日一博 - 一致性哈希:分布式系统的数据分配利器

分布式存储 - 那些关于分布式缓存的一二事儿

深入浅出分布式缓存:原理与应用


引言

如何设计一个支持海量商品存储的高扩展性架构?

  • 在做分库分表时,基于 Hash 取模和一致性 Hash 的数据分片是如何实现的?

  • 如何对热点商品数据做存储策略 ?

  • 强一致性和最终一致性的数据共识算法是如何实现的 ?

在分布式系统中设计支持海量商品存储的高扩展性架构,需综合考虑数据分片、复制策略及一致性算法

在这里插入图片描述

1. 数据分片策略

Hash取模分片

将商品ID通过哈希函数取模,均匀分布到节点。例如,4个节点时,商品ID%4决定存储位置。优点:数据分布均匀;缺点:扩展性差,节点增减导致大规模数据迁移。

在这里插入图片描述


一致性Hash分片

节点和数据映射到哈希环,数据顺时针找到最近节点存储。通过虚拟节点(如10个虚拟节点对应4个物理节点)减少数据倾斜。优点:节点增减仅影响相邻数据,迁移量小;缺点:仍存在单一热点问题。

在这里插入图片描述

当我们新增一台服务器,即节点 E 时,受影响的数据仅仅是新服务器到所处环空间中前一台服务器(即沿着逆时针方向的第一台服务器)之间的数据。只有商品 100 和商品 101 从节点 A 被移动到节点 E,其他节点的数据保持不变。此后,节点 A 只存储 Hash 值为 2 和 3 的商品,节点 E 存储 Hash 值为 0 和 1 的商品

在这里插入图片描述


Range分片

虽然一致性 Hash 提升了稳定性,使节点的加入和退出不会造成大规模的数据迁移,但本质上 Hash 分片是一种静态的分片方式,必须要提前设定分片的最大规模,而且无法避免单一热点问题, 某一数据被海量并发请求后,不论如何进行 Hash,数据也只能存在一个节点上,这势必会带来热点请求问题。比如某些商品卖得非常火爆,通过 Hash 分片的方式很难针对热点商品做单独的架构设计。

所以,如何解决单一热点问题?答案是做 Range(范围)分片


分片设计原理

  1. 基于范围的数据划分
    将数据按照键的范围(如时间戳、主键区间等)划分为连续区间,每个区间对应一个分片(Shard)。

    • 示例:分片1(0-1000)、分片2(1001-2000)…
    • 允许动态调整分片边界,支持热点范围的二次拆分。
  2. 与 Hash 分片的对比优势

    • 灵活扩展:无需预先定义分片数量,可动态增减。
    • 范围查询高效:相邻数据天然聚集在同一分片,适合扫描类操作(如 BETWEEN 查询)。
    • 热点分散:可将单一热点范围拆分为多个子分片,分散负载。

核心设计模块

分片规则定义
  • 分片键(Shard Key)
    选择具有业务意义且可排序的字段(如订单ID、时间戳、地理位置编码)。

    • 示例:电商场景可选择「商品ID前缀+时间戳」作为组合键。
  • 分片元数据管理
    维护全局分片映射表(Shard Map),记录每个分片的起止键、所属节点、负载状态等。

    • 存储方式:独立元数据库(如 etcd/ZooKeeper)或配置中心。
动态分片调整
  • 分裂(Split)
    当单个分片数据量或请求量超过阈值时,自动将其拆分为多个子分片。

    • 触发条件:数据量 > 阈值(如 10GB)或 QPS > 单节点承载能力。
    • 操作流程
      1. 暂停分片写入(短暂不可用)。
      2. 按中间键(Mid Key)分裂数据。
      3. 更新元数据并恢复服务。
  • 合并(Merge)
    相邻分片负载较低时,合并以降低管理开销。

    • 触发条件:数据量 < 合并阈值(如 1GB)且 QPS 持续低位。
路由与负载均衡
  • 客户端路由
    客户端通过查询元数据确定目标分片位置。

    • 优化:本地缓存分片映射表,减少元数据访问延迟。
  • 代理层路由
    通过中间件(如 Proxy 或 Coordinator)转发请求,实现透明分片。

    • 示例:TiDB 的 Placement Driver(PD)负责分片调度。
  • 热点重定向
    实时监控分片负载,动态将热点分片请求分流至副本或新分裂的子分片。


应对热点的关键技术

多级分片(Hierarchical Sharding)
  • 主分片(Primary Shard)管理整体范围,子分片(Sub-Shard)处理热点区间。
    • 示例:某热门商品ID范围 2000-3000 可拆分为 2000-25002501-3000,分布到不同节点。
副本分散策略
  • 为热点分片创建多个只读副本(Read Replica),分布在多个节点。
  • 写入仍由主分片处理,读取流量分散到副本。
缓存层配合
  • 结合 Redis 或内存缓存,将热点数据提前加载至应用层,减少对底层分片的直接访问。

典型应用场景

  1. 时序数据
    • 按时间范围分片(如日志、监控数据),天然支持按时间过滤查询。
  2. 热销商品
    • 将热门商品ID区间拆分到多个分片,结合缓存分散请求。
  3. 多租户 SaaS 系统
    • 按租户ID分片,确保同一租户数据局部性。

优缺点分析

优点挑战
灵活应对数据增长与热点分片键选择不当易导致数据倾斜
高效处理范围查询动态分片需复杂元数据管理
支持业务语义分片(如按地域、时间)跨分片事务一致性实现成本较高

通过 Range 分片的动态性和灵活性,结合副本、缓存和自动化调度策略,可有效解决单一热点问题,同时为业务提供高效的范围查询能力。


2. 应对热点数据

  • 读热点:引入缓存(如Redis)分担数据库压力,结合本地缓存减少网络开销。
  • 写热点
    • Range分片:将热点类目拆分为多个分片,结合垂直扩展(提升单节点性能)。
    • 分片元数据服务:通过ETCD集群管理分片信息,动态路由请求,灵活调整热点分片分布。

3. 数据复制与一致性

  • 主从复制:数据副本提升可用性,主节点故障时从节点接管。
  • 一致性算法
    • 强一致性(Raft/Paxos):确保数据变更原子性。ETCD使用Raft,选举Leader处理请求,日志复制保证多数节点一致。
    • 最终一致性(Gossip):节点间异步传播数据,容忍临时不一致。适用于AP场景,如Cassandra。

4. 分片元数据管理

  • 元数据服务:独立集群存储分片规则、节点状态,通过ETCD保证高可用和一致性。
  • 客户端路由:请求先查询元数据获取分片位置,结合缓存减少元数据访问延迟。

5. 一致性算法对比

在分布式系统中,造成系统不可用的场景很多,比如服务器硬件损坏、网络数据丢包等问题,解决这些问题的根本思路是多副本,副本是分布式系统解决高可用的唯一手段,也就是主从模式,那么如何在保证一致性的前提下,提高系统的可用性,Paxos 就被用来解决这样的问题,而 Paxos 又分为 Basic PaxosMulti Paxos,然而因为它们的实现复杂,工业界很少直接采用 Paxos 算法。

Raft 是 Multi Paxos 的一种实现,是通过一切以领导者为准的方式,实现一系列值的共识,然而不是所有节点都能当选 Leader 领导者,Raft 算法对于 Leader 领导者的选举是有限制的,只有最全的日志节点才可以当选。正因为 ETCD 选择了 Raft,为工业界提供了可靠的工程参考,就有更多的工程实现选择基于 Raft,如 TiDB 就是基于 Raft 算法的优化


除此之外, 还可以有一种思路:分片元数据服务毕竟是一个中心化的设计思路,而且基于强一致性的共识机制还是可能存在性能的问题,有没有更好的架构思路呢?

既然要解决可用性的问题,根据 Base 理论,需要实现最终一致性,那么 Raft 算法就不适用了,因为 Raft 需要保证大多数节点正常运行后才能运行。这个时候,可以选择基于 Gossip 协议的实现方式。

Gossip 的协议原理有一种传播机制叫谣言传播,指的是当一个节点有了新数据后,这个节点就变成了活跃状态,并周期性地向其他节点发送新数据,直到所有的节点都存储了该条数据。这种方式达成的数据一致性是 “最终一致性”,即执行数据更新操作后,经过一定的时间,集群内各个节点所存储的数据最终会达成一致,很适合动态变化的分布式系统。

在这里插入图片描述

节点 A 向节点 B、C 发送新数据,节点 B 收到新数据后,变成了活跃节点,然后节点 B 向节点 C、D 发送新数据

  • Basic Paxos:解决单个值共识,两阶段提交(Prepare/Accept),高延迟但可靠。
  • Multi Paxos:选举Leader处理多个提案,减少Prepare阶段开销,提升效率。
  • Raft:简化Multi Paxos,Leader选举、日志复制和安全性明确分离,易于工程实现。
  • Gossip : 当一个节点有了新数据后,这个节点就变成了活跃状态,并周期性地向其他节点发送新数据,直到所有的节点都存储了该条数据

在这里插入图片描述


6. 扩展性与容灾

  • 动态扩缩容:一致性Hash或Range分片支持平滑扩容,数据迁移期间双写保证可用性。
  • 多数据中心:跨地域部署结合异步复制(最终一致性)或同步协议(如Raft跨区域优化)。

总结

  1. 分片选择:主用Range分片按类目划分,辅以一致性Hash处理非热点数据。
  2. 热点处理:元数据服务动态路由,热点类目拆分为多个分片,结合缓存抗读压力。
  3. 数据一致性:主从复制+Raft协议,确保强一致性;异地容灾采用异步复制+Gossip。
  4. 元数据管理:ETCD集群存储分片信息,客户端缓存元数据减少延迟。

此方案平衡了扩展性、一致性与可用性,灵活应对海量数据与业务热点,符合高并发场景需求。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41597.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins最新版,配置Gitee私人令牌和Gitee凭证

jenkins 配置Gitee私人令牌和凭证 jenkins 版本&#xff1a;Jenkins 2.492.2 Gitee配置 Jenkins配置gitee插件&#xff0c;需要先申请gitee私钥。 安装gitee插件 申请Gitee私人令牌&#xff0c;后面还需要添加凭证。 测试链接&#xff0c;并保存 配置凭证

ORACLE RAC ASM双存储架构下存储部分LUN异常的处理

早上接到用户电话&#xff0c;出现有表空间不足的告警&#xff0c;事实上此环境经常巡检并且有告警系统&#xff0c;一开始就带着有所疑惑的心理&#xff0c;结果同事在扩大表空间时&#xff0c;遇到报错 ORA-15401/ORA-17505,提示ASM空间满了&#xff1a; ALERT日志&#xff1…

Windows下docker使用教程

docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的&#xff0c;后面的内容其实不变 …

9.4分漏洞!Next.js Middleware鉴权绕过漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;Next.js 存在一个授权绕过漏洞&#xff0c;编号为 CVE-2025-29927。攻击者可能通过发送精心构造的 x-middleware-subrequest 请求头绕过中间件安全控制&#xff0c;从而在未授权的情况下访问受保护…

代码随想录算法训练营Day12 | Leetcode 226翻转二叉树、101对称二叉树、104二叉树的最大深度、111二叉树的最小深度

代码随想录算法训练营Day12 | Leetcode 226翻转二叉树、101对称二叉树、104二叉树的最大深度、111二叉树的最小深度 一、翻转二叉树 相关题目&#xff1a;Leetcode226 文档讲解&#xff1a;Leetcode226 视频讲解&#xff1a;Leetcode226 1. Leetcode226.翻转二叉树 给你一棵二…

3.26学习总结 做题

先初始化n1时&#xff0c;输出的图案。 观察可以得到&#xff0c;n每加1&#xff0c;则在原先图案的左下方和右下方重新打印一遍原先的图案&#xff0c;可以分为两步。 1.复制原先图案打印在其正下方和右下方&#xff0c;并将原先图案清空。 2.在现在图案的上方中间打印原先…

Linux学习笔记(应用篇二)

基于I.MX6ULL.MINI开发板 开发板与电脑相互通信电脑与开发板互传文件 开发板与电脑相互通信 用网线将电脑与开发板连接 本人使用的是Ubuntu系统&#xff0c;不是虚拟机 一般来说刚开始电脑和开发板是ping不通的 首先查看电脑的 IP WinR&#xff0c;cmd调出终端 我使用的是…

【gradio】从零搭建知识库问答系统-Gradio+Ollama+Qwen2.5实现全流程

从零搭建大模型问答系统-GradioOllamaQwen2.5实现全流程&#xff08;一&#xff09; 前言一、界面设计&#xff08;计划&#xff09;二、模块设计1.登录模块2.注册模块3. 主界面模块4. 历史记录模块 三、相应的接口&#xff08;前后端交互&#xff09;四、实现前端界面的设计co…

中间件漏洞-Tomcat篇

一&#xff1a;CVE-2017-12615 1.搭建服务 cd /www/wwwroot/vulhub-master/tomcat/CVE-2017-12615 docker-compose up -d 2.打开网页 3.在哥斯拉中生成jsp木马并保存为2.jpg 对当前页面进行抓包&#xff0c;修改提交方式为PUT并复制木马 4.在网页中访问我们生成的木马&#…

PHP eval 长度限制绕过与 Webshell 获取

在 PHP 代码中&#xff0c;如果 eval($param); 存在且长度受限&#xff0c;并且过滤了 eval 和 assert&#xff0c;仍然可以通过多种方法绕过限制&#xff0c;获取 Webshell。 源码 <?php $param $_REQUEST[param]; if(strlen($param)<17 && stripos($param,…

31天Python入门——第15天:日志记录

你好&#xff0c;我是安然无虞。 文章目录 日志记录python的日志记录模块创建日志处理程序并配置输出格式将日志内容输出到控制台将日志写入到文件 logging更简单的一种使用方式 日志记录 日志记录是一种重要的应用程序开发和维护技术, 它用于记录应用程序运行时的关键信息和…

特殊行车记录仪DAT视频丢失的恢复方法

行车记录仪是一种常见的车载记录仪&#xff0c;和常见的“小巧玲珑”的行车记录仪不同&#xff0c;一些特种车辆使用的记录仪的外观可以用“笨重”来形容。下边我们来看看特种车载行车记录仪删除文件后的恢复方法。 故障存储: 120GB存储设备/文件系统:exFAT /簇大小:128KB 故…

机器学习——KNN数据均一化

在KNN&#xff08;K-近邻&#xff09;算法中&#xff0c;数据均一化&#xff08;归一化&#xff09;是预处理的关键步骤&#xff0c;用于消除不同特征量纲差异对距离计算的影响。以下是两种常用的归一化操作及其核心要点&#xff1a; 质押 一 、主要思想 1. 最值归一化&#…

Element UI实现表格全选、半选

制作如图所示的表格全选、半选&#xff1a; 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…

深度学习入门1 基于Python的理论与实现

torch.unsqueeze()将一维数据变为二维数据&#xff0c;torch只能处理二维数据 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()转换为numpy 第3章 神经网络 实现softmax函数时的注意事项&#xff1a;为防止e的指数运算造成溢出 矩阵的第 0 维是列方向,第…

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…

UDP数据报套接字编程

1.DatagramSocket API Socket是操作系统中的一个概念 本质上是一种特殊的文件 Socket就属于是把"网卡"这个设备,抽象成文件了 往Socket文件中写数据,就相当于通过网卡发送数据 从Socket文件读数据,就相当于通过网卡接受数据 在Java中就使用DatagramSocket这个类…

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…

NodeJs之http模块

一、概念&#xff1a; 1、协议&#xff1a;双方必须共同遵从的一组约定。 Hypertext Transfer Protocol&#xff1a;HTTP&#xff0c;超文本传输协议 2、请求&#xff1a; ① 请求报文的组成&#xff1a; 请求行请求头空行请求体 ② 请求行&#xff1a;

26考研——图_图的应用(6)

408答疑 文章目录 四、图的应用图的应用考查形式最小生成树最小生成树概念最小生成树的性质最小生成树中某顶点到其他顶点是否具有最短路径的分析构造最小生成树的算法Prim 算法Prim 算法概述Prim 算法的构建思想Prim 算法的步骤Prim 算法的示例Prim 算法的性质 Kruskal 算法Kr…