广告
返回顶部
首页 > 资讯 > 精选 >怎么用数据库中间件Mycat+SpringBoot完成分库分表
  • 944
分享到

怎么用数据库中间件Mycat+SpringBoot完成分库分表

2023-06-16 13:06:48 944人浏览 八月长安
摘要

这篇文章主要讲解了“怎么用数据库中间件Mycat+SpringBoot完成分库分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用数据库中间件Mycat+springBoot完成分库分表

这篇文章主要讲解了“怎么用数据库中间件Mycat+SpringBoot完成分库分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用数据库中间件Mycat+springBoot完成分库分表”吧!

一、背景

随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘、io、系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进行拆分,从而更好的提供数据服务。

当用户表达到千万级别,在做很多操作的时候都会很吃力,所以当数据增长到1000万以上就需要分库分表来缓解单库(表)的压力。

二、什么是分库分表[1]

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。

水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身就较根据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。

三、垂直切分 [1]

个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

怎么用数据库中间件Mycat+SpringBoot完成分库分表

系统被切分成了,用户,订单交易,支付几个模块。一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。

但是往往系统之有些表难以做到完全的独立,存在这扩库  join  的情况,对于这类的表,就需要去做平衡,是数据库让步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用。在系统初期,数据量比较少,或者资源有限的情况下,会选择共用数据源,但是当数据发展到了一定的规模,负载很大的情况,就需要必须去做分割。

一般来讲业务存在着复杂 join 的场景是难以切分的,往往业务独立的易于切分。如何切分,切分到何种程度是考验技术架构的一个难题。下面来分析下垂直切分的优缺点:

优点

拆分后业务清晰,拆分规则明确;

系统之间整合或扩展容易;

数据维护简单。

缺点

部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度;

受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高;

事务处理复杂。

由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶颈,所以就需要水平拆分来做解决。

四、水平切分 [1]

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:

怎么用数据库中间件Mycat+SpringBoot完成分库分表

拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如:从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分,不同的数据按照会员  ID 做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID  做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有一定的困难。如何找到合适的分片规则需要综合考虑衡。几种典型的分片规则包括:

按照用户 ID 求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中;

按照日期,将不同月甚至日的数据分散到不同的库中;

按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。

如图,切分原则都是根据业务找到适合的切分规则分散到不同的库,下面用用户 ID 求模举

怎么用数据库中间件Mycat+SpringBoot完成分库分表

既然数据做了拆分有优点也就优缺点。

优点

拆分规则抽象好,join 操作基本可以数据库做;

不存在单库大数据高并发的性能瓶颈;

应用端改造较少;

提高了系统的稳定性跟负载能力。

缺点

拆分规则难以抽象;

分片事务一致性难以解决;

数据多次扩展难度跟维护量极大;

跨库 join 性能较差

五、什么是Mycat

它是一个开源分布式数据库系统,是一个实现了  MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 Mysql 客户端工具和命令行访问,而其后端可以用mysql  原生(Native)协议与多个 Mysql 服务器通信,也可以用 JDBC  协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。

常见应用场景:

单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;

分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片;

多租户应用,每个应用一个库,但应用程序只连接 Mycat,从而不改造程序本身,实现多租户化;

报表系统,借助于 Mycat 的分表能力,处理大规模报表的统计; 替代 HBase,分析大数据;

作为海量数据实时查询的一种简单有效方案,比如 100 亿条频繁查询的记录需要在 3 秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时 Mycat 可能是最简单有效的选

六、SpringBoot+Mycat+MySQL实现分表分库案例

关于分库分表,Mycat已经帮我们在内部实现了路由的功能,我们只需要在Mycat中配置以下切分规则即可,对于开发者来说,我们就可以把Mycat看做是一个数据库,接下来我们开始搭建环境:

步骤一:

Mycat是使用java写的数据库中间件,所以要运行Mycat前要准备要jdk的环境,要求是jdk1.7以上的环境。所以需要在系统中配置JAVA_HOME的环境变量.

步骤二:

从官网下载Mycat,Http://dl.mycat.io/1.6-RELEASE/我们是基于Centos7来搭建Mycat环境的,所以下载版本:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

步骤三:

将下载好的安装包上传到服务器上并解压.解压之后目录结构如下:

怎么用数据库中间件Mycat+SpringBoot完成分库分表

步骤四:

配置切分规则:将如下配置复制粘贴覆盖mycat/conf/schema.xml的内容。

<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">     <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">            <table name="user" primaryKey="id" datanode="dn01,dn02" rule="rule1" />      </schema>        <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->      <dataNode name="dn01" dataHost="dh01" database="db01" />      <dataNode name="dn02" dataHost="dh01" database="db02" />          <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->      <dataHost name="dh01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">              <heartbeat>select user()</heartbeat>              <writeHost host="server1" url="127.0.0.1:3306" user="root" passWord="WolfCode_2017"/>      </dataHost> </mycat:schema>

<schema>:表示的是在mycat中的逻辑库配置,逻辑库名称为:TESTDB

<table>:表示在mycat中的逻辑表配置,逻辑表名称为:user,映射到两个数据库节点dataNode中,切分规则为:rule1(在rule.xml配置)

<dataNode>:表示数据库节点,这个节点不一定是单节点,可以配置成读写分离.

<dataHost>:真实的数据库的地址配置

<heartbeat>:用户心跳检测

<writeHost>:写库的配置

将如下配置复制粘贴覆盖mycat/conf/rule.xml的内容。

怎么用数据库中间件Mycat+SpringBoot完成分库分表

这里定义的是切分规则,是按照id列进行切分,切分规则是采取取模的方式,<property  name="count">2</property>:这里配置了我们有拆分了多个库(表),需要和前面配置<table  name="user" primaryKey="id" dataNode="dn01,dn02" rule="rule1"  />中的dataNode个数一致,否则会出错.

步骤五:

在数据库中创建两个数据库db01,db02.每个库中执行如下建表语句:

CREATE TABLE `user` (  `id` bigint(20) NOT NULL,  `name` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤六:

启动mycat,执行mycat/bin/startup_nowrap.sh

步骤七:

项目已经上传到GitHubhttps://github.com/javalanxiongwei/springboot-mycat搭建SpringBoot环境,执行插入语句.application.properties配置如下:

怎么用数据库中间件Mycat+SpringBoot完成分库分表

步骤八:

测试:在地址栏输入:http://localhost:8080/user/save?id=1&name=tomhttp://localhost:8080/user/save?id=2&name=jack查看数据库发现:id为1的数据插入到数据库db02中的user表。id为2的数据插入到数据库db01中的user表。在地址栏输入:http://localhost:8080/user/list是可以看到刚刚插入的两条记录.

好到这一步,我们就已经完成了分表分库了。

感谢各位的阅读,以上就是“怎么用数据库中间件Mycat+SpringBoot完成分库分表”的内容了,经过本文的学习后,相信大家对怎么用数据库中间件Mycat+SpringBoot完成分库分表这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么用数据库中间件Mycat+SpringBoot完成分库分表

本文链接: https://www.lsjlt.com/news/283801.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用数据库中间件Mycat+SpringBoot完成分库分表
    这篇文章主要讲解了“怎么用数据库中间件Mycat+SpringBoot完成分库分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用数据库中间件Mycat+SpringBoot完成分库分表...
    99+
    2023-06-16
  • 数据库中间件MyCat的示例分析
    这篇文章主要为大家展示了“数据库中间件MyCat的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中间件MyCat的示例分析”这篇文章吧。1、Myc...
    99+
    2022-10-18
  • Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用
    一、MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL) 2....
    99+
    2016-10-09
    Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用
  • 如何进行数据库中间件 MyCAT 源码分析
    这篇文章将为大家详细讲解有关如何进行数据库中间件 MyCAT 源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 概述可能你在看到这个标题会小小的吃...
    99+
    2022-10-19
  • 数据库中间件 MyCAT 源码分析 —— 调试环境搭建
    关注**微信公众号:【芋艿的后端小屋】**有福利:RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表RocketMQ / MyCAT / Sharding-JD...
    99+
    2022-10-18
  • mysql数据库中怎么利用mycat实现读写分离
    这期内容当中小编将会给大家带来有关mysql数据库中怎么利用mycat实现读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、部署mycat下载 [root@myc...
    99+
    2022-10-18
  • 怎么在springboot中使用shardingjdbc实现分库分表
    这篇文章给大家介绍怎么在springboot中使用shardingjdbc实现分库分表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概览1.1 简介ShardingSphere-JDBC定位为轻量级 Java 框架...
    99+
    2023-06-15
  • 怎么在MySQL数据库中实现分表分库操作
    这篇文章将为大家详细讲解有关怎么在MySQL数据库中实现分表分库操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。分表分库垂直拆分垂直拆分就是要把表按模块划...
    99+
    2022-10-18
  • SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表
    小编给大家分享一下SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、水平分割1、水平分库1)、概念:以字段为依据,按照一定策略,将一个库中的数据...
    99+
    2023-06-02
  • Mysql数据库中的分库分表怎么利用MyBatis来实现
    本篇文章给大家分享的是有关Mysql数据库中的分库分表怎么利用MyBatis来实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyBatis实现分表最简单步骤我们模拟用户表数...
    99+
    2023-05-31
    mybatis mysql
  • 数据库中在什么情况下需要用分库分表
    这篇文章主要介绍数据库中在什么情况下需要用分库分表,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据量在什么情况下需要分表?为了保证数据库的查询效率,当数据达成一定量时建议进行分表操作1、oracle当oracle单...
    99+
    2023-06-14
  • Java数据库读写分离中的数据库中间件DBProxy是怎样的
    Java数据库读写分离中的数据库中间件DBProxy是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言碎语好久没更博了,今天引用美团技术团队的一篇文章来...
    99+
    2023-06-17
  • 怎么理解数据库移动分区表和分区索引的表空间
    这篇文章主要介绍“怎么理解数据库移动分区表和分区索引的表空间”,在日常操作中,相信很多人在怎么理解数据库移动分区表和分区索引的表空间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-19
  • 怎么在MySQL中分表分库时对数据进行切分
    今天就跟大家聊聊有关怎么在MySQL中分表分库时对数据进行切分,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的...
    99+
    2023-06-14
  • 怎么使用PHP实现MongoDB数据库分表
    本篇内容介绍了“怎么使用PHP实现MongoDB数据库分表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、MongoDB数据库简介在介绍M...
    99+
    2023-07-06
  • 数据库中PARTITION BY分组怎么用
    小编给大家分享一下数据库中PARTITION BY分组怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我在自己的SCHEMA...
    99+
    2022-10-19
  • DDM实践系列丨分布式数据库中间件使用经验分享
    最近公司新项目使用了华为云的DDM分布式数据库中间件服务,通过一段的时间的使用感觉还不错。近段时间发现有许多小伙伴也准备去使用这个服务,所以为大家分享一下使用创建DDM服务的经验,帮助小伙伴们少走弯路。 首先在使用创建DDM实例的时候小伙...
    99+
    2021-05-23
    DDM实践系列丨分布式数据库中间件使用经验分享 数据库入门 数据库基础教程 数据库 mysql
  • go语言数据库中间件怎么使用
    Go语言数据库中间件的使用方法有以下几个步骤:1. 引入数据库驱动包:根据所选中间件的类型,引入对应的数据库驱动包。例如,如果选择使...
    99+
    2023-10-20
    go语言 数据库
  • 数据库中怎么将一个普通表转换为分区表
    这篇文章给大家分享的是有关数据库中怎么将一个普通表转换为分区表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.1  BLOG文档结构图 1.2  ...
    99+
    2022-10-18
  • SQL Server 2008数据库中怎么分配用户
    这期内容当中小编将会给大家带来有关SQL Server 2008数据库中怎么分配用户,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1,使用管理员帐号登录到SqlServe...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作