MySQL 实现分库分表详解

MySQL 实现分库分表详解

  • 为什么要分库分表
  • 什么是分库分表
  • 分库分表的几种方式
    • 垂直拆分
      • 数据库垂直拆分
      • 表垂直拆分
      • 垂直拆分特点
      • 垂直拆分优缺点
        • 优点
        • 缺点
    • 水平拆分
      • 数据库水平拆分
      • 表水平拆分
      • 水平拆分的其他方式
      • 水平拆分特点
      • 水平拆分优缺点
        • 优点
        • 缺点
  • 分库分表带来的问题
  • 分库分表技术如何选型
    • 开源框架
    • jdbc直连层
    • proxy代理层
    • jdbc直连层和proxy代理层优缺点

为什么要分库分表

如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),主库容量肯定无法满足这么高的Tps,业务越来越大,单表数据超出了数据库支持的容量,持久化磁盘IO,传统的数据库性能瓶颈,产品经理业务·必须做,改变程序,数据库刀子切分优化。数据库连接数不够需要分库,表的数据量大,优化后查询性能还是很低,需要分。

什么是分库分表

分库分表方案是对关系型数据库数据存储和访问机制的一种补充。

  • 分库:将一个库的数据拆分到多个相同的库中,访问的时候访问一个库;
  • 分表:把一个表的数据放到多个表中,操作对应的某个表就行。

分库分表的几种方式

在这里插入图片描述

垂直拆分

数据库垂直拆分

在这里插入图片描述
根据业务拆分,如图,电商系统,拆分成订单库,会员库,商品库。

表垂直拆分

在这里插入图片描述
根据业务去拆分表,如图,把user表拆分成user_base表和user_info表,use_base负责存储登录,user_info负责存储基本用户信息

垂直拆分特点

  • 每个库(表)的结构都不一样
  • 每个库(表)的数据至少一列一样
  • 每个库(表)的并集是全量数据

垂直拆分优缺点

优点
  • 拆分后业务清晰(专库专用按业务拆分)
  • 数据维护简单,按业务不同,业务放到不同机器上
缺点
  • 如果单表的数据量,写读压力大
  • 受某种业务决定,或者被限制,也就是说一个业务往往会影响到数据库的瓶颈(性能问题,如双十一抢购)
  • 部分业务无法关联join,只能通过java程序接口去调用,提高了开发复杂度

水平拆分

数据库水平拆分

在这里插入图片描述
如图,按会员库拆分,拆分成会员1库,会员2库,以userId拆分,userId尾号0-5为1库 6-9为2库,还有其他方式,进行取模,偶数放到1库,奇数放到2库

表水平拆分

在这里插入图片描述
如图把users表拆分成users1表和users2表,以userId拆分,进行取模,偶数放到users1表,奇数放到users2表

水平拆分的其他方式

  1. range来分,每个库一段连续的数据,这个一般是按比如时间范围来的,但是这种一般较少用,因为很容易产生热点问题,大量的流量都打在最新的数据上了,优点:扩容的时候,就很容易,因为你只要预备好,给每个月都准备一个库就可以了,到了一个新的月份的时候,自然而然,就会写新的库了
    缺点:大部分的 请求,都是访问最新的数据。实际生产用range,要看场景,你的用户不是仅仅访问最新的数据,而是均匀的访问现在的数据以及历史的数据

  2. hash分发,优点:可以平均分配每个库的数据量和请求压力 缺点:扩容起来比较麻烦,会有一个数据迁移的这么一个过程

水平拆分特点

  • 每个库(表)的结构都一样
  • 每个库(表)的数据都不一样
  • 每个库(表)的并集是全量数据

水平拆分优缺点

优点
  • 单库/单表的数据保持在一定量(减少),有助于性能提高
  • 提高了系统的稳定性和负载能力
  • 拆分表的结构相同,程序改造较少。
缺点
  • 数据的扩容很有难度维护量大
  • 拆分规则很难抽象出来
  • 分片事务的一致性问题部分业务无法关联join,只能通过java程序接口去调用

分库分表带来的问题

  • 分布式事务;
  • 跨库join查询;
  • 分布式全局唯一id;
  • 开发成本,对程序员要求高。

分库分表需思考3个问题

  • 事务一致性: 比如更新10张表,最后一张失败,怎样保证事务。

  • 字典表问题: 一般字典表维护在一个库中,分库查询的话影响效率,每个库都存储一份字典表的话,上表面提到的事务一致性问题又会出现。库之间也会过于冗余。

  • 分页查询: 比如查询100到110之间的数据,做法可不是每个库取100110间的数据,再去前10条,而是每个库查询0110间的数据,比如10个库,就会返回 10 * 110条数据,再从这里取100~110间的数据。这里的问题就是如果是 500000~500010的话,返回的数据量就太大了。

分库分表技术如何选型

开源框架

目前市面上使用较多的是,mycat及sharding-jdbc。mycat属于中间层代理类中间件、sharding-jdbc属于应用层依赖类中间件。

详细对比

主要指标Sharding-jdbcMycat
ORM支持适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC任意
事务自带XA、两(三)阶段事务、柔性事务BASE(最终一致)XA事务
分库支持支持
分库支持支持
开发集成springboot较好,代码入侵中(需要写些配置类等)开发成本小,代码入侵小
所属公司当当网开源,加入apache基于阿里Cobar二次开发,社区维护
数据库支持支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库Mysql、Oracle、 SQL Server、DB2、mongodb
活跃度活跃度高社区活跃度很高,一些公司已在使用
监控
读写分离支持支持
资料资料少、github、官网、网上讨论贴资料多,github、官网、Q群、书籍
运维维护成本低维护成本高
限制部分JDBC方法不支持、SQL语句限制SQL语句限制
连接池支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等无要求
配置难度一般复杂
  • Atlas:不能实现分布式分表,所有的子表必须在同一台DB的同一个database里且所有的子表必须事先建好,Atlas没有自动建表的功能。
  • Cobar:必须将拆分后的表分别放入不同的库来实现分布式。
  • TDDL:阿里,功能强大,过于复杂,部分开源。需要评估使用情况,防止过剩。
  • Mycat :国内开源,从入门到放弃。
  • heisenberg:百度开源,相对简单,易于管理。
  • Oceanus:功能强大,开源,简化开发和配置成功。但产品还不成熟。
  • vitess:google产品,集群基于ZooKeeper管理,通过RPC方式进行数据处理,可支撑高流量,它还添加了一个连接池,具有基于行的高速缓存,重写SQL查询,更安全。
  • OneProxy:中国厂商产品,稳定性待确认。
  • Sharding-JDBC:当当最新开源,jdbc层面操作。

jdbc 直连层:shardingsphere、tddl proxy
代理层:mycat,mysql-proxy(360)

jdbc直连层

在这里插入图片描述
jdbc直连层又叫jdbc应用层,是因为所有分片规则,所有分片逻辑,包括处理分布式事务 所有这些问题它都是在应用层,所有项目都是由war包构成的,所有分片都写成了jar包,放到了war包里面,java需要虚拟机去运行的,虚拟机运行的时候就会把war包里面的字节文件进行classLoder加载到jvm内存中,所有分片逻辑都是基于内存方进行操作的

proxy代理层

在这里插入图片描述

如图,proxy代理层,所有分片规则,所有分片逻辑,包括处理分布式事务都在mycat写好了,所有分片逻辑都是基于mycat方进行操作

jdbc直连层和proxy代理层优缺点

  • jdbc直连层性能高,只支持java语言,支持跨数据库;
  • proxy代理层开发成本低,支持跨语言,不支持跨数据库。

选型需考虑3个问题:

  1. 产品功能和可扩展性:mycat就是不行。就是名气大,已经到头了。Cobar也是可扩展性的问题放弃的

  2. 产品是否成熟,或者说可用,比如国内的一般就不考虑了,稳定性是个问题。百度的heisenberg其实不错,但是代码很久没有维护了,社区也不积极,就放弃了。google的vitess也可以 ,但是海外的产品,也放弃了。

  3. 实际情况:我们公司是腾讯系的,阿里的TDDL显然不能用了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何让Google快速收录你的页面?

要让Google更快地收录你的网站内容,首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具,如果你的页面质量高且更新频率稳定,那么Google爬虫更可能频繁光顾。通常情况下,通过Google Search Console&…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

【Linux】系统信息和状态命令

步骤 1:显示系统信息 命令: uname -a 1.打开终端。 2.输入命令并按回车键。 3.观察:输出将显示包括内核版本、主机名、硬件架构等在内的系统信息。 步骤 2:显示或设置系统的主机名 命令: hostname 1.打开终端。…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址:https://start.spring.io/ 修改为阿里云Server URL地址:https://star…

获得日志记录之外的新视角:应用程序性能监控简介(APM)

作者:来自 Elastic David Hope 日志记录领域即将发生改变。在这篇文章中,我们将概述从单纯的日志记录到包含日志、跟踪和 APM 的完全集成解决方案的推荐流程。 通过 APM 和跟踪优先考虑客户体验 企业软件开发和运营已成为一个有趣的领域。我们拥有一些非…

Qt之第三方库‌QXlsx使用(三)

Qt开发 系列文章 - QXlsx(三) 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.添加头文件 2.写入数据 3.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用…

Codeforces Round 992 (Div. 2)

传送门:Dashboard - Codeforces Round 992 (Div. 2) - Codeforces A. Game of Division 思路:模拟 AC代码:Submission #295676347 - Codeforces B. Paint a Strip 思路:数学 贪心 放置的位置一定是 1 4 10 22 48 ....…

MySQL并发控制(二):锁

只改一行语句,为什么锁那么多 注1:MySQL后面的版本可能会改变加锁策略, 所以这个规则只限于截止到现在的最新版本, 即5.x系列 注2:因为间隙锁在可重复读隔离级别下才有效, 所以本篇文章接下来的描述&#…

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统,一款基于ThinkPHPLayui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装…

vue的初步使用

一. vue的初步使用 1.引入相关依赖 //<!-- 引入一个vue文件 --><script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script>2. 给出相应的数据 <!DOCTYPE html> <html lang"en"> <head><meta ch…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…

Facebook 人工智能:重塑社交新未来

在数字化迅速发展的今天&#xff0c;人工智能(AI)已经深入了我们的生活&#xff0c;尤其是在社交媒体领域。Facebook作为全球最大的社交平台之一&#xff0c;正利用AI技术&#xff0c;革新其服务和用户体验&#xff0c;为用户打造社交互动的新未来。 首先&#xff0c;人工智能…

Plugin - 插件开发03_Spring Boot动态插件化与热加载

文章目录 Pre方案概览使用插件的好处流程CodePlugin 定义Plugin 实现Plugin 使用方动态加载插件类加载器注册与卸载插件配置文件启动类测试验证 小结 Pre 插件 - 通过SPI方式实现插件管理 插件 - 一份配置&#xff0c;离插件机制只有一步之遥 插件 - 插件机制触手可及 Plug…

从单体到微服务:如何借助 Spring Cloud 实现架构转型

一、Spring Cloud简介 Spring Cloud 是一套基于 Spring 框架的微服务架构解决方案&#xff0c;它提供了一系列的工具和组件&#xff0c;帮助开发者快速构建分布式系统&#xff0c;尤其是微服务架构。 Spring Cloud 提供了诸如服务发现、配置管理、负载均衡、断路器、消息总线…

Flink学习连载文章13--FlinkSQL高级部分

eventTime 测试数据如下&#xff1a; {"username":"zs","price":20,"event_time":"2023-07-17 10:10:10"} {"username":"zs","price":15,"event_time":"2023-07-17 10:10:3…

UnityShaderLab 实现程序化形状(一)

1.实现一个长宽可变的矩形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return (distance(a…

【C++】CUDA线程模型

文章目录 1. 线程模型概述2. 一维线程模型3. 多维线程模型3.1 多维线程模型概述3.2 多维线程模型定义3.3 多维线程模型中的索引 4. 网格和线程块的限制条件 1. 线程模型概述 在CUDA编程中&#xff0c;线程的组织形式是多维的&#xff0c;主要通过网格&#xff08;Grid&#xff…

【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制

在高并发系统中&#xff0c;限流是一项非常重要的技术手段&#xff0c;用于保护后端服务&#xff0c;防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流&#xff0c;以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…

聊聊在应用层面实现内网穿透功能是否可行

前言 最近接手了供方开发的网关项目&#xff0c;交接文档里面有个内网穿透的功能&#xff0c;一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网&#xff0c;这些公网的业务想访问内网的业务&#xff0c;但因为公网和内网没打通&#xff0c;导致…