分库分表原理

news2024/11/27 5:30:13

一、数据库瓶颈

会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。

  1. IO瓶颈-分库和垂直分表
    • 磁盘IO瓶颈,热点数据太多,数据库缓存放不下,每次查询会产生大量的IO(分库和垂直分表)。
    • 网络IO瓶颈,请求数据太多,网络带宽不够(分库)。
  2. CPU瓶颈-分摊给业务和水平分表
    • SQL问题:包含join、groupby、 order by,非索引字段条件查询等,增加CPU运算的操作(优化SQL,建立合适的索引,再业务层进行业务计算)。
    • 单表数据多,查询扫描的行太多,SQL效率低(水平分表)。

分库分表

1、水平分库( 并发量高 )

以字段为依据(用户取模、订单来源),按一定策略(hash、range等),将一个库中的数据拆分到多个库中。

场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没 有明显的业务归属来垂直分库。

2、水平分表( 单表数据大 )

类似分库,就是把库换成表。每个表结构都一样,每个表数据都不一样,所有表的并集是全量数据。

场景:并发量没有上来,只是单表的数据量太多,影响了单次SQL执行效率。

3、垂直分库( 并发量高、服务化 )

按照业务归属不同,将不同的表拆分到不同的库中。每个库的结构都不一样,数据也不一样。

场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。

4、垂直分表( 利于缓存数据行 )

按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

场景:并发量没有上来,表记录不多,但字段多,单行数据所需的存储空间较大。导致缓存的数据行减少,查询会产生大量的随机读IO(如列表页–热点数据和详情页–非热点数据)。

备注:分表后不要用join,因为不仅会增加CPU负担并会将两个表捆绑在一起(不能分布部署 )。尽量在业务层获取每个表数据,然后用关联字段拼接。

三、分库分表工具

Sharding-sphere [Sharding-JDBC](当当)、TSharding(蘑菇街)、Atlas(奇虎360)、Cobar(阿里巴巴)、MyCat(基于Cobar)、Oceanus(58同城)和Vitess(谷歌)

注:工具的利弊,请自行调研,官网和社区优先。

四、分库分表步骤

根据容量(当前和增长量)评估分库或分表个数–>选key–>分配规则(hash或range)–>执行(双写)–>扩容问题(尽量减少数据的移动)。

五、分库分表问题

1、非partition key的查询问题

在这里插入图片描述

备注:基因法关于user_id的xbit基因(如分8张表,2^3=8),故x取3,即3bit基因。根据user_id查询时直接取模路由到对应的分库或分表。

根据user_name查询,先通过user_name_code生成函数生成code,然后对其取模路由到对应的分库分表。id生成常用snowflake算法。
在这里插入图片描述
后台除了partition key还有各种非partition key组合条件查询:Nosql法(推荐)后台与前端共享数据库与ES、冗余法(mq做桥梁)运营后台与前端数据库分离。

2、非partition key跨库跨表分页查询问题( ES解决 )

基于水平分库分表,拆分策略常用hash法。

3、扩容问题

水平扩容库(升级从库法)

在这里插入图片描述
水平扩容表(双写迁移法)

在这里插入图片描述

  1. 修改应用配置和代码,加上双写,部署
  2. 将老库中的老数据复制到新库中;
  3. 以老库为准校对新库中的老数据;
  4. 修改应用配置和代码,去掉双写,部署。

备注:双写是通用方案。

六、分库分表总结

  • 分库分表,首先要知道瓶颈在哪里,然后才能合理地拆分(分库还是分表?水平还是垂直?分几个)。
  • 选key很重要,既要考虑到拆分均匀,也要考虑到非partition key地查询。
  • 只要能满足需求,拆分规则越简单越好。

七、分库分表示例( Sharding-JDBC )

代码

上手优惠

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

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

相关文章

探索测试的一些总结

1)探索性测试与脚本化测试的主要区别:1)探索性测试将更多更高的认知水平的工作放在测试执行,而脚本化测试则更关注测试设计;2)前者更强调测试活动的并行和相互反馈(学习、设计、执行与结果分析等),而后者的测试活动是相对串行的。 2)脚本化测…

Grafana系统的备份、恢复、迁移

Grafana系统的备份、恢复、迁移 1. 备份Grafana相关数据 首先先关闭Grafana服务(systemctl stop grafana-server),到目录下备份以下文件或者目录: 备份grafana目录中的grafana.db(一般情况下路径:/var/l…

电子技术——数字IC技术,逻辑电路和设计方法

电子技术——数字IC技术,逻辑电路和设计方法 在我们之前的学习中,我们学习了CMOS技术,然而CMOS技术并不是唯一的数字逻辑技术,因此,本节系统的介绍当今使用的数字技术和逻辑电路族。 数字IC技术和逻辑电路族 逻辑电…

k8s--services(微服务)

文章目录一、k8s网络通信service和iptables的关系二、services1.简介2.默认3.IPVS模式的service4.clusterip5.headless6.从外部访问service的三种方式(1)nodeport(2)loadbalancer7.metallb一、k8s网络通信 k8s通过CNI接口接入其他…

tf_nndistancen 安装

为了评估MMD,断断续续装了4天,踩了几乎所有的坑,终于装上了QAQ 1. 库链接:pointnet-autoencoder/tf_ops/nn_distance at master charlesq34/pointnet-autoencoder GitHub 2. 安装TensorFlow,我的环境是cuda 11.5 ,…

【Go】用Go在命令行输出好看的表格

用Go在命令行输出好看的表格前言正文生成Table表头设置插入行表格标题自动标号单元格合并列合并行合并样式设置居中设置数字自动高亮标红完整Demo代码结语前言 最近在写一些运维小工具,比如批量进行ping包的工具,实现不困难,反正就是ping&am…

java(Class 常用方法 获取Class对象六种方式 动态和静态加载 类加载流程)

ClassClass常用方法获取Class对象六种方式哪些类型有Class对象动态和静态加载类加载流程加载阶段连接阶段连接阶段-验证连接阶段-准备连接阶段-解析初始化阶段获取类结构信息Class常用方法 第一步:创建一个实体类 public class Car {public String brand "宝…

mysql数据库innodb存储引擎之事务原理

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作要求,即这些操作要么同时成功,要么同时失败。 四大特性: redo log和undo log:一致性、原子性…

Map和Set总结

Map和Set Map和Set是专门用来进行搜索的数据结构,适合动态查找 模型 搜索的数据称为关键字(key),关键字对应的叫值(value),key-value键值对 key模型key-value模型 Map存储的就是key-value模型,Set只存储了key Map Map是接口类…

ES增量同步方案

1 基于业务代码嵌入式的增量同步方式在Java业务代码要修改业务数据的地方,增加调用写入ES数据的方法优点:1、实现方式简单,可控粒度高;2、不依赖第三方数据同步框架;3、数据库不用做特殊配置和部署;缺点&am…

Qt学习_10_纯Ui操作_设置窗口、菜单栏、工具栏、按钮的图标

前言 Qt项目,如果功能少,项目小,用代码来配置图标的方式问题不大,无可厚非。但是一旦项目的功能复杂内容很多,用代码来配置图标的方式就显得很冗余,能在ui设计界面完成的工作,尽量就在ui设计界…

人工智能实验一:使用搜索算法实现罗马尼亚问题的求解

1.任务描述 本关任务: 了解有信息搜索策略的算法思想;能够运用计算机语言实现搜索算法;应用A*搜索算法解决罗马尼亚问题; 2.相关知识 A*搜索 算法介绍 A*算法常用于 二维地图路径规划,算法所采用的启发式搜索可以…

66 - 进程互斥锁的应用示例

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)深入浅出操作系统 - 目录 文章目录1. 简单生产消费者问题1.1 具体问题描述1.2 解决方案1.3 简单生产消费者问题模型1.4 编程实验:生产消费者示例2. 多任务读写问题&a…

中国人民大学与加拿大女王大学金融硕士,让这一年有一个骄傲的句号

在中国人民大学与加拿大女王大学金融硕士项目就读的同学,都有一个共同的目标,那就是在就读的这一年能画上一个圆满的句号。当拿到毕业证书的那一刻,所有的付出和努力都是值得的,在这里学习提升各自理论知识与金融服务经验&#xf…

学生信息表

目录 一、功能说明 二、核心思想 三、所用知识回顾 四、基本框架 五、js功能实现部分 一、功能说明 (1)输入对应的信息,点击录入可以为下面的表格添加一条记录,注意当所填信息不完整时不允许进行提交。 (2&…

高校如何通过校企合作/实验室建设来提高大数据人工智能学生就业质量

高校人才培养应该如何结合市场需求进行相关专业设置和就业引导,一直是高校就业工作的讨论热点。亘古不变的原则是,高校设置不能脱离市场需求太远,最佳的结合方式是,高校具有前瞻性,能领先市场一步,培养未来…

解决win10的过度保护导致文件下载不了程序不能打开运行

win7看来大概是要离我们远去了,虽然我们还能看见她的背影,但大势所趋,我们也只能慢慢的接受win10进入到我们的日常生活。但win10很多时候过度的保护却给我们带来了不便。这里列举两个最常见的问题,当然我这里也给出了解决方案。 文…

无线网络渗透测试系列学习(二) - 在VMware中搭建Metasploit靶机的详细步骤以及端口的简单了解

引言: 无线网络渗透测试系列学习目录: 无线网络渗透测试系列学习(一) - 在Windows系统下使用虚拟机安装Kali Linux操作系统 在上一篇文章中我们讲解了在Windows下如何在VMware虚拟机中安装Kali Linux操作系统和对Kali的简单配置…

vue项目部署到IIS

项目打包 vue 部署包: 项目路径运行npm run build 运行后生成一个dist文件夹,把这个文件夹放到要部署的服务器 IIS 配置 程序 需要用到下面这两个程序进行配置: 如果 IIS 没有 Web平台安装程序(上图管理模块第二个&#x…

3月12日 植树节 Arbor Day / Planting Trees Day

"植树节“是一些国家为防止森林过度开伐,激发人们爱林、造林的感情而设立的法定节日。Arbor Day is one day in the year that prevents deforestation,celebrates trees and promotes planting.春天是植树的时间。Spring is the prime time for planting tree…