MyCat 数据库集群中间件

中文网:http://www.mycat.io/

权威指南: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下降明显

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值