分库分表设计方案

article/2025/4/24 9:46:10

一、为什么要分库分表?
随着业务的不断发展,数据量不断增加,因此数据操作,如增删改查的开销也会越来越大,原来基于单库单表的设计已经不能满足存储需求,数据库随时面临爆库风险;

再加上物理服务器的资源有限(CPU、磁盘、内存、IO 等)。最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

二、如何解决?
1、增加存储这只能暂时缓解,但也可能是一种性价比比较高的方案

2、数据实现动静分离,定时备份到达终态数据,缓解存储压力

例:

热数据:3个月内的订单数据,查询实时性较高;(mysql中分库分表)

冷数据A:3个月 ~ 12个月前的订单数据,查询频率不高;(es中)

冷数据B:1年前的订单数据,几乎不会查询,只有偶尔的查询需求;(hive)

3、数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。有时候,我们需要同时考虑这两个问题,因此,我们既需要对单表进行分表操作,还需要进行分库操作,以便同时扩展系统的并发处理能力和提升单表的查询性能,就是我们使用到的分库分表。

三、分库分表的实现方案
拆分的方式有两种,一种是水平拆分,一种是垂直拆分,分库分表是对数据库拆分的解决方案;根据分库分表方案中实施切片逻辑不同,我们将分库分表的实现方案分成三大类:客户端,代理分片,分布式数据库

1、客户端
客户端分片就是使用分库分表数据库的应用层直接操作分片逻辑,分片规则需要在同一应用的多个模块进行同步,每个应用嵌入一个操作分片的逻辑实现,一般都通过依赖jar实现,具体的实现方式分为三种:一种在应用层直接实现,第二通过ORM框架实现;第三通过定制JDBC协议实现;

应用层实现:这是一种通用的简单的实现方案,直接在应用层读取分片规则实现路由逻辑,然后应用层自己决定访问那个实例,那个库,那个表,那个字段等等。架构如下:

在这里插入图片描述

这种方案虽然侵入了业务,但是实现比较简单,适合快速上手,出问题也比较好查,目前有一些开源实现dbsplit方案

ORM框架实现:
通过定制ORM框架中或者通过框架的扩展机制来实现分库分表的逻辑,现在很多公司通过mybatis配置文件的SQL中的表索引的参数来实现分片;

在这里插入图片描述

mybatis实现分库分表方式:

在这里插入图片描述

在这里插入图片描述

此方案也是推荐方案

JDBC协议实现:
我们通过定制JDBC协议来实现,针对业务提供JDBC一致的接口,让业务方无需关系分库分表的实现,让分库分表规则在JDBC内部实现,对业务方透明;

架构如下:
在这里插入图片描述
在这里插入图片描述

ShardingSphere-JDBC体系结构

这种解决方案对业务透明,不侵入业务,让开发人员更大限度聚焦在逻辑实现上,但开发人员需要理解并使用JDBC协议;现在流行的框架:shardingsphere,前身是sharding-jdbc由当当开发,现目前已经交给apahce了

https://github.com/apache/incubator-shardingsphere

使用限制:

对于部分SQL语法不支持,比如:having,union,or,批量插入insert into values(v1,v2),(v3,v4),distinct,不支持子查询

2、代理分片
代理层是在应用层和数据库层增加一个代理层,把分片规则配置在代理层,代理层对外提供与JDBC兼容的接口给应用层,业务也不用关系分片规则

在这里插入图片描述

这种方案的优点是对业务透明,缺点是增加一层网络代理,对性能有损失;

在这里插入图片描述

3、分布式数据库
通过将分片功能在DB内部实现来实现分布式存储,对业务透明;

架构如下:
在这里插入图片描述

业界的开源实现,阿里的OceanBase,开源的tidb和度小满nesiodb

四、案例分析
1、billing模块t_bill_record数据超两千万条

在这里插入图片描述

水平拆分,以周为单位,提前建好两年的表t_bill_record_yyyymmdd
新增数据根据当前时间进入对应的表中
查询数据根据时间跨度,联合查询的表数据
数据迁移(尽量不要影响正在使用中的表,如果有影响,对于insert/update/delete,每次处理1000行数据,执行commit,之后sleep 1秒。对于select,每次查询2000行数据,之后sleep1秒)

2、亿级订单系统设计
订单表为例,在订单表中,订单id肯定是不可重复的,因此将该字段当做shard key 是非常适合的,其他表类似。
例:单张order表分为10个库,每个库100个表
中间变量 = shard_key / (库数量*单个库的表数量)
库序号 = 取整(中间变量/单个库的表数量)
表序号 = 中间变量 % 单个库的表数量,

如果shard_key 不是整数类型,可以先hash 在进行取模,

例如: hash(shard_key) % 库容量

数据迁移(双写迁移方案)
就是在线上系统,之前所有写库的地方,增删改操作,除了对旧库增删改,都加上对新库的增删改,这就是所谓双写 — 同时写俩库(旧库和新库)
同时起一个job,同步旧库数据到新库,接着当数据完全一致了,上线所有操作到新库服务


http://chatgpt.dhexx.cn/article/MCPSP9TF.shtml

相关文章

python:numpy的corrcoef计算相关系数

corrcoef(x, yNone, rowvarTrue, biasnp._NoValue, ddofnp._NoValue)函数常用的是前三个参数,x和y分别是需要计算相关系数的两个随机变量,当rowvar为True(默认情况)时,每一行代表一个随机变量,否则每一列代表一个随机变量。 该函数…

python 计算相关性系数np.corrcoef()

计算相关性是分析连续型与连续型双变量的常用方法,散点图只能直观的显示双变量(特征)之间的关系,但并不能说明关系的强弱,而相关性可以对变量之间的关系进行量化分析。 相关性系数的公式如下: 相关性系数…

Numpy库 numpy.corrcoef()函数

相关系数公式: 其他详见: 1. Python Numpy库 numpy.corrcoef()函数讲解 2. 协方差、方差、标准差、协方差系数 3. 标准差、方差、协方差三者的表示意义

MATLAB中的corrcoef函数求两个向量的相关系数。

 想用MATLAB中的corrcoef函数求两个向量的相关系数。 比如A[1 2 3];B[5 3 7]; r corrcoef(A,B)可以求出相关系数是0.5.为什么两个向量的元素都要是3个以上才行?而只有两个元素的向量如A[1 2];B[5 3];不管怎么随机的取,相关系数都…

使用numpy计算相关系数矩阵:np.corrcoef()

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 使用numpy计算相关系数矩阵 np.corrcoef() 选择题 关于以下代码说法错误的是? import numpy as np array1np.array([[1,2,3], [2,3,4], [2,3,3], [4,3,2], [4,3,3]]) print(array1) print(&…

matlab 计算相关系数,MATLAB如何使用corrcoef函数计算样本数据的相关系数

MATLAB如何使用corrcoef函数计算样本数据的相关系数 【语法说明】 Rcorrcoef(X):如果X为向量,函数返回1;如果X为mn 矩阵,则以每行为观测值,每列为一个随机变量计算相关系数,返回一个nn对称矩阵。假设协方差…

numpy.corrcoef()函数讲解

numpy.corrcoef(x, y无, rowvar True, 偏差<无值>, ddof<无值>) 【学习参考】&#xff1a;Python Numpy库 numpy.corrcoef()函数讲解_Hello_xzy_Word的博客-CSDN博客_numpy.corrcoef x&#xff1a; array_like&#xff0c;包含多个变量和观测值的1-D或2-D数组&a…

Python Numpy库 numpy.corrcoef()函数讲解

例子&#xff1a; 代码&#xff1a; import numpy as npArray1 [[1, 2, 3], [4, 5, 6]] Array2 [[11, 25, 346], [734, 48, 49]] Mat1 np.array(Array1) Mat2 np.array(Array2) correlation np.corrcoef(Mat1, Mat2) print("矩阵1\n", Mat1) print("矩阵…

一、求相关函数 corrcoef+协方差矩阵cov

1. 求相关函数corrcoef 一般作用&#xff1a;1&#xff09;结合图表评估数据拟合效果&#xff1b;2&#xff09;评估两组数据之间的互相关联程度&#xff0c;大于0正相关&#xff0c;小于0负相关&#xff0c;等于0不相关。 但此种计算方法反映的是“线性相关”程度&#xff0…

MATLAB 协方差 [cov] 和相关系数 [corrcoef] 说明

A,B为两个长度相同的向量 求协方差 Scov(A,B); b和c数值上是相等的。 求相关系数 Rcorrcoef(A,B) 数值上,f和g是相同到。 相关系数存在许多种类&#xff0c;上述corrcoef 指 pearson correlation coefficient。 性质&#xff1a;向量乘常数&#xff0c;不改变Pearson 相关…

皮尔逊相关分析的MATLAB实现,corr(),corrcoef()函数使用

皮尔逊相关系数可以用来表述两个序列的相关性。 常常用来做数据分析、数据挖掘等工作。 如何简单快捷的实现皮尔逊相关&#xff0c;并得到结果&#xff1f; 需要应用MATLAB中的corr(X, Y)或者 corrcoef(X,Y)函数。 其中corr(X, Y)既可以计算矩阵相关也可以计算序列相关&…

用C语言实现简单的计算器

功能介绍 用C语言实现整形简单的加减乘除操作&#xff08;通常方法与使用函数指针数组的方法&#xff09; 代码实现 方法一 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<stdlib.h>int main() {while (1){double x 0, y 0, ret 0;//定义运…

C语言编写一个计算器(附全源代码)

这个计算器其实是我老师布置的一个c语言大作业,捉摸着搞了那么久的东西不能浪费了吧,于是我分享下我的代码和大概思路 给个关注点个赞,后续我会分享更多我们学生党的作业问题 白嫖党们先看代码,我就先上上全代码,干! 前言: 为了达到目的,首先自学了栈:按照先进后出的…

抗量子加密:为什么你迫切需要它

作者 | John 翻译| Katie&#xff0c;责编 | 晋兆雨 出品 | AI科技大本营 头图 | 付费下载于视觉中国 第二次世界大战把间谍活动带到了最前线&#xff0c;这是网络安全的先兆&#xff0c;正如现代世界所看到的那样。诸如量子计算机之类的技术进步使我们必须将这场打击网络犯罪的…

量子计算机的加密安全性,公钥加密机制被量子计算机攻破,传统加密方式不再安全...

如今市场上不乏各种加密和解密方案,然而,根据研究人员表示,针对那些仅取决于质因子分解难度的方案已经逐渐不适用了。 根据美国麻省理工学院(MIT)研究学者与奥地利因斯布鲁克大学(University of Innsbruck)原型专家表示,目前所使用的“公钥” (public-key)加密方式最终将被…

10年老台式机4分钟攻破量子加密算法,此前12年无人破解,核心原理来自25年前...

明敏 发自 凹非寺量子位 | 公众号 QbitAI 只花4分钟&#xff0c;就破解了量子加密算法的密钥。 用的还是一台有10年“高龄”的台式机。 完全破解也只需62分钟&#xff0c;CPU单核即可搞定。 两位鲁汶大学学者基于数学理论破解量子加密算法的消息&#xff0c;最近轰动了密码学界…

应用量子数据加密的一些问题

前言 最近有看到一本关于量子科技的书籍&#xff0c;里面对量子计算在信息安全领域的应用提出了以下几个问题&#xff0c;我把它们搬运到CSDN&#xff0c;欢迎大家前来讨论&#xff01; 应用量子数据加密的一些问题 1、人类可以利用量子物理学来创造出绝对安全的通信网络吗&…

量子计算会摧毁区块链和加密货币吗?

2019年&#xff0c;谷歌高调宣布了成功演示“量子霸权”&#xff0c;一个包含53个有效量子比特的处理器“西克莫”&#xff0c;用200秒完成传统超级计算机Summit需1万年解决的问题&#xff0c;着实让人惊叹。可是&#xff0c;“量子霸权”还没有捂热&#xff0c;竞争对手IBM就出…

安全加密 - 加密算法 - 摘要算法 - 秘钥交换协议 - 量子加密

摘要算法&#xff08;单向加密算法&#xff09; 单向加密算法 : 用于提取数据特征码。又称数据摘要算法。 数据摘要算法,比较常见的有: md5, sha256&#xff0c;CRC-32 秘钥交换协议 由Diffie-Hellman算法实现,它其实是两个牛人的名字组合. 叫做Diffie-Hellman协议(或叫算法…

如何保护今日加密数据以抵抗量子攻击?

1. 引言 随着量子计算机的发展&#xff0c;需增强当前加密系统抵抗量子攻击的能力&#xff0c;避免未来的量子计算机解密当今的密文数据。在大量新闻中提及Lattice-based cryptography&#xff08;基于格的密码学&#xff09;。 2. 密码学及数学难题 加密机制的安全在于破解…