• 支持 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机制
下载地址: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
修改mycat_home\conf\server.xml 中的user,mycat 的连接用户信息
更改完后,进入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
配置schema.xml,添加一个user的表
<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>idcolumns>
<algorithm>mod-longalgorithm>
rule>
tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3property>
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;
接着用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