【SQLServer】如何设计日增几十万数据量的业务分库分表方案

随着公司的业务发展不断的壮大,像一些核心的业务(如订单)数据量会越来越大,此时就需要考虑分库分表方案来应对业务的发展。今天就来聊聊分库分表的一些设计方案。

1、冷热数据分离方案

    在我们业务中有些数据只是最近一段时间使用比较频繁,过着这段时间就基本上不用了,如龙虾之前负责的物流系统中的物流轨迹数据,一条物流单号对应着若干条物流轨迹数据,如下所示的物流轨迹:

    一个物流单号(如YT20241234569)对应的轨迹有6条数据数据了,假设一天的订单量有2万单,此时至少有12万条物流轨迹产生, 日复一日的数据量积累,那么物流轨迹表的数据也是非常的庞大的。   

    从业务角度分析,按照用户的习惯来讲,某个订单待收货与交易成功之间的这段时间中我们是比较关心物流的轨迹的,一旦收到货之后基本很少再去看这单的物流轨迹信息,所以针对这种数据量大(物流轨迹数据)、只在某段时间内频繁关心的数据,我们可以使用冷热数据隔离的方案来解决数据量大的问题。下图使用物流轨迹数据冷热分离方案为案例分析:

(1)物流单号订阅物流系统,物流系统将物流单号订阅三方快递,一旦订阅成功之后,三方快递收到物流轨迹变动就会推送给物流系统,然后物流系统将数据存放到热表中;

(2)用户查询的时候优先从热表先查询数据,如果热表有物流轨迹的数据就直接返回数据给用户;如果热表中不存在物流数据,那么再去冷表中查询数据,将冷表的查询结果给用户;

(3)每天夜里(如凌晨两点)采用定时任务将一个月之前的数据都迁移到冷表中,这样可以保持热表中都是最近的数据。

    至此就完成了一套使用通过冷热分离的方案实现对日增几十万条业务数据的处理。

2、分库分表方案

    公司现有的业务体量非常大的,在读写分离、主从架构都无法满足现有的业务的时候,我们就可以考虑分库分表,为什么不优先考虑分库分表方案呢?因为业务数据越分散,开发和维护成本就越高,并且系统的不稳定性又多一些威胁因素。

    分库分表是应对业务数据量大、高并发的重要手段之一,我们要搞清楚何时分库,何时分表,何时既分库也分表呢?

(a)分库的场景:在高并发下,数据库的连接不够用的时候,此时可以通过增加数据库的实例来增加数据库的连接数。如下所示的分库方式:

(b)分表的场景:如果单表的数据量很庞大,此时数据库的连接是够用的,但是存储和查询的性能已经成为业务瓶颈,那么就考虑分表。如下图所示的分片:

(c)既分库也分表的场景:数据库的连接不够,并且表数据量很庞大此时一般需要考虑既要分库也要分表。但是具体分多少库分多少表实际的业务预估数据量来做决定,如下图所示的既分库也分表的图:

    在确定了需要分库分表后就需要考虑将数据分到哪个库或者哪张表中,下面介绍4种主流的切分:

(1)Range法

    此算法是按照某个字段(如订单id、用户id)的数据区间来进行切分的,可以将数据切分到同一个数据库的不同表中,如下所示:

也可以将数据切分到不同库的不同表中,如下所示:

    Range算法对于需要扩容来说是非常的友好的,因为只需要添加一张数据表,通过算法就可以自动实现扩容机制。同时Range算法也存在写偏移和热点数据问题。

(2)hash分片算法

    该方案是通过对分表键key进行某种运算(如取模运算),然后通过运算结果来决定路由的库和表,如下图所示:

    hash分片方案可以使得数据分片比较均匀,大大降低数据倾斜和热点数据的问题; hash分片方案的缺点也很明显,如后期扩容存在一定的难度,需要迁移数据;数据被切分到不同的库和表中,存在查询和分页等问题;

(3)查表映射法

    此方案的实现原理是将决定某个sharding key落在哪个分片上靠人为的预先制定的策略(策略记录在数据表中)来分配,如下所示的分配流程:

    查表映射法可以灵活设置路由规则,但是要求映射表本身的数据不能太多,否则映射表反而成为性能瓶颈了。

    查表映射法相对其他两种分片算法来说,它需要二次查询、实现上也更加的复杂一些。

(4)一致性hash

    一致性hash可以按照普通的hash算法对key哈希到一个圆环空间上,形成一个顺时针的首位闭合的环形,如下图所示:

    此时key1顺时针放在节点A上,同理key放在B节点上,如果A、B、C节点假设分布不均匀,我们可以使用虚拟节点的方案来处理,之前龙虾也介绍过一致性hash,有兴趣的朋友可以在看下:

深入理解一致性Hash和虚拟节点

3、分库分表带来的问题

(1)分布式id

    单库单表的时代,我们可以直接使用表自增主键保证全局唯一,分库分表后,需要自己维护全局唯一的ID。生成全局唯一id的方案如下整理:

整理10种分布式id生成方案

(2)分布式事务

    分库分表之后可能就需要引入分布式事务的问题,解决方案如下整理:

罗列分布式事务解决方案

(3)分页查询问题

    单库单表的时候我们可以使用数据的limit来进行分页查询,但是分库分表后就出现分页查询的问题了,常见的处理方案如下:

(a)使用Elasticsearch;

(b)特定的条件先分页查询;按照某个字段先分页查询数据,查询好之后再去查询组装其他的数据。

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

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

相关文章

iptables四表五链

Iptables 是 Linux 下的一个强大的工具,用于管理网络规则的集合,称为 netfilter。它定义了四个表和五个链。 四表: filter 表:负责过滤功能,预设的链有 INPUT、FORWARD、OUTPUT。 nat 表:负责网络地址转换…

世平基于 NXP UWB Digital-Key Kit 应用方案

大联大世平集团针对汽车数字钥匙,推出了基于 NXP UWB Digital-Key Kit 解决方案。此方案基于超宽带(UWB)技术,利用 UWB 技术的高精度定位和距离测量能力,实现了安全、便捷的数字钥匙功能。该套件主要器件有 NXP 的 UWB…

14、如何⽤DDD设计微服务代码模型

在完成领域模型设计后,接下来我们就可以开始微服务的设计和 落地了。在微服务落地前,⾸先要确定微服务的代码结构,也就是我 下⾯要讲的微服务代码模型。 只有建⽴了标准的微服务代码模型和代码规范后,我们才可以将 领域对象映射到…

《设计模式之美》读书笔记2

从Linux学习应对大型复杂项目的方法: 1、封装与抽象:封装了不同类型设备的访问细节,抽象为统一的文件访问方式,更高层的代码就能基于统一的访问方式,来访问底层不同类型的设备。这样做的好处是,隔离底层设备…

AgentMD:通过大规模临床工具学习提升语言代理的风险预测能力

人工智能咨询培训老师叶梓 转载标明出处 临床计算器在医疗保健中扮演着至关重要的角色,它们通过提供准确的基于证据的预测来辅助临床医生进行诊断和预后评估。然而,由于可用性挑战、传播不畅和功能受限,这些工具的广泛应用常常受限。为了克服…

学懂C语言(十七):static的用法、作用及其含义

在 C 语言中,static 关键字有多种用途,主要用于变量和函数。以下是 static 关键字的详细讲解,包括其用法、作用以及示例。 1. 静态局部变量 作用 静态局部变量在函数内部声明,但其生命周期贯穿整个程序运行期间,而不…

Django视图与URLs路由详解

在Django Web框架中,视图(Views)和URLs路由(URL routing)是Web应用开发的核心概念。它们共同负责将用户的请求映射到相应的Python函数,并返回适当的响应。本篇博客将深入探讨Django的视图和URLs路由系统&am…

JAVA学习-练习试用Java实现“从前序与中序遍历序列构造二叉树”

问题: 给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,15,7] 示例 2: Input: preorder [-1], inorder [-1] Output: [-1] 提…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十八章 Platform 设备驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

java的DOS命令

目录 1.DOS命令了解 DOS介绍 常用的dos命令1 DOS的基本原理 相对路径与绝对路径 常用的dos命令2 2.本章作业 1.编写hello,world程序 2.输出个人基本信息 3.jdk,jre,jvm关系 4.环境变量path配置及作用 5.java编写步骤 6.java编写7…

python键盘操作工具:ctypes、pyautogui

这里模拟 Win Ctrl L 组合键 1、ctypes ctypes库,它允许我们直接调用Windows API来模拟键盘输入。 import ctypes import time# 定义所需的常量和结构 LONG ctypes.c_long DWORD ctypes.c_ulong ULONG_PTR ctypes.POINTER(DWORD) WORD ctypes.c_ushortclass…

昇思25天学习打卡营第4天 | 网络构建

在学习和实践MindSpore神经网络模型构建的过程中,我深刻理解了MindSpore中如何通过nn.Cell类来构建和管理复杂的神经网络模型。通过这次的实践,我对神经网络的基本构建和应用有了更加全面的认识,以下是我学习过程中所总结的几点心得&#xff…

【MySQL】根据binlog日志获取回滚sql的一个开发思路

根据binlog日志获取回滚sql的一个开发思路 需要获取的信息 thread_id 打开 mysql 客户端 开始时间 关闭 mysql 客户端 结束时间 binlog 匹配流程 指定 mysql 客户端 开始时间和结束时间 先匹配 thread_id 相同的 然后匹配 ^BEGIN$行和 ^COMMIT/*!*/;$行之间的数据 当匹…

c++端的类,作为组件在qml端使用

qml使用c端的类&#xff0c;作为组件在qml端使用 这个类必须继承QObject 这个类必须继承QObject #ifndef COLLISIONALARM_H #define COLLISIONALARM_H#include <QObject>class CollisionAlarm : public QObject {Q_OBJECT//这个宏就叫做反射机制&#xff0c;让qml端直接…

科普文:云计算服务类型IaaS, PaaS, SaaS, BaaS, Faas说明

概叙 基本概念 IaaS, PaaS, SaaS, BaaS, 和 FaaS 是云计算服务的不同类型&#xff0c;‌它们各自提供了不同的服务层次和功能。‌ IaaS (Infrastructure as a Service基础设施即服务) 提供基础设施服务&#xff0c;‌包括服务器、‌存储、‌网络等硬件资源。‌用户可以在这些…

Linux嵌入式学习——数据结构——概念和Seqlist

数据结构 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff0c;数据和数据之间是一对一的关系。数组就是线性表的一种。 树&#xff0c; 一对多 图&#xff0c;多对多 …

项目策划不再愁,可道云teamOS流程图助你轻松上阵

在当今这个快节奏、高协同的工作环境中&#xff0c;每一项任务的推进都离不开清晰、高效的沟通与规划。 在线流程图工具&#xff0c;作为数字时代团队协作的得力助手&#xff0c;以其直观易懂的呈现方式、灵活多变的编辑功能&#xff0c;极大地简化了复杂项目的策划与执行流程…

ip地址设置了重启又改变了怎么回事

在数字世界的浩瀚星海中&#xff0c;IP地址就如同每个设备的“身份证”&#xff0c;确保它们在网络中准确无误地定位与通信。然而&#xff0c;当我们精心为设备配置好IP地址后&#xff0c;却时常遭遇一个令人费解的现象&#xff1a;一旦设备重启&#xff0c;原本设定的IP地址竟…

线程池超载求生指南:四大拒绝策略应对并发挑战(Java线程池拒绝策略全解析)

文章目录 线程池拒绝策略&#xff1a;优雅处理过载请求什么是线程池拒绝策略&#xff1f;内置的拒绝策略代码示例创建一个简单的线程池使用 AbortPolicy使用 CallerRunsPolicy使用 DiscardPolicy使用 DiscardOldestPolicy 通俗易懂地理解这些拒绝策略自定义拒绝策略总结 线程池…

5.Fabric的共识机制

在Fabric中,有以下3中典型共识机制。 Solo共识 solo共识机制只能用于单节点模式,即只能有一个Orderer节点,因此,其共识过程很简单,每接收到一个交易信息,就在共识模块的控制下产生区块并广播给节点存储到账本中。 Solo 模式下的共识只适用于一个Orderer节点,所以可以在…