这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~
Posted Java面试那些事儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~相关的知识,希望对你有一定的参考价值。
来源:jianshu.com/p/f81422b1c915
哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号 加星标置顶 ,在此真诚的表示感谢~
正文如下:
# 背景
# 什么是分库分表
# 垂直切分
的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:
![这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~](https://image.cha138.com/20210331/8170a3981d03485ebba10a5c6def2286.jpg)
一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。
# 水平切分
![这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~](https://image.cha138.com/20210331/689c99a826e64581b8613d280a9beea5.jpg)
从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分,不同的数据按照会员 ID 做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID 做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有一定的困难。如何找到合适的分片规则需要综合考虑衡。
几种典型的分片规则包括:
![这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~](https://image.cha138.com/20210331/fee673563230406e8dae20bca6e04f15.jpg)
优点:
# 什么是 Mycat
Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。
# SpringBoot+Mycat+MySQL 实现分表分库案例
步骤一:
步骤二:
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
步骤三:
![这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~](https://image.cha138.com/20210331/303f4cfc69d04f25aa97798bf7c5af18.jpg)
步骤四:
将如下配置复制粘贴覆盖 mycat/conf/schema.xml 的内容。
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema >
<table />
</schema>
<!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->
<dataNode />
<dataNode />
<!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
<dataHost >
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="127.0.0.1:3306" user="root" password="WolfCode_2017"/>
</dataHost>
</mycat:schema>
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule >
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function >
<!-- how many data nodes -->
<property >2</property>
</function>
</mycat:rule>
<property >2</property>: 这里配置了我们有拆分了多个库 (表),需要和前面配置<table />中的 dataNode 个数一致,否则会出错.
步骤五:
每个库中执行如下建表语句:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
步骤六:
步骤七:
https://github.com/javalanxiongwei/springboot-mycat
搭建 SpringBoot 环境,执行插入语句.
application.properties配置如下:
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.url=jdbc:mysql://192.168.142.129:8066/TESTDB
public interface UserMapper {
"insert into user(id,name) value (#{id},#{name})") (
int insert(User user);
"select * from user") (
List<User> selectAll();
}
public class UserController {
private UserMapper userMapper;
public String save(User user){
userMapper.insert(user);
return "保存成功";
}
public List<User> list(){
return userMapper.selectAll();
}
}
步骤八:
在地址栏输入: http://localhost:8080/user/save?id=1&name=tom
http://localhost:8080/user/save?id=2&name=jack
id 为 1 的数据插入到数据库 db02 中的 user 表。
id 为 2 的数据插入到数据库 db01 中的 user 表。
http://localhost:8080/user/list
是可以看到刚刚插入的两条记录.
热门推荐:
![这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~](https://image.cha138.com/20210331/a55ee817c2314ec39ad397a26d37b1e1.jpg)
以上是关于这个教程不错!用数据库中间件Mycat+SpringBoot实现分库分表~的主要内容,如果未能解决你的问题,请参考以下文章