【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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

Django视图与URLs路由详解

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

【北京迅为】《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…

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

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

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

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

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

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

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

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

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

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

5.Fabric的共识机制

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

C/C++ 内存管理

C/C 内存管理 1. C/C内存分布2. C语言中动态内存管理方式:malloc/calloc/realloc/free3. C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数(重要点进行讲解)4.1 operator new与o…

【Java】:洗牌功能和杨辉三角的实现

洗牌 此操作包含的基本功能有: 组牌:组建 52 张扑克牌 四种花色:“♥️”,“♠️”,“⬛️”,“♣️”每种花色 13 张牌:1~13 洗牌:将 52 张扑克牌打乱顺序发牌:给三个人…

【深度学习入门篇 ⑪】自注意力机制

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

Vue3 SvgIcon组件开发

在前面自定义tree组件继续功能迭代前,我们先开发一个通用的ScgIcon组件,用于后续组件模板中小图标的展示。 引入iconfont 官网:https://www.iconfont.cn/ 选取图标进行下载,只取iconfont.js文件 在prettier中忽略该文件&#x…

【YOLOv5/v7改进系列】引入CoordConv——坐标卷积

一、导言 与标准卷积层相比,CoordConv 的主要区别在于它显式地考虑了位置信息。在标准卷积中,卷积核在输入上滑动时,仅关注局部区域的像素强度,而忽略其绝对位置。CoordConv 通过在输入特征图中添加坐标信息,使得卷积…

STM32CubeIDE(CAN)

目录 一、概念 1、简述 2、CAN 的几种模式 二、实践 1、环回模式轮询通信 1.1 软件配置 1.2 代码编写 2、环回模式中断通信 2.1 软件配置 2.2 代码编写 一、概念 1、简述 STM32微控制器系列包含多个型号,其中一些型号集成了CAN(Controller Are…

Vuex--全局共享数据

目录 一 是什么? 二 怎么用? 三 注意点 一 是什么? 在此之前,我们使用vue的数据全部放在每个组件的data区域里面,这里return里面存的都是这个组件要用到的数据,但是这里面的数据是局部的数据,也就是说这些数据是这…

Chrome v8 pwn 前置

文章目录 参考用到啥再更新啥简介环境搭建depot_tools和ninjaturbolizer 调试turbolizer使用结构数组 ArrayArrayBufferDataViewWASMJSObject结构Hidden Class命名属性-快速属性Fast Properties命名属性-慢速属性Slow Properties 或 字典模式Dictionary Mode编号属性 (Elements…