Mycat分库分表

来源:互联网 发布:集团军总司令源码程序 编辑:程序博客网 时间:2024/05/17 00:10

数据节点配置

[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 节点

mycat分片规则

  1. 规则种类,在rule.xml文件中

    <table name="t_config" primaryKey="id" dataNode="dn1,dn2" rule="规则名" />
    • sharding-by-intfile 分片枚举
    • rule1 固定分片hash算法
    • auto-sharding-long 范围约定
    • mod-long 取模
    • sharding-by-date 按日期(天)分片
    • ………….
  2. mycat全局表
    如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于 Mycat全局表,无须对数据进行切分,只要在所有的分片上保存一份数据即可,Mycat 在Join 操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,避免跨库 Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。
    配置[schema.xml]

    <table name="t_config" primaryKey="id" type="global" dataNode="dn1,dn2" />
  3. 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>
  4. 多对多关联
    有一类业务场景是 “主表A+关系表+主表B”,举例来说就是商户会员+订单+商户,对应这类业务,如何
    切分? 从会员的角度,如果需要查询会员购买的订单,那按照会员进行切分即可,但是如果要查询商户当天售出的订单,那又需要按照商户做切分,可是如果既要按照会员又要按照商户切分,几乎是无法实现,这类业务如何选择切分规则非常难。目前还暂时无法很好支持这种模式下的3个表之间的关联。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即“A的关系”还是“B的关系”,来决定关系表跟从那个方向存储,未来 Mycat版本中将考虑将中间表进行双向复制,以实现从A-关系表 以及B-关系表的双向关联查询。

自增主键使用

  1. 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值

  2. 重启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);

    这里写图片描述

    这里写图片描述

  3. 结论
    登陆mysql查看db1-3的记录,可以发现,三条order记录在不同db上,order_detail的记录与所关联的order表记录存放在同一个数据分片上

0 0
原创粉丝点击