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.txt10000=010010=1#reload configmysql> 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 -ADatabase 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上

转载于:https://www.cnblogs.com/chinesern/p/7800936.html

Mycat实战之配置EP分片相关推荐

  1. MyCat实战--读写分离/数据分片/mycat集群/haproxy负载均衡

    目录 简介 优势 关键特性 读写分离 安装mycat 配置mycat server.xml schema.xml rule.xml 启动mycat 停止mycat 连接mycat 测试 数据分片 配置 ...

  2. MySQL 基于MyCAT配置数据分片

    目录 MySQL 基于MyCAT配置数据分片 相关概念 分库/分表 垂直分割 水平分割 MyCAT介绍 软件介绍 分片规则 工作过程 部署MyCAT服务 环境部署 拓部结构 IP规划 部署MyCAT服 ...

  3. 学习笔记:分库分表之中间件Mycat实战

    点关注,不迷路! 本文已整理成文档! 文章目录 1.数据切分概念 垂直切分 水平切分 2.什么是Mycat 应用场景 3.Mycat中的核心概念及配置 核心概念 安装与配置 linux安装 4. My ...

  4. 数据库中间件:Mycat 权威指南+Mycat 实战笔记,双管齐下

    前阵子复习了一下消息中间件MQ系列的知识点,忽然想起还有个数据库中间件--MyCat! Mycat 是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代 ...

  5. MyCat介绍与配置(精)

    Mycat 前生今世 如果我有一个32核心的服务器,我就可以实现1个亿的数据分片,我有32核心的服务器么?没有,所以我至今无法实现1个亿的数据库分片.---Mycat's Plan Mycat 简介 ...

  6. Mycat安全权限配置user_配置mycat用户只读数据---MyCat分布式数据库集群架构工作笔记0031

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 咱们先总结一下,mycat可以,实现读写分离 我们做了读写分离对吧,然后 mycat还可以实现数据 ...

  7. 我的架构梦:(五十四) 分库分表实战及中间件之Mycat实战

    分库分表实战及中间件之Mycat实战 一. Mycat 简介 二.Mycat 核心概念 三.server.xml配置 四.schema.xml配置 五.rule.xml配置 六.Mycat实战 七.M ...

  8. mycat读写分离配置

    为什么使用MyCat         如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个 ...

  9. Linux下配置jupyter notebook远程访问实战:配置Jupyter的连接密码、启动jupyter服务、远程访问jupyter(关闭防火墙)

    Linux下配置jupyter notebook远程访问实战:配置Jupyter的连接密码.启动jupyter服务.远程访问jupyter(关闭防火墙) 目录 Linux下配置jupyter note ...

  10. Plotly绘制金融时间序列图实战:配置滑动控件

    Plotly绘制金融时间序列图实战:配置滑动控件 # 可视化金融时间序列数据并设置时间粒度组件: import plotly as py import plotly.graph_objs as go ...

最新文章

  1. cp: /usr/bin/chromedriver: Operation not permitted
  2. Magento 模版路径
  3. 软件测试中排错的基本方法
  4. 【机器学习算法专题(蓄力计划)】十八、机器学习中SVM算法中的硬间隔和软间隔
  5. 个人项目的设计与分析——类饿了么、美团式订餐类校园食堂版App“加个蛋”。...
  6. Python下调用Linux的Shell命令
  7. oracle日志查看问题?
  8. tabel表格制作及操作
  9. 力扣332. 重新安排行程(JavaScript)
  10. pycharm 中 pep8 检查开启.
  11. CentOS下使用SVN实现多项目管理配置方案
  12. 百度网页注册HTML代码
  13. matlab 产生瑞利信道,瑞利信道仿真 matlab
  14. 手机网速正常电脑很慢_电脑上网慢手机却很快如何解决_手机上网速度快电脑慢的解决方法-系统城...
  15. 【网络同步】浅析帧同步和状态同步
  16. API 网关和微服务介绍
  17. python中的os.listdir()方法、os.path.isdir()方法
  18. select下拉框分组展示插件的使用--(select-mania插件的使用)
  19. Codeforces Round #750 (Div. 2)E. Pchelyonok and Segments (数学+DP)
  20. python 绘图-时间显示

热门文章

  1. mysql xmlhttp_php_xmlhttp 乱码问题解决方法
  2. 多方安全计算、联邦学习、可信计算 对比区别
  3. 区块链 p2p点对点网络是什么
  4. windows 上网重新刷新IP
  5. gitlab查看word文档_gitlab迁移
  6. php基础之时间函数(date(), time(), microtime())
  7. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile
  8. ibatis 核心原理解析
  9. Http 理论基础-请求与响应、响应状态码汇总
  10. 微信小游戏 UserInfoButton 获取用户信息