SpringBoot集成MyCat实现分库分表

Mycat

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

Mycat关键特性

支持SQL92标准
支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
基于Nio实现,有效管理线程,解决高并发问题。
支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
支持多租户方案。
支持分布式事务(弱xa)。
支持XA分布式事务(1.6.5)。
支持全局序列号,解决分布式下的主键生成问题。
分片规则丰富,插件化开发,易于扩展。
强大的web,命令行监控。
支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支持密码加密
支持服务降级
支持IP白名单
支持SQL黑名单、sql注入攻击拦截
支持prepare预编译指令(1.6)
支持非堆内存(Direct Memory)聚合计算(1.6)
支持PostgreSQL的native协议(1.6)
支持mysql和oracle存储过程,out参数、多结果集返回(1.6)
支持zookeeper协调主从切换、zk序列、配置zk化(1.6)
支持库内分表(1.6)
集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

更多信息可以访问官方网站。项目中需要下载的server也是从官网上下载的,版本是1.6-RELEASE,Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz,上传到服务器使用。

准备工作

将mycat安装在106服务器上,mysql在105服务器。
1、下载并解压
从官网下载 Mycat,http://dl.mycat.org.cn/1.6-RELEASE/ 我们是基于 CentOS7 来搭建 Mycat 环境的,所以下载版本:
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

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

<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">  

    <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->  
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">  
    
      <!-- user是表名,dataNode与下方对应,rule中的值需要与rule.xml中配置的保持一致  -->   
      <table name="user" primaryKey="id"  dataNode="node_db01,node_db02" rule="role1" />  

    </schema>  

    <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->  
    <dataNode name="node_db01" dataHost="dataHost01" database="db01" />  
    <dataNode name="node_db02" dataHost="dataHost01" database="db02" />  

    <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
    <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
            <heartbeat>select user()</heartbeat>  
            <writeHost host="server1" url="192.168.1.105:3306" user="root" password="Root1234"/>  
    </dataHost>  
</mycat:schema>

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

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="role1">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">2</property>
    </function>
</mycat:rule>

这里定义的是切分规则,是按照id列进行切分,切分规则是采取取模的方式。property 中的2代表的是库表个数,与上面的dataNode 个数一致。

3、创建数据库和表
分别创建两个数据库,每个数据库建一个user表。

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

4、启动mycat
启动 mycat, 进入mycat的bin目录下,执行./mycat start,然后可以查看mycat使用情况。
在这里插入图片描述

使用mysql连接工具,连接mycat。
在这里插入图片描述

SpringBoot整合

1、创建SpringBoot项目并且引入相关依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2、修改配置信息

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://192.168.1.106:8066/TESTDB

3、创建示例
User:

@Data
@Getter
@Setter
public class User {
    private Long id;
    private String name;
}

UserService:

@Mapper
public interface UserService {
    @Insert("insert into user(id,name) value (#{id},#{name})")
    int insert(User user);
    @Select("select * from user")
    List<User> selectAll();
}

UserController:

@RestController
@RequestMapping("/user")
public class UserController {
        @Autowired
        private UserService userService;
        @RequestMapping("/save")
        public String save(User user){
            userService.insert(user);
            return "保存成功";
        }
        @RequestMapping("/list")
        public List<User> list() {
            return userService.selectAll();
        }
}

4、测试启动
使用postman发送请求,分别请求save和list。
http://localhost:8080/user/save,分别将id从0-3,请求四次后查询数据库:
在这里插入图片描述
在这里插入图片描述
发现0和2落第一个库,1和3落库到第二个数据库,达到了分库分表的效果。

然后执行list请求,查看结果:
在这里插入图片描述
将不同数据库的数据全部查询出来,也达到了分库分表的效果。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值