Mycat下载地址:
https://github.com/MyCATApache/Mycat-download
Mycat介绍
目录介绍
- bin mycat使用命令
- catlet 它是mycat的一个扩展功能
- conf mycat的配置信息 【重点】
- lib mycat的引用jar包 ,mycat是由java开发的【mysql驱动可直接在这里更换】
- logs 日志目录 mycat启动日志文件 —>wrapper.log mycat的运行日志文件 —->mycat.log
配置文件介绍
- server.xml mycat的 配置文件 配置连接mycat的账号、密码、和数据库的名称
- schema.xml 配置mycat的物理数据库和数据库中的逻辑表
- rule.xml 配置mycat的分片(分库分表) 规则 mod-log
关于Mysql版本问题
如果驱动版本不符合mysql的版本,直接将mycat下的低版本驱动替换成高版本的驱动就行了,mysql8以上的版本都需要更换驱动版本
分库分表
配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> //system配置,此处不贴出 </system>
<user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">sharding_db</property> </user>
<user name="user"> <property name="password">user</property> <property name="schemas">test</property> //如果使用user用户连接,则不可写 <property name="readOnly">true</property> </user>
</mycat:server>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="sharding_db" checkSQLschema="false" sqlMaxLimit="100"> <table name="t_user_0" dataNode="dn1,dn2" primaryKey="id" rule="mod-long" /> </schema>
<dataNode name="dn1" dataHost="localhost1" database="sharding_db" /> <dataNode name="dn2" dataHost="localhost2" database="sharding_db" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="jdbc:mysql://127.0.0.1:3306?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true" user="root" password="123456"></writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="jdbc:mysql://127.0.0.1:3316?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true" user="root" password="123456"></writeHost>
</dataHost>
</mycat:schema>
|
balance属性,负载均衡类型,目前的取值有3 种:
- balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
- balance=”1”,全部的readHost 与stand by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1 与M2 互为主备),正常情况下,M2,S1,S2 都参与select 语句的负载均衡。
- balance=”2”,所有读操作都随机的在writeHost、readhost 上分发。
- balance=”3”,所有读请求随机的分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压力,注意balance=3 只在1.4 及其以后版本有,1.3 没有。
writeType 属性,负载均衡类型,目前的取值有3 种:
- writeType=”0”, 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个,writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
- writeType=”1”,所有写操作都随机的发送到配置的writeHost,1.5 以后废弃不推荐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> //columns是分片的列,既分片的依据,algorithm是分片的算法,也会在该文件中配置 <tableRule name="mod-long"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> //class 就是代码中的分片算法,property就是算法的传参,这里的算法就是取模算法,count就是取模的除数,这里的count必须和分片数一致,如果想不一致,需要自定义分片算法 <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">2</property> </function> </mycat:rule>
|
雪花算法自增id
ID= 64 位二进制 (1(标识)+41(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)
即换算成十进制为18位数的long类型,每毫秒可以并发12位二进制的累加。
一:修改server.mxl
1
| <property name="sequnceHandlerType">2</property>
|
sequnceHandlerType:
- 0:表示使用本地文件方式,即使用sequence_conf.properties文件
- 1:表示专用数据库方式,即无法自增
- 2:表示使用本地时间戳,即雪花算法
- 3:使用zookeeper生成主键id,非递增
- 4:使用zookeeper生成主键id,递增
- 本文主要介绍雪花算法生成id:其他方式参考文章:
Mycat 分片表全局自增主键实现及测试_mycat集群自增主键原理_if 0 = -I can的博客-CSDN博客
二:配置sequence_time_conf.properties文件
1 2 3
| WORKID=01 DATAACENTERID=01
|
- WORKID=01:设置雪花算法中的业务编码(0-31任意整数)
- DATAACENTERID=01:设置雪花算法中的机器编码(0-31任意整数)
- 多个mycat节点下每个mycat配置的 WORKID,DATAACENTERID不同,组成唯一标识,总共支持32*32=1024种组合
三:修改schema.xml配置
1 2 3
| <schema name="sharding_db" checkSQLschema="false" sqlMaxLimit="100"> <table name="t_user_mycat" dataNode="dn1,dn2" primaryKey="id" rule="mod-long" autoIncrement="true"/> </schema>
|
为虚拟表添加autoIncrement=”true”配置
Java端测试
1 2 3 4 5 6 7 8 9 10
| public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:8066/sharding_db?serverTimezone=UTC&useSSL=false", "root", "123456"); int i = JdbcUtils.executeUpdate(connection, "insert into t_user_mycat(name,sex) values('李四','男'),('王五','男')", new ArrayList<>()); System.out.println(i); System.out.println(JSON.toJSONString(JdbcUtils.executeQuery(connection, "select * from t_user_mycat", new ArrayList<>()))); connection.close(); }
|



从上图可以看出两条记录分表存入了两张物理表
读写分离
配置
读写分离必须配合mysql的主从同步,具体同步的配置参考mysql主从复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="write_read" checkSQLschema="false" sqlMaxLimit="100"> <table name="t_user_mycat" dataNode="dn3" primaryKey="id" rule="mod-long" autoIncrement="true"/> </schema>
<dataNode name="dn3" dataHost="localhost3" database="write_read"/>
<dataHost name="localhost3" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat>
<writeHost host="hostM3" url="jdbc:mysql://127.0.0.1:3306?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true" user="root" password="123456"> <readHost host="hostR1" url="jdbc:mysql://127.0.0.1:3316?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true" user="root" password="123456"> </readHost> </writeHost>
</dataHost> </mycat:schema>
|
1 2 3 4
| <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> //将分片算法的分片数修改为1 <property name="count">1</property> </function>
|
测试


