[schema.xml]配置
<dataNode name="dn1" dataHost="localhost1" database="db1"/> <dataNode name="dn2" dataHost="localhost1" database="db2"/> <dataNode name="dn3" dataHost="localhost1" database="db3"/>
把localhost1中的 db1-3 数据库映射到mycat dn1-3 节点
规则种类,在rule.xml文件中
<table name="t_config" primaryKey="id" dataNode="dn1,dn2" rule="规则名" />
mycat全局表
如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于 Mycat全局表,无须对数据进行切分,只要在所有的分片上保存一份数据即可,Mycat 在Join 操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,避免跨库 Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。
配置[schema.xml]
<table name="t_config" primaryKey="id" type="global" dataNode="dn1,dn2" />
ER分片表
有一类业务,例如订单(order)跟订单明细(order_detail),明细表会依赖于订单,也就是说会存在表的主从关系,这类似业务的切分可以抽象出合适的切分规则,比如根据用户 ID切分,其他相关的表都依赖于用户ID,再或者根据订单ID切分,总之部分业务总会可以抽象出父子关系的表。这类表适用于 ER分片表,子表的记录与所关联的父表记录存放在同一个数据分片上,避免数据 Join跨库操作。
以order与 order_detail例子为例,schema.xml中定义如下的分片配置,order,order_detail 根据 order_id进行数据切分,保证相同 order_id的数据分到同一个分片上,在进行数据插入操作时,Mycat会获取 order所在的分片,然后将 order_detail也插入到 order所在的分片。
配置[schema.xml]
<table name="t_order" primaryKey="id" dataNode="dn$1-3" rule="mod-long"> <childTable name="t_order_detail" primaryKey="id" joinKey="order_id" parentKey="id" /></table>
mycat配置
[schema.xml]
<table name="t_order" primaryKey="id" autoIncrement="true" dataNode="dn$1-3" rule="mod-long"> <childTable name="t_order_detail" primaryKey="id" autoIncrement="true" joinKey="order_id" parentKey="id" /></table>
[sequence_db_conf.properties]
#TABLE=dataNodeT_ORDER_DETAIL=dn1T_ORDER=dn1
[sequence_conf.properties]
T_ORDER.CURID=0T_ORDER.MINID=1T_ORDER.MAXID=10000T_ORDER_DETAIL.CURID=0T_ORDER_DETAIL.MINID=1T_ORDER_DETAIL.MAXID=10000
CURID表示当前ID值,MINID表示最小ID值,MAXID表示最大ID值
重启mycat,执行sql
#创建数据库create table t_order(id bigint not null auto_increment primary key,company varchar(255))AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;create table t_order_detail(id bigint not null auto_increment primary key,good varchar(255),order_id bigint,CONSTRAINT FK_ORDID11 FOREIGN KEY (ORDER_ID) REFERENCES T_ORDER (ID))AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;#插入数据insert into t_order(company) values('alibaba');insert into t_order(company) values('tencent');insert into t_order(company) values('baidu');insert into t_order_detail(good,order_id) values('aliyun',1);insert into t_order_detail(good,order_id) values('qq',2); insert into t_order_detail(good,order_id) values('baiduyun',3);
结论
登陆MySQL查看db1-3的记录,可以发现,三条order记录在不同db上,order_detail的记录与所关联的order表记录存放在同一个数据分片上
联系客服