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&amp;characterEncoding=utf8&amp;serverTimezone=UTC&amp;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&amp;characterEncoding=utf8&amp;serverTimezone=UTC&amp;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">
<!-- how many data nodes -->
<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
#sequence depend on TIME
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 {
//mysql驱动版本:mysql-connector-java-8.0.15.jar
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:8066/sharding_db?serverTimezone=UTC&useSSL=false", "root", "123456");
//mycat支持mysql批量插入语法
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&amp;characterEncoding=utf8&amp;serverTimezone=UTC&amp;allowMultiQueries=true" user="root" password="123456">
<readHost host="hostR1" url="jdbc:mysql://127.0.0.1:3316?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC&amp;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>

测试


本站总访问量:次本站总访问数:人
本站由 Peng Tong 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。