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 db3中testdb库 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)去掉所有表外键关系