首先创建基础表
创建15个(按需创建)分片表,和一个操作表
分片表和操作表结构一样
接着配置MyCat中相差配置文件
一、server.xml
保存了所有mycat需要的系统配置信息
<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为关闭 --> <!-- 0 表示是表示使用本地文件方式。 1 表示的是根据数据库来生成 2 表示时间戳的方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) --> <property name="sequnceHandlerType">1</property> <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --> <property name="processorBufferPoolType">0</property> <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--> <property name="handleDistributedTransactions">0</property> <!--off heap for merge/order/group/limit 1开启 0关闭--> <property name="useOffHeapForMerge">1</property> <!--单位为m--> <property name="memoryPageSize">64k</property> <!--单位为k--> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <!-- 单位为m --> <property name="systemReserveMemorySize">384m</property> <!--是否采用zookeeper协调切换 --> <property name="useZKSwitch">false</property> </system> <!-- 连接MyCat库的用户名和密码 --> <user name="root" defaultAccount="true"> <property name="password">Yifan123.</property> <property name="schemas">catdb</property> </user> </mycat:server>
二、schema.xml
Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。
<mycat:schema xmlns:mycat="http://io.mycat/"> <!-- name:逻辑数据库名 checkSQLschema:把schema的字符去掉 sqlMaxLimit:减少过多的数据返回--> <schema name="catdb" checkSQLschema="false" sqlMaxLimit="100"> <!-- name:逻辑表表名 primaryKey:逻辑表对应真实表的主键 autoIncrement:主键自增长 dataNode:逻辑表所属的dataNode rule:逻辑表使用的规则名字 --> <table name="stu_file" primaryKey="id" autoIncrement="true" subTables="stu_file$1-15" dataNode="dn1" rule="mod-long"/> </schema> <!-- name:数据节点名 dataHost:该分片属于哪个数据库实例 database:定义该分片属性哪个具体数据库实例上的具体库 --> <dataNode name="dn1" dataHost="localhost1" database="test" /> <!-- name:数据库实例名 --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!-- 用于和后端数据库进行心跳检查的语句 --> <heartbeat>select user()</heartbeat> <!-- 写实例 --> <writeHost host="hostM1" url="localhost:3306" user="root" password="Yifan123."> <!-- 读实例 --> <readHost host="hostS2" url="localhost:3306" user="root" password="Yifan123." /> </writeHost> </dataHost> </mycat:schema>
三、rule.xml
rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function。
<!-- name:定义表规则名 --> <tableRule name="mod-long"> <rule> <!-- 指定对物理表中的哪一列进行拆分 --> <columns>id</columns> <!-- 使用什么路由算法 --> <algorithm>mod-long</algorithm> </rule> </tableRule> <!-- name 指定算法的名字 class 制定路由算法具体的类名字 --> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- property 为具体算法需要用到的一些属性。 --> <property name="count">15</property> </function>
四、设置主键自增长
1. 创建Mycat生成唯一主键所需要的函数(用mysql登录后执行)
注意:其中“INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('STU_FILE', 100000, 100);”
插入的是“表名”,“id最小值”及“步长”;
DROP TABLE IF EXISTS MYCAT_SEQUENCE; CREATE TABLE MYCAT_SEQUENCE ( NAME VARCHAR (50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (NAME) ) ENGINE = INNODB ; INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('GLOBAL', 100000, 100); DROP FUNCTION IF EXISTS `mycat_seq_currval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET utf8 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE NAME = seq_name; RETURN retval ; END ;; DELIMITER ; DROP FUNCTION IF EXISTS `mycat_seq_nextval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE NAME = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ; DROP FUNCTION IF EXISTS `mycat_seq_setval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), VALUE INTEGER) RETURNS VARCHAR(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = VALUE WHERE NAME = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ;
2. sequence_db_conf.properties
加入 —— STU_FILE=dn1
#sequence stored in datanode GLOBAL=dn1 COMPANY=dn1 CUSTOMER=dn1 ORDERS=dn1 STU_FILE=dn1
最后登录MyCat操作(和登录MySQL方式一样)
1. Navicat登录MyCat页面
2. MyCat表组成(自动生成并显示,和MySQL一样)
以后对MyCat的操作,就是对MySQL的操作
3. 对应MySQL表组成