高级Spring Boot---使用mycat 分库分表
什么是mycat
2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,经过Mycat发起人第一次改良,第一代改良版——Mycat诞生。 Mycat开源以后,一些Cobar的用户参与了Mycat的开发,最终Mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。
-
一个彻底开源的,面向企业应用开发的大数据库集群
-
支持事务、ACID、可以替代MySQL的加强版数据库
-
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
-
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
-
结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
-
一个新颖的数据库中间件产品
关键特性
-
支持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 、 odb 、巨杉。
-
支持密码加密
-
支持服务降级
-
支持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开发版)。
安装
官网下载: http://www.mycat.io/
下载1.6的正式版
image.png下载后解压,cmd超级管理员模式进入mycat\bin 目录,执行安装命令
mycat install
image.png安装完成,启动mycat mycat start
启动过程中如果报错,可查看日志文件,查看错误原因
image.png image.png一般情况下有两种错误,需要将conf\wrapper.conf 文件中的wrapper.java.command改为jdk的安装目录。
wrapper.java.command=D:\Program Files (x86)\Java\jdk1.8.0_131\bin\java.exe
将虚拟内存改小
image.pngmycat 使用场景一---全局表
第一步,打开conf\ Schema.Xml 的配置文件
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="users" primaryKey="ID" type="global" dataNode="dn1,dn2" />
</schema>
<dataNode name="dn1" dataHost="mysql01" database="test01" />
<dataNode name="dn2" dataHost="mysql02" database="test02" />
<dataHost name="mysql01" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host01" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="mysql02" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host02" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>
用Navicat for MySQL 连接mycat ,mycat 的连接方式跟mysql一致。
默认端口为8066,用户名:root,密码:123456
当我们往mycat的表中插入数据时,test01,test02也会自动插入数据。
mycat 使用场景二---分库分表,取模分片(等分)
image.png第一步,编辑conf\rule.xml 设置取模数
<tableRule name="mod-long">
<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>
第二步,在conf\ Schema.Xml 中配置表节点
<table name="phones" primaryKey="ID" rule="mod-long" dataNode="dn1,dn2" />
在mycat 数据库中创建phones表,重启mycat restart 后,test01和test02会自动创建phones表
image.png image.pngimage.png
当我们向mycat数据库的phones中插入数据时,数据会自己的等分到test01和test02的数据库中。
mycat 使用场景三---分库分表,枚举分片
通过在配置文件中配置可能的枚举 id,自己配置分片,根据表中的某一字段的值枚举分到多个数据库表中。
如下面表中根据is_free字段0,1不同的值枚举到不同的库中
image.png第一步,配置conf\rule.xml 枚举的字段
<tableRule name="sharding-by-intfile">
<rule>
<columns>is_free</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
我们可以看到枚举的方法是hash-int ,而hash-in的实现如下:
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
即枚举值的配置文件为partition-hash-int.txt,打开conf\ partition-hash-int.txt 设置枚举
image.png第一个表示字段的值,第二个表示第几个库
第二步,在conf\ Schema.Xml 文件中新增一个表
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
重启mycat ,创建customer表,当我们往customer插入数据时,is_free=0的到test01库中,is_free=1的数据到test02 中。