mycat初体验
一、简介
- mycat是一个彻底开源的数据库分库分表中间件;它是基于proxy模式使用,通过简单的配置,使用时只需要连接上mycat,就能轻松实现分库分表,读写分离等业务。具体特性及详情可以查看mycat官网
二、安装mycat和配置
- 下载mycat http://dl.mycat.io/1.6.6.1/ 目前这个版本算比较新的
有linux、windows这些版本的,我这里演示linux版本的。
-
解压后的目录
-
还需要数据库,我这里使用mysql,为了看到分库分表的效果,我用2个mysql(分别端口3306/3307)
-
为了快速我是直接用docker构建的mysql;当然也可以用其他方式创建mysql。
-
再把库和表建好,两个数据库一样。
-
表结构
-
下面计算配置mycat,主要配置这三个文件。
-
修改
server.xml
,这里只修改连接MyCat的用户名和密码,如下:
-
其中schemas是逻辑库,在后边的配置会用到,这里配置了一个逻辑库为:mycat_deom。
-
修改
schema.xml
文件,配置逻辑库:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycat_demo" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="dwc_account" primaryKey="user_id" dataNode="dn1,dn2" rule="sharding-by-murmur">
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
</table>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="db235" database="mycat_demo" />
<dataNode name="dn2" dataHost="db237" database="mycat_demo" />
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="db235" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.137.135:3306" user="root"
password="root">
<!-- can have multi read hosts -->
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<dataHost name="db237" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.137.135:3307" user="root"
password="root">
<!-- can have multi read hosts -->
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<!--
<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
</dataHost>
<dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
<dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
</dataHost> -->
</mycat:schema>
主要是修改这部分:
- 在mycat中schema是逻辑库,schema 标签下的table是逻辑表,其中:
<table name="dwc_account" primaryKey="user_id" dataNode="dn1,dn2" rule="sharding-by-murmur">
代表具体的数据库表中的dwc_account,primaryKey是主键,dataNode 是mycat中的分片节点,rule 对使用这种表的路由规则,murmur算法是将字段进行hash后分发到不同的数据库,字段类型支持int和varchar。
<dataNode name="dn1" dataHost="db235" database="mycat_demo" />
- dataNode节点中的name就是上述table节点中使用到的dataNode名称,dataHost是具体每一个数据库服务器的节点名称,在下边进行配置的,database就是该节点中具体存在的一个数据库。
<dataHost name="db235" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.137.135:3306" user="root"
password="root">
<!-- can have multi read hosts -->
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
- 剩下还有个表的路由规则
rule.xml
:
- columns里一般是写表的主键id,然后计算要分片的数据库节点数量了,我这儿是2个。
三、使用mycat
- 启动mycat,
mycat start
和startup_nowrap.sh
都可以启动mycat;mycat start
启动可能会报错,请参考另外一篇博文 mycat启动报There were 5 failed launches in a row, each lasting less than 300 seconds. Giving up.
- 启动完成后,用工具就可以连接mycat,就想一个mysql数据库一样。
- 操作mycat,就把数据库地址、端口、用户名、密码改一下就行了,其他的不变。
- 现在我用代码在mycat插入一些数据查看分片的效果:
- 两个数据库的数据是不同的,已经达到了分片的效果。文章到此结束。
- 我目前对mycat还处于入门的状态,如果有描述错误的地方 ,还请指正,感激不尽。