首先我们先通过一个案例来初步认识。 准备两个数据库服务 dhost1: 192.168.130.128:3306 dhost2: 192.168.130.129:3306 两个服务中均有testdb数据库,数据库中均有t_order表。 查看表结构:
tableRule标签说明:
name 属性指定唯一的名字,用于标识不同的表规则。内嵌的rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。columns 内指定要拆分的列名字。algorithm 使用function 标签中的name 属性。连接表规则和具体路由算法。当然, 多个表规则可以连接到同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。function标签说明:
name 指定算法的名字。class 制定路由算法具体的类名字。property 为具体算法需要用到的一些属性此处我们为rule1规则定义了采用orderId这一列的值进行对2取模的算法。也就是说orderId为偶数的记录存放在dn0上,为奇数的记录存放在dn1上。
由于orderId为主键列,而在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。 此处采用本地配置方式: 此方式MyCAT 将sequence 配置到文件中,当使用到sequence 中的配置后,MyCAT 会 更新 conf中的sequence_conf.properties 文件中sequence 当前的值。 在sequence_conf.properties 中配置以表名为名的序列:
T_ORDER.HISIDS= T_ORDER.MAXID=2000 T_ORDER.MINID=1001 T_ORDER.CURID=1000其中HISIDS 表示使用过的历史分段(一般无特殊需要可不配置),MINID 表示最小ID 值, MAXID 表示最大 ID 值,CURID 表示当前ID 值
server.xml 中修改配置:
<system><property name="sequnceHandlerType">0</property></system>sequnceHandlerType 需要配置为0,表示使用本地文件方式。 配置完成,启动mycat
bin/mycat startnavicat连接测试 此时没有数据,我们插入数据,测试主键自增和分库是否成功。
insert into t_order(orderTime,customerId) values(1601960672,3); insert into t_order(orderTime,customerId) values(1601960775,10); insert into t_order(orderTime,customerId) values(1601960873,24); insert into t_order(orderTime,customerId) values(1601964652,18); insert into t_order(orderTime,customerId) values(1601910619,9); insert into t_order(orderTime,customerId) values(1601930682,32);查看dn0 查看dn1 实现了分库分表和主键自增。
下一篇文章介绍常用分片规则,欢迎关注。