一文带你深入浅出Mycat分库分表

What is Mycat?

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品
功能特性

• 支持 SQL 92标准
• 支持Mysql集群,可以作为Proxy使用
• 支持JDBC连接多数据库
• 支持NoSQL数据库
• 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群
• 自动故障切换,高可用性
• 支持读写分离,支持Mysql双主多从,以及一主多从的模式
• 支持全局表,数据自动分片到多个节点,用于高效表关联查询
• 支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询
• 支持一致性Hash分片,有效解决分片扩容难题
• 多平台支持,部署和实施简单
• 支持Catelet开发,类似数据库存储过程,用于跨分片复杂SQL的人工智能编码实现,143行Demo完成跨分片的两个表的JION查询。
• 支持NIO与AIO两种网络通信机制,Windows下建议AIO,Linux下目前建议NIO
• 支持Mysql存储过程调用
• 以插件方式支持SQL拦截和改写
• 支持自增长主键、支持Oracle的Sequence机制

Mycat 的安装

下载地址:http://dl.mycat.io/

下载完,进入conf中配置更改schema.xml,server.xml。

配置文件介绍

schema.xml 配置schema、datanode、datahost
schema就是逻辑数据库,它包含table(逻辑表),表中有对应的datanode、分片规则
datanode,就是逻辑数据库,含有物理数据库名字
datahost,就是物理数据库的ip地址,用户名、密码等
server.xml 配置连接mycat的用户名、密码、数据库名
rule.xml 分片规则

修改mycat_home\conf\schema.xml中的url、user、password
image.png
修改mycat_home\conf\server.xml 中的user,mycat 的连接用户信息
image.png

更改完后,进入bin目录运行:

mycat install
mycat start 

登录物理数据库,创建db1、db2、db3

mysql -u[username] -p -P3306

create database db1;
create database db2;
create database db3;

客户端连接mycat,注意连接的是mycat而不是物理数据库,mycat默认端口号8066

mysql -u[username] -p -P8066

如若在schema.xml配置了dataNode数据节点信息,记得先连接mysql创建相应的数据库。
避免出现(Invalid datasource)的错误。

创建成功,连接mycat进行操作,mysql默认端口8066。

mysql -uroot -proot -P8066

使用Mycat实现分库分表

配置schema.xml,添加一个user的表

<?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="dn1,dn2,dn3" rule="rule10" />  
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <writeHost host="hostM1" url="127.0.0.1:3306" user="root"
                       password="root">
            </writeHost>
    </dataHost>
</mycat:schema>

接着配置rule.xml文件
在已有配置的基础上,添加

<tableRule name="rule10">
        <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">3</property>
</function>

默认function name为mod-long是已有的了,设置了3个分片,对应schema.xml中配置的三个数据源。
接着进入mycat,创建user表,这里随便建了一个,忽略了主键等

create table `user`(
    `id` bigint(20) NOT NULL,
    `age` int not null,
    `password` varchar(20) not null,
    `user_name` varchar(20) not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

可以通过explain看到,它分别向3个数据源都添加了表。

接着用SpringBoot连接Mycat 查看添加效果。
使用Mybatis进行操作,操作不变,只是mysql连接需要更新为mycat连接,

spring.datasource.open-plat-form-data.url=jdbc:mysql://127.0.0.1:8066/TESTDB?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC

接着使用API添加三条数据

添加成功后,三条数据分别存放在3个分片中,达到分库分表的效果。


同时,当你查询时,mycat会自动帮你去查询3个分片,并进行汇总返回,如下:

至此,基于mycat的分库分表简单实践就结束啦,还是很简单的,但是要真正用好,还不是一件很容易的事,因为mycat也存在着很多局限,预知如何可见后文分晓

上面的完整源码以上传至github:
https://github.com/liaozihong/SpringBoot-Learning/tree/master/SpringBoot-Mybatis-Mycat

参考链接:

参考链接:
https://blog.csdn.net/wangjun5159/article/details/51568249
https://blog.csdn.net/wangshuang1631/article/details/62898469

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章