下载代码
https://github.com/MyCATApache/Mycat-Server
开发环境
使用 IDEA 作为开发工具(必须是 2018 版本以上,否则 debug 和 run 按钮点击都无用)
安装 jdk 8
安装 mysql
Demo
在 mysql 中建分库
create database mycat_demo_01;
create database mycat_demo_02;
建表
use mycat_demo_01;
create table test(id int, value int);
use mycat_demo_02;
create table test(id int, value int);
添加 MycatStartupTest 作为启动项
添加规则,主要包括:
server.xml: mycat 作为服务器面向用户的配置
schema.xml: 库/表拆分信息
rule.xml: 拆分算法
autoparition-long.txt: 拆分算法 auto-sharding-long 的配置文件
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">false</property>
</system>
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mycat_demo</property>
</user>
</mycat:server>
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycat_demo" checkSQLschema="true" sqlMaxLimit="100">
<!-- test 表的拆分设置,分布在哪些分片(dataNode) 及 拆分算法(rule) -->
<table name="test" dataNode="dataNode_01,dataNode_02" rule="auto-sharding-long"/>
</schema>
<!-- 分片配置,本例中两个分片处于同一台物理 mysql -->
<dataNode name="dataNode_01" dataHost="dataHost_01" database="mycat_demo_01" />
<dataNode name="dataNode_02" dataHost="dataHost_01" database="mycat_demo_02" />
<!-- 物理 mysql 设置,主要为连接信息 -->
<dataHost name="dataHost_01" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host_01" url="127.0.0.1:3306" user="root" password="XXXXXX"> <!-- ‼️‼️‼️ url、user、password 设置成你的数据库 -->
</writeHost>
</dataHost>
</mycat:schema>
rule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<!-- 算法对应的代码实现及配置数据 -->
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
</mycat:rule>
autopartition-long.txt
# range start-end ,data node index
# 字段值处于 0-2000000 之间时,数据被路由到 dataNode1
# 字段值处于 2000001-4000000 之间时,数据被路由到 dataNode2
# 其他的路由到默认dataNode,即 dataNode1
0-200M=0
200M1-400M=1
测试
mysql -h127.0.0.1 -uroot -P8066 -p123456
insert into test(id, value) values(2000001,0);
insert into test(id, value) values(1,0);
分别查看 mycat_demo_01 和 mycat_demo_02 两库。可见数据被插入到了正确分片。