mycat ER关系 取模分片试验

                       Mycat  商品表ER分片

 

 

1. 业务场景

   用户查询商品信息

   要求:把商品表以及子表均匀分片
   分片规则:

   商品表commodity --- 根据commodity_id取模

2. 

   主表:
    commodity

   子表:
   commodity_additional_attributes
   commodity_commodity_category

   commodity_attachment
   commodity_issuance_station

3. 模拟服务器
  本地虚拟机
   192.168.190.11 testdb   db1
                        db2
                        db3
  配置  内存 2G

                2

4)全局序列号
   采用本地文件方式 配置server.xml   0代表本地文件方式
 <property name="sequnceHandlerType">0</property>

   属性文件 /usr/local/mycat/conf/sequence_conf.properties
     #commodity

COMMODITY.HISIDS=

COMMODITY.MAXID=9999999999

COMMODITY.MINID=1000

COMMODITY.CURID=1325358



   

4. 配置分片规则

5.1 配置function标签,找到function标签name="mod-long" 的function 配置, 改总点数为3(和使用的mysql 点数一致)。

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">

<!-- how many data nodes -->

<property name="count">3</property>

</function>

 

5.2 配置表分片(name 要全局唯一),rule.xml 配置添加如下配置

 

  <!-- commodity分片规则 -->

        <tableRule name="tb_commodity_mod-long">

                <rule>

                        <!--  分片使用的字段  -->

  <columns>commodity_id</columns>

<!--  分片使用的方法,对应function 名称  -->

                        <algorithm>mod-long</algorithm>

                </rule>

         </tableRule>

 

 

5. 配置schema.xml
    <!--  配置ER 分片,子表的存储依赖于主表,并且物理上紧邻存放-->

 <table name="commodity" primaryKey="commodity_id" dataNode="dn1,dn2,dn3"

   rule="tb_commodity_mod-long">

<childTable name="commodity_additional_attributes" primaryKey="commodity_id" joinKey="commodity_id"

parentKey="commodity_id" />

<childTable name="commodity_attachment" primaryKey="attachment_id" joinKey="commodity_id"

parentKey="commodity_id" />

<childTable name="commodity_commodity_category" primaryKey="commodity_id" joinKey="commodity_id"

parentKey="commodity_id" />

<childTable name="commodity_issuance_station" primaryKey="commodity_id" joinKey="commodity_id"

parentKey="commodity_id" />

</table>

 

6. 测试
   mycat逻辑库TESTDB下执行SELECT * from commodity 查询脚本


    

   commondity_id = 866878
   求模运算:


     
   物理库存储于第2个节点
  db2节点物理库执行 SELECT * from commodity WHERE commodity_id = '866878' 查询脚本


在屋里库db2 查询子表:

   SELECT * from commodity_additional_attributes WHERE commodity_id = '866878'


由此可见 主表子表ER关系数据邻近存储

分别查询db1 db2  db3testdb commodity表数据为76413 76414  76415

数据分布均匀

 

  

7. 性能对比分析


8.数据迁移

  8.1 其他表处理
      1)有ER关系 根据commodity表定义子表信息 用取模分片算法均匀分配节点

      2)没有ER关系
          根据计划数据量大小,可用取模分片算法均匀分配节点,也可定义一个节点,单节点分配存储

      3)全局表 字典性质的表  定义schema.xml 中 table属性type=gloabal
      4)有固定性质字段可均匀分配的表 比如有地区区分的表 按具体省份采用分片规则进行分片存储
  8.2 数据源更换
    由于mycat配置了逻辑数据库 数据表 以及mycat定义了自己的访问端口,应用程序配置文件数据库   连接要更改8066端口并改称mycat定义的逻辑数据库名称。
  8.3 全局序列号
      mycat进行了物理库的分库,原来自定义的自增长主键ID不可用,推荐使用本地文件方式的全局序 列号。
      应用程序代码里 新增数据时需要更改insert 语句:
        1)指定 MYCATSEQ_GLOBAL  必须大写 GLOBAL为自定义名称,可为对应表名。
        2)insert语句必须指定字段名。
       例如:

insert into company(id,name,addr,src_id) values(next value for MYCATSEQ_GLOBAL,'test_seq4','test_seq4','2');

 

  8.4 迁移方案
      1)导出数据 进行全库表备份导出sql脚本文件;

      2)导入mycat逻辑数据库
         mysql -uroot -p -h192.168.190.11 --local-infile=1 -P8066 TESTDB < /data_my/commodity_attachment.sql
        也可以8066端口登录mycat数据库 source命令导入
  8.5注意事项
      1)全局序列号的设定 必须设置以现实库里的ID为当前最新id;

      2) 配置ip黑白名单 用户读写权限
      3)迁移库需要在mycat中先建立表结构去掉主键ID自增长

      4)去掉所有表外键关系

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值