数据库分区分表

news2025/5/24 5:42:14

分区分表

为什么要分库分表

软件时代,传统应用都有这样一个特点:访问量、数据量都比较小,单库单表都完全可以支撑整个业务。随着互联网的发展和用户规模的迅速扩大,对系统的要求也越来越高。因此传统的MySQL单库单表架构的性能问题就暴露出来了。而有下面几个因素会影响数据库性能:

  • 数据量

MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w-1000w之间性能比较好,超过1000w性能也会下降。

  • 磁盘

因为单个服务的磁盘空间是有限制的,如果并发压力下,所有的请求都访问同一个节点,肯定会对磁盘IO造成非常大的影响。

  • 数据库连接

数据库连接是非常稀少的资源,如果一个库里既有用户、商品、订单相关的数据,当海量用户同时操作时,数据库连接就很可能成为瓶颈。

为了提升性能,所以我们必须要解决上述几个问题,那就有必要引进分库分表,当然除了分库分表,还有别的解决方案,就是NoSQL和NewSQL,NoSQL主要是MongoDB等,NewSQL则以TiDB为代表。

分库分表有垂直切分和水平切分两种。

垂直切分(按照功能模块)

ƒ 将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日志数据库 logDB 等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。

image-20240104194829877

水平切分(按照规则划分存储)

ƒ 当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如 userID 散列,进行划分,然后存储到多个结构相同的表,和不同的库上。

image-20240104194840190

分库分表常用中间件

目前应用比较多的基本有以下几种,

  • TDDL

  • Sharding-jdbc

  • Mycat

  • Cobar

TDDL

淘宝团队开发的,属于 client 层方案。支持基本的 crud 语法和读写分离,但不支持 join、多表查询等语法。

Sharding-jdbc

当当开源的,属于 client 层方案,目前已经更名为 ShardingSphere。SQL 语法支持也比较多,没有太多限制,支持分库分表、读写分离、分布式 id 生成、柔性事务(最大努力送达型事务、TCC 事务)。

Cobar

阿里 b2b 团队开发和开源的,属于 proxy 层方案,就是介于应用服务器和数据库服务器之间。应用程序通过 JDBC 驱动访问 Cobar 集群,Cobar 根据 SQL 和分库规则对 SQL 做分解,然后分发到 MySQL 集群不同的数据库实例上执行。

Mycat

基于 Cobar 改造的,属于 proxy 层方案,支持的功能完善,社区活跃。

常见分表、分库常用策略
  1. 平均进行分配hash(object)%N(适用于简单架构)。

  2. 按照权重进行分配且均匀轮询。

  3. 按照业务进行分配。

  4. 按照一致性hash算法进行分配(适用于集群架构,在集群中节点的添加和删除不会造成数据丢失,方便数据迁移)。

全局ID生成策略
自动增长列

优点:数据库自带功能,有序,性能佳。缺点:单库单表无妨,分库分表时如果没有规划,ID可能重复。

解决方案,一个是设置自增偏移和步长。

  • 假设总共有 10 个分表

  • 级别可选: SESSION(会话级), GLOBAL(全局)

  • SET @@SESSION.autoincrementoffset = 1; ## 起始值, 分别取值为 1~10

  • SET @@SESSION.autoincrementincrement = 10; ## 步长增量

如果采用该方案,在扩容时需要迁移已有数据至新的所属分片。

另一个是全局ID映射表。

  • 在全局 Redis 中为每张数据表创建一个 ID 的键,记录该表当前最大 ID;

  • 每次申请 ID 时,都自增 1 并返回给应用;

  • Redis 要定期持久至全局数据库。

UUID(128位)

在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。

UUID 由4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长。形如:550e8400-e29b-41d4-a716-446655440000。

UUID 的计算因子包括:以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。UUID 是个标准,其实现有几种,最常用的是微软的 GUID(Globals Unique Identifiers)。

  • 优点:简单,全球唯一;

  • 缺点:存储和传输空间大,无序,性能欠佳。

COMB(组合)

组合 GUID(10字节) 和时间(6字节),达到有序的效果,提高索引性能。

Snowflake(雪花) 算法

Snowflake 是 Twitter 开源的分布式 ID 生成算法,其结果为 long(64bit) 的数值。其特性是各节点无需协调、按时间大致有序、且整个集群各节点单不重复。该数值的默认组成如下(符号位之外的三部分允许个性化调整):

image-20240104195415292

  • 1bit: 符号位,总是 0(为了保证数值是正数)。

  • 41bit: 毫秒数(可用 69 年);

  • 10bit: 节点ID(5bit数据中心 + 5bit节点ID,支持 32 * 32 = 1024 个节点)

  • 12bit: 流水号(每个节点每毫秒内支持 4096 个 ID,相当于 409万的 QPS,相同时间内如 ID 遇翻转,则等待至下一毫秒)

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

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

相关文章

探索 Vue 实例方法的魅力:提升 Vue 开发技能(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Spring的bean的生命周期!!!

一.单例模式 单例:[启动容器]--->通过构造方法(创建对象)---->调用set方法(注入)--->调用init方法(初始化)----[容器关闭]----->调用destroy方法(销毁) app…

教你用python画图—Turtle详细教程

Turtle模块绝对是吸引非专业代码开发者人员学习python入门的好工具 通过turtle几行代码的执行软件就会画出漂亮的图形,美观而且有成就感,这样一下子对python编程就产生了兴趣。 这些漂亮的图形如三角形、五角星、机器猫等。在写代码的时候改变几个参数…

反距离加权水平内插,附matlab代码(ERA5和GNSS站点不并址的处理方法之水平补偿)

1.内插方法 我在学习过程,内插方法为反距离加权水平内插,分享我的方法和公式,以及matlab代码。 2.使用该内插法的原因 GNSS与ERA5格网位置不并址,需要进行水平方向和垂直方向的补偿的补偿获得。水平方向不并址如第3节图所示&am…

数字人私人定制

数字人是什么? 在回答这个问题之前,我们先回答另一个问题,人如何与人工智能交流?目前可以通过文字、语音、电脑屏幕、手机屏幕、平板、虚拟现实设备等和人工智能交流,为了得到更好的交流体验,人工智能必然…

css sourcemap 源代码映射

vue.config.js css: {// Enable CSS source maps.sourceMap: process.env.NODE_ENV ! production, }重新运行:yarn serve 效果:

three.js Raycaster(鼠标点击选中模型)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

LiveGBS流媒体平台GB/T28181功能-国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选

LiveGBS功能国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选 1、国标级联2、只看已选3、只看未选4、搭建GB28181视频直播平台 1、国标级联 LiveGBS可以作为下级平台&#xff0c;级联到第三方国标平台&#xff0c;详见&#xff1a; LiveGBS国标GB/T28181流…

dctcp 可扩展、低时延图解

理想 reno 和理想 dctcp 的单流 cwnd-time 演化图如下&#xff1a; 很直观地展现出 dctcp 锯齿小很多&#xff0c;锯齿小意味着高效。 dctcp 利用交换机反馈而来的 ecn 可精确计算导致排队超过 k 的报文比例&#xff0c;减去这一比例的 inflight 就是合适的。但 dctcp 在 re…

快速跳闸中间继电器 RXMS1-RK216 066-AD 24V 柜内安装,板后接线带中座

系列型号 RXMS1 RK 216 437快速跳闸继电器&#xff1b;RXMS1 RK 216 237快速跳闸继电器&#xff1b; RXMS1 RK 216 449快速跳闸继电器&#xff1b;RXMS1 RK 216 249快速跳闸继电器&#xff1b; RXMS1 RK 216 450快速跳闸继电器&#xff1b;RXMS1 RK 216 250快速跳闸继电器&…

5.云原生之DevOps和CICD

文章目录 怎么理解DevOps&#xff1f;所需环境介绍创建devops java项目DockerFile文件Jenkinsfiledevops.yaml文件 搭建 DevOps 项目创建凭证创建devops项目创建流水线编写流线文件运行流线 为流水线设置电子邮箱服务器设置QQ邮箱 SMTP服务器配置jenkins邮箱服务器 使用Webhook…

【C语言数组传参】规则详解

目录 数组传参介绍 数组传参规则 数组传参的实参 特殊情况一&#xff1a;sizeof&#xff08;数组名&#xff09; 特殊情况二&#xff1a;&数组名 数组传参的形参 数组传参使用数组名作为形参接收 形参如果是⼀维数组 形参如果是⼆维数组 数组传参使用指针作为形参…

嵌入式实战(一)| GPIO实验 跑马灯效果实现 寄存器及其代码全解析

文章目录 1 GPIO编程用到的寄存器介绍1.1 PxSEL寄存器1.2 PxDIR寄存器1.3 PxINP寄存器 2 按键消抖2.1 软件消抖 3 经典任务代码解析 硬件图如下 实际上他们在端口命名的时候进行了分组 如上所示&#xff0c;P和点号之间的我认为他就是代表一个组&#xff0c;用某个寄存器控制&…

当hashCode相同时,equals是否也相同?

目录 hashCode方法 equals方法 String类的hashCode和equals 用String为例 当hashCode相同时 总结 在Java中&#xff0c;理解对象的这两个基本方法—hashCode和equals对于编码是至关重要的&#xff0c;尤其是在处理集合类如HashMap和HashSet时。然而&#xff0c;一个常见的…

CV必备的15个多尺度模型分享,涵盖特征融合、多尺度预测等4种网络结构

在卷积神经网络中&#xff0c;感受野的大小会影响到模型能够捕捉到的特征的尺度&#xff0c;从而影响模型的性能。因此我们在设计网络时&#xff0c;需要合理地控制感受野的大小。 那么问题来了&#xff1a;怎样才能合理控制&#xff1f; 到目前为止&#xff0c;已有很多学者…

Leetcode11-快乐数(202)

1、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1…

银行家算法c++

银行家算法 1. 银行家算法1.1 银行算法家的目的1.2 银行算法家的作用2. 设计原理2.1 银行家算法的数据结构2.2 银行家算法介绍2.3 安全性算法 3. 实验要求4. 银行家算法实例5. 完整代码和运行测试5.1 测试结果5.2 完整代码 1. 银行家算法 1.1 银行算法家的目的 银行家算法是避…

奇技淫巧:如何给项目中的RabbitMQ添加总开关

本文主要分享了如何给项目中的RabbitMQ添加总开关&#xff0c;通过简单配置开/关RabbitMQ。 一、需求背景 SpringBoot项目里使用了RabbitMQ&#xff0c;但某些场景下&#xff0c;不希望项目启动时自动检查RabbitMQ连接 例如&#xff1a; 在开发不需要RabbitMQ的功能过程中&…

python的课后练习总结4(for循环)

1&#xff0c;for循环 for 临时变量 in 序列: 重复执行的代码1 重复执行的代码2 ........... 遍历序列 字符串 我是中国人 列表 [‘星期一,星期二,星期三,星期四] 元组 (‘星期一,星期二,星期三,星期四&#xff09; 一&#xff0c;break 终止循环 二&#xff0c;con…

【C初阶——指针2】鹏哥C语言系列文章,基本语法知识全面讲解——指针(2)

崩刃的剑&#xff0c;依旧致命&#xff0c;锈蚀的盾&#xff0c;屹立如初&#xff08;王者荣耀李信&#xff09; 本文由睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff0…