Mycat实战之配置EP分片
ER分片介绍
以mycat逻辑库里面自带的例子,例如客户(CUSTOMER)跟订单(orders)以及订单条目(orders_item),订单条目依
赖订单表,订单表依赖客户,这样客户与订单以及订单条目之间存在依赖关系,这类似业务的切分可以抽象出合适的切分
规则,比如根据用户ID切分,其它相关的表都依赖于用户ID,再或者根据订单ID进行切分,总之部分业务总会可以抽象出
父子关系的表。这类表适用于ER分片表,子表的记录与所关联的父表记录存放在同一个数据分片上,避免数据Join跨库操
作,以order与order_item例子为例和customer与order,schema.xml中定义合适的分片配置,order,order_item根
据id迕行数据切分,保证相同id的数据分到同一个分片上,在进行数据插入操作时,Mycat会获取order所在的分片,然
后将order_item也插入到order所在的分片。同理order与customer也是这样关系。
| Tables | 主键 | 对应的父表 | 关联关系 |
|---|---|---|---|
| customer | id | ||
| orders | id | customer | orders.customer_id=customer.id |
| order_items | id | orders | order_items.order_id=orders.id |
| customer_addr | id | customer | customer_addr.customer_id= customer.id |
1 修改 scehma.xml 添加 ER分片对应的父子表
#customer 采用rule是sharding-by-intfile,是枚举类型,类似range,可以看成是range特例情况.
[root@localhost conf]# vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="T_VOTE" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
</schema>
<dataNode name="dn1" dataHost="192.168.2.130" database="db1" />
<dataNode name="dn2" dataHost="192.168.2.130" database="db2" />
<dataNode name="dn3" dataHost="192.168.2.130" database="db3" />
<dataHost name="192.168.2.130" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.2.130:3306" user="root"
password="root123">
</writeHost>
</dataHost>
</mycat:schema>

2 修改 rule.xml
#修改默认规则columns里面对应sharding_id变成id
<tableRule name="sharding-by-intfile">
<rule>
<columns>id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int"
class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
#修改func 对应的文本:定义2个值对应datanode
[root@localhost conf]# vi partition-hash-int.txt
10000=0
10010=1
#reload config
mysql> reload @@config;
Query OK, 1 row affected (0.24 sec)
Reload config success
3 在逻辑库中创建需要表
注释:创建customer和customer_addr表演示ER分片.
[root@localhost bin]# mysql -h 192.168.2.130 -P8066 -u test -ptest
Warning: Using a password on the command line interfa ce can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql>
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
mysql> use TESTDB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| customer |
| customer_addr |
| orders |
| order_items |
| travelrecord |
| t_vote |
+------------------+
6 rows in set (0.00 sec)
mysql> create table customer(id int not null,customer_id int not null,datanode varchar(10),primary key(id));
Query OK, 0 rows affected (0.09 sec)
mysql> create table customer_addr(id int not null,customer_id int not null,customer_addr varchar(200),datanode varchar(10),primary key(id));
Query OK, 0 rows affected (0.04 sec)
插入数据到customer和customer_addr表
a:插入数据到customer
mysql> insert into customer(id,customer_id,datanode) values(10000,1,database());
Query OK, 1 row affected (0.07 sec)
对应的日志

可以看到写入到db1
b:插入数据到 customer_addr
mysql> insert into customer_addr (id, customer_id, customer_addr, datanode)
values (10000, 10000, 'shanghai', DATABASE())
Query OK, 1 row affected (0.11 sec)
对应的日志

c:继续插入数据到dn2
mysql> insert into customer(id,customer_id,datanode) values(10010,2,database());
Query OK, 1 row affected (0.01 sec)
mysql> insert into customer_addr(id,customer_id,customer_addr,datanode) values
(10010,10010,'chengdu',database());
Query OK, 1 row affected (0.11 sec)
4 验证ER分片
#获取全部数据
mysql> explain select customer.id,customer.customer_id,customer.datanode,
customer_addr.customer_addr
from customer,customer_addr
where customer.id=customer_addr.customer_id;
+-----------+-----------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+-----------------------------------------------------------+
| dn1 |select customer.id,customer.customer_id,customer.datanode, |
| | customer_addr.customer_addr |
| |from customer,customer_addr |
| |where customer.id=customer_addr.customer_id; |
| | |
| dn2 |select customer.id,customer.customer_id,customer.datanode, |
| | customer_addr.customer_addr |
| |from customer,customer_addr |
| |where customer.id=customer_addr.customer_id; |
+-----------+-----------------------------------------------------------+
对应的日志

由上可知走的是全部路由
#获取单个分片上的数据
mysql> explain select customer.id,customer.customer_id,customer.datanode,
customer_addr.customer_addr
from customer,customer_addr
where customer.id=customer_addr.customer_id and customer.id=10000;
+-----------+--------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------------------------+
| dn1 | select customer.id,customer.customer_id,customer.datanode, |
| | customer_addr.customer_addr |
| | from customer,customer_addr |
| | where customer.id=customer_addr.customer_id and customer.id=10000 |
+-----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

由上可知路由到了dn1上
Mycat实战之配置EP分片的更多相关文章
- linux中mycat的配置,分片,以及主从复制
1.1 安装环境 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 1.2 安装步骤 Mycat有windows.linux多种版本.本教程为lin ...
- MYCAT实战之分片迁移
实践扩容 1.要求: travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上, 并完成记录要求,最快的数据迁移做法,中断业务时间最短 2.针对分片以及迁 ...
- Mycat实战之主键数据库自增方式
创建一个 person表,主键为Id,hash方式分片,主键自增(采用数据库方式) #person表结构如下 Id,主键,Mycat自增主键 name,字符串,16字节最长 school,毕业学校,数 ...
- MyCAT简单入门配置
MyCAT简单入门配置 安装jdk 建议1.7以上 安装mysql 安装MyCAT Mycat 源码:https://github.com/MyCATApache/Mycat-Server Mycat ...
- AI应用开发实战 - 从零开始配置环境
AI应用开发实战 - 从零开始配置环境 与本篇配套的视频教程请访问:https://www.bilibili.com/video/av24421492/ 建议和反馈,请发送到 https://gith ...
- MyCat基础安装配置-笔记(一)
概述 Mycat 是一个数据库分库分表中间件,Mycat web 可以对 Mycat进行监控,这里分享一下 Mycat web 的搭建过程 详细内容可以参考 官方文档,下载文档地址:https://g ...
- Zookeeper C++编程实战之配置更新
CZookeeperHelper:https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zookeeper_helper.h ...
- webpack4 中的最新 React全家桶实战使用配置指南!
最新React全家桶实战使用配置指南 这篇文档 是吕小明老师结合以往的项目经验 加上自己本身对react webpack redux理解写下的总结文档,总共耗时一周总结下来的,希望能对读者能够有收获, ...
- 【MangoDB分片】配置mongodb分片群集(sharding cluster)
配置mongodb分片群集(sharding cluster) Sharding cluster介绍 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monod ...
随机推荐
- Oracle11g数据库监听配置
(转自:http://blog.sina.com.cn/s/blog_6908928501018057.html) 经验告诉我:最好把数据库的SID和数据库全局名称分开,免得配置时混了,如果要配置服务 ...
- 条款22:将成员变量声明为private
protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...
- position值详情
1.absolute属性: 英文直译成汉语的解释有:绝对,独立的.显然在做为css中position属性的值时“绝对”这个意思更恰当一些.他的作用是:生成绝对定位的元素,相对于static 定位以外的 ...
- UI-不常用控件 UIActivityIndicatorView、UIProgressView、UISegmentedControl、UIStepper、UISwitch、UITextView、UIAlertController
1 //UIActivityIndicatorView //小菊花,加载================================================================ ...
- 发现的好东西——bitset
先向各位大佬介绍一个水题 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2( ...
- CollectionUtils工具类使用指南
CollectionUtils提供很多对集合的操作方法,常用的方法如下:(参考文章:http://www.open-open.com/code/view/1420470842125) import o ...
- MbrFix 问题
删除Windows/Linux双系统下的Linux系统 参考博客 注意:官网上的 MbrFix.exe 下载或许太慢. CSDN下载 问题 1.看到博客下面的评论写道: 为什么我的到第四步的时候会提示 ...
- dynamic_caast操作符
dynamic_caast操作符,将基类的指针或引用安全的转换为派生类的指针或引用. 原理: 将一个基类对象指针或引用抛到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相 ...
- 什么是 DDoS 攻击?
欢迎访问网易云社区,了解更多网易技术产品运营经验. 全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致 ...
- win2003从组策略关闭端口(445/135/137/138/139/3389等)教程
一些恶劣的病毒会从某些端口入侵计算机,因此关闭某些用不到的而又具有高风险的端口就显得很有必要,是服务器管理员要做的基本的安全防范.本文将介绍win2003系统在组策略关闭某一个端口的教程,文章以关闭4 ...