SpringBoot 整合mycat分库、分表

背景
系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。其前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。

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

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

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

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

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

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

拆分后业务清晰,拆分规则明确;
系统之间整合或扩展容易;
数据维护简单。
缺点:

部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度;
受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高;
事务处理复杂。
由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶颈,所以就需要水平拆分来做解决。

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

优点 :
拆分规则抽象好,join 操作基本可以数据库做;
不存在单库大数据,高并发的性能瓶颈;
应用端改造较少;
提高了系统的稳定性跟负载能力。
缺点 :

拆分规则难以抽象;
分片事务一致性难以解决;
数据多次扩展难度跟维护量极大;
跨库 join 性能较差
实例如下:
1、下载、安装mycat,http://dl.mycat.io/ 根据需要下载
2、配置mycat/conf/server.xml

3、配置mycat/conf/schema.xml
在这里插入图片描述

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

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

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

:真实的数据库的地址配置

:用户心跳检测

:写库的配置

4、配置mycat/conf/rule.xml
在这里插入图片描述

这里定义的是切分规则,是按照id列进行切分,切分规则是采取取模的方式,
2:这里配置了我们有拆分了多个库(表),需要和前面配置

中的dataNode个数一致,否则会出错.

5、在数据库中创建两个数据库db01,db02

6、启动:进入/mycat/bin目录,./mycat start 进行启动

7、创建springboot项目
8、配置application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

     #这里配置的是Mycat中server.xml中配置账号密码,不是数据库的密码。
     spring.datasource.username=root
     spring.datasource.password=123456
     #mycat的逻辑库 端口也是mycat的
     spring.datasource.url=jdbc:mysql://127.0.0.1:8066/TESTDB

9、XXXMapper.java

------------------------------------------------------------------------------------- 单库分表 -----------------------------------------------------------------------

建议大家选择 1.6.5 版本,毕竟是比较稳定的版本,且 1.6.5 版本 才开始支持单库分表

一、配置

  1. 修改 server.xml
    mycat 代理数据库配置。
    Mycat的配置文件,设置账号、参数等.
123456 TESTDB

设置user name,password及schemas;
name和password在连接代理数据库Mycat时使用;
schemas是逻辑库,要和schema.xml里的 schema name 对应。

2.修改schema.xml
mycat逻辑数据库、表,到mysql物理数据库、表的映射关系。
Mycat对应的物理数据库和数据库表的配置.

<?xml version="1.0"?>

<mycat:schema xmlns:mycat=“http://io.mycat/”>








select user()






</mycat:schema>

schema name 要和server.xml对应上,
user表设置分表3张 (city_1, city_2, city_3),只设置一个 datanote(即一个物理数据库服务),
rule采用取模模式mod-long。
writeHost 和 readHost设为同一数据库。

3.修改 rule.xml
Mycat分片(分库分表)规则.

id mod-long 3

此次选用默认的mod-long规则,只需修改count数.
修改property count 等于3(默认值即为3,如果你需要分出更多的表,在此进行修改为你的分表数)。

这样,配置就已经完成了

二、建库建表
先在MySQL库上,建数据库mydb,并在此数据库中建4张表,city、city_1、city_2、city_3,且四张表结构相同。表中字段为id, country, name, state。

CREATE TABLE city (
id int(11) NOT NULL AUTO_INCREMENT,
country varchar(50),
name varchar(50),
state varchar(50),
PRIMARY KEY (id)
);

三、启动mycat
进入mycat/bin 目录

cd …/bin
1
启动:

./mycat start
1
查看启动状态:

./mycat status
1
停止:

./mycat stop
1
重启(改变上面的xml配置不用重启,管理端可以重新载入):

./mycat restart
1
查看logs/下的wrapper.log和mycat.log可以查看运行时问题和异常。
mycat启动日志:

cat ./logs/wrapper.log
1
mycat 应用日志:

cat ./logs/mycat.log

四、springboot配置
连接mycat, 端口:8066,账号:zzti, 密码:123456
使用你在 server.xml文件中配置的用户名和密码:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#这里配置的是Mycat中server.xml中配置账号密码,不是数据库的密码。
spring.datasource.username=root
spring.datasource.password=123456
#mycat的逻辑库 端口也是mycat的
spring.datasource.url=jdbc:mysql://127.0.0.1:8066/TESTDB

五、springboot使用
在这里插入图片描述

六、分页查询
1、

com.github.pagehelper
pagehelper-spring-boot-starter
1.2.5

2、代码实现
public PageInfo selectPageQuery(int page, int rows) {
PageHelper.startPage(page,rows);//分页参数放在查询的前一行
List list = this.studentMapper.selectPageQuery();
//System.out.println(list);
PageInfo PageInfo = new PageInfo(list);//将查询结果组装成分页格式
return PageInfo;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值