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分片的更多相关文章

  1. linux中mycat的配置,分片,以及主从复制

    1.1    安装环境 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 1.2  安装步骤 Mycat有windows.linux多种版本.本教程为lin ...

  2. MYCAT实战之分片迁移

    实践扩容 1.要求: travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上, 并完成记录要求,最快的数据迁移做法,中断业务时间最短 2.针对分片以及迁 ...

  3. Mycat实战之主键数据库自增方式

    创建一个 person表,主键为Id,hash方式分片,主键自增(采用数据库方式) #person表结构如下 Id,主键,Mycat自增主键 name,字符串,16字节最长 school,毕业学校,数 ...

  4. MyCAT简单入门配置

    MyCAT简单入门配置 安装jdk 建议1.7以上 安装mysql 安装MyCAT Mycat 源码:https://github.com/MyCATApache/Mycat-Server Mycat ...

  5. AI应用开发实战 - 从零开始配置环境

    AI应用开发实战 - 从零开始配置环境 与本篇配套的视频教程请访问:https://www.bilibili.com/video/av24421492/ 建议和反馈,请发送到 https://gith ...

  6. MyCat基础安装配置-笔记(一)

    概述 Mycat 是一个数据库分库分表中间件,Mycat web 可以对 Mycat进行监控,这里分享一下 Mycat web 的搭建过程 详细内容可以参考 官方文档,下载文档地址:https://g ...

  7. Zookeeper C++编程实战之配置更新

    CZookeeperHelper:https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zookeeper_helper.h ...

  8. webpack4 中的最新 React全家桶实战使用配置指南!

    最新React全家桶实战使用配置指南 这篇文档 是吕小明老师结合以往的项目经验 加上自己本身对react webpack redux理解写下的总结文档,总共耗时一周总结下来的,希望能对读者能够有收获, ...

  9. 【MangoDB分片】配置mongodb分片群集(sharding cluster)

    配置mongodb分片群集(sharding cluster) Sharding cluster介绍 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monod ...

随机推荐

  1. react antd 动态表单

    import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import { Form, InputNumb ...

  2. 【转载】GetAdaptersInfo函数在64位系统上返回ERROR_NOACCESS的有关问题

    From:http://www.educity.cn/wenda/351190.html GetAdaptersInfo函数在64位系统下返回ERROR_NOACCESS的问题 实际应用中一个程序在长 ...

  3. VS2010中使用 SpecFlow + Selenium.WebDriver

    安装(VS扩展.程序包) [工具]->[扩展管理器],安装SpecFlow [工具]->[库程序包管理]->[程序包管理器控制台] PM> Install-Package Sp ...

  4. web应用程序安全攻防---sql注入和xss跨站脚本攻击

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 博文主要内容包括两种常见的web攻击 sql注入 XSS跨站脚本攻击 代 ...

  5. 关于modelsim添加库的说明

    声明:以下纯属个人习惯. 1.工程建好后添加一个编译好的库的方法是:file->new->library选择a map to an existing library.然后将这个库在你这工程 ...

  6. 【学习笔记】Manacher算法

    本文部分图片来源 代码来源(代码是学姐哒.. 一.引入 Manacher算法是用来求最长回文子串的算法,时间复杂度O(n). 回文子串指的是''aacaa'',''noon'',这种正着反着读都一样的 ...

  7. 洛谷 P1292 倒酒

    题目描述 Winy是一家酒吧的老板,他的酒吧提供两种体积的啤酒,a ml和b ml,分别使用容积为a ml和b ml的酒杯来装载. 酒吧的生意并不好.Winy发现酒鬼们都非常穷.有时,他们会因为负担不 ...

  8. 【LeetCode】汇总

    此贴为汇总贴 673. Number of Longest Increasing Subsequence 075. Sort Colors 009. Palindrome Number 008. St ...

  9. selenium - 截取页面图片和截取某个元素的图

    1.截取页面图片并保存 在测试过程中,是有必要截图,特别是遇到错误的时候进行截图. # coding:utf-8 from time import sleep from PIL import Imag ...

  10. html网页自动跳转页面代码

    方案一,用<meta>里直接写刷新语句: <html><head><meta http-equiv="Content-Language" ...