权威指南:http://www.mycat.io/document/mycat-definitive-guide.pdf
主要功能:分库分表(横切,纵切),主从复制读写分离,弱XA事务,数据库集群监控
1 安装配置
在win环境下测试,在\mycat\conf下存放着配置文件,双击\mycat\bin\startup_nowrap.bat启动mycat,需要安装JDK。
\mycat\conf\server.xml 配置服务器/用户登录信息
\mycat\conf\schema.xml 配置虚拟库/表/真实库节点信息
\mycat\conf\rule.xml 配置数据分配规则算法
2 启动方式
1 \mycat\bin\startup_nowrap.bat双击运行,启动mycat
2 \mycat\bin\目录下 shift+右键选择powershell,输入.\startup_nowrap.bat 启动。(推荐,此方式可以看到启动时检测异常)
2 链接MyCat,可通过任意sql IDE根据上篇配置的登录信息,链接mycat数据库集群
MyCat中间件的优点就是数据库集群和应用解耦。无论是IDE还是开发的应用程序,其链接与操作方式与链接操作一个数据库相同,所有对集群的控制都由MyCat完成。
3 MyCat支持多数据库的垮库两表JOIN,多余两个表时会出错。支持不垮库任意表JOIN
3.1 ShareJoin 支持垮库两表JOIN
select前加入 /*!mycat:catlet=demo.catlets.ShareJoin */
但要保证数据insert时的分配规则和数据库分片信息,与当前配置一致。这样在select join时,mycat才能正确的逆推找出需 要数据所对应的真实数据库分片。
一句select中不能多于两个表垮库join
在mycat配置时应尽量避免同组相关数据垮库(见3.3)
3.2 全局表global --- 每个库分片中都有此表完整数据,避免垮库join
若某一个表是一个标准表,则将其设置为global。这样在查询join时避免对此表的垮库关联
3.3 ER-JOIN 通过父子表的概念,将同组相关数据分配到同一分片上,避免垮库join。
一个父表可以有多个子表,各个子表可以有各自的子表。
经测试:父子表模式解决同组数据的分片一致性问题,提高了查询效率。并且可以实现符合父子表关联关系的多表join查询
例1:订单汇总,订单明细,就可以通过父子表配置,将同一订单的数据分配到相同数据库分片上,避免垮库关联
<table name="hz" dataNode="dn1,dn2" rule="mod-long">
<childTable name="mx" joinKey="djbh" parentKey="djbh"/>
<!--joinKey 是子表中字段 parentKey是父表中字段 至两个字段是join 条件-->
</table>
例2:符合父子表关联关系的多表join查询
<!--mycat配置-->
<table name="mycat_test1" primaryKey="id" dataNode="dn1,dn2" rule="mod-long">
<childTable name="mycat_test1_copy" primaryKey="id" joinKey="id" parentKey="xgid">
<childTable name="mycat_test1_copy_copy" joinKey="id"
parentKey="xgid" />
</childTable>
<childTable name="mycat_test1_copy1" primaryKey="id" joinKey="id"parentKey="xgid"/>
</table>
select a.id,a.name,b.id,b.name,c.id,c.name,d.id,d.name from mycat_test1 a
join mycat_test1_copy b on a.xgid=b.id
join mycat_test1_copy1 d on a.xgid=d.id
join mycat_test1_copy_copy c on c.id=b.xgid
order by a.id
注意:
a 不要在查询前加/*!mycat:catlet=demo.catlets.ShareJoin */,因为加上这个指令,执行的是ShareJoin而不是执行ERjoin
b 当不同分片的父表依赖于子表的同一行时,子表insert只会进入其中一个分片,会造成ERjoin时其他父表关联不到其对应子表,返回的结果集少于应得结果集。这个时候就要转换成ShareJoin 查询
例:父表id=1,id=2两条都是xgid=3,但是父表两条记录通过mod-long算法分配到不同数据库中,但是子表id=3的数据行,只会insert进入其中一个分片
c 一定要保证父表内容在子表之前存在
4 查询/插入 要写列名
5 主从复制读写分离
分页
Mycat分页的大坑一定要注意:
在对应的分片上去查询分页数据的时候是从第一条记录开始扫描,然后再取出对应的分页数据,如
SELECT * FROM customer ORDER BY id LIMIT 1000100, 100;
这个sql语句被Mycat转化后
1 -> dn1{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}
2 -> dn2{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}
所以要在Mycat的server.xm里面开启使用非堆内存。否则内存会爆掉
<property name="useOffHeapForMerge">1</property>
日志
日志开启了debug级别。debug级别的时候TPS下降明显