MyCAT枚举分片规则 & childTable

一、MyCAT 简介和原理

  MYCAT基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。MyCAT作为通用代理设计的,后端是以 Mysql协议 和 JDBC 的方式连接数据库,可以支持 Oracle、DB2、SQL Server 、 mongodb、mysql

这里简单分享一下 Mycat 中的概念及配置的相关基础 ,详细内容可以参考 官方文档 、 Mycat-Server 和 Get Start

数据库中间件

Mycat 其实只是一个数据中间件,或数据库代理

Tip: 所有难搞定的事情都可以通过中间件有效处理,中间件能有效解耦并专注于特定领域问题,LVM、LVS、MQ 都是这个思路(房屋中介,银行也都是这个思路)

所以Mycat没有存储引擎,本身并不存储数据,只是起到了请求分析,拆解,路由与结果聚合的作用,为前端应用提供统一接口,Mycat 与后端的数据库集群有机组合才一起构成一个分布式数据库系统


逻辑库(schema)

类似于LVM中VG的概念(VG由一个或多个PV构成),逻辑库是由一个或多个后端数据库构成的,展示给应用的是一个单一视图,是分布式数据库在逻辑上的一个抽象


逻辑表(table)

  • 逻辑表

与数据库中表相对应的,分布式数据表在逻辑上的一个抽象

  • 分片表

数据表切分后的一个部分(原表的一个真子集)

  • 非分片表

没有分片的表,就是非分片表

  • ER表

保留了实体关系特性的表,就是ER表

关系型数据库是基于实体关系模型的相关理论来构建的数据库,表与表间有依赖关系,通过表分组(Table Group) 让有依赖的表在同一实例库中从而避免了数据Join不会跨库操作

  • 全局表

全局表是所有分片上都有一份完整拷贝的表

字典表或符合字典特性的表可以被设置为全局表

有以下特点的表,被称作字典表:

  • 变动不频繁
  • 数据量总体变化不大
  • 数据规模不大(很少超过十万条记录)
  • 会与其它表发生关联

这类表可以通过冗余来解决join问题,也就是所有的分片都放上一份数据的拷贝来避免跨分片联查

Tip: 数据冗余和表分组是解决跨分片数据join的好思路,也是数据切分规划的重要规则

二、MyCAT使用测试

1、背景:schem.xml文件父表和子表,以及使用枚举分片规则

   #vim ./schema.xml   

          

                <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>

    #vim ./rule.xml

                            <tableRule name="sharding-by-intfile">

                                            <rule>

                                                    <columns>sharding_id</columns>

                                                    <algorithm>hash-int</algorithm>

                                            </rule>

                            </tableRule>

                            <function name="hash-int"

                                            class="io.mycat.route.function.PartitionByFileMap">

                                            <property name="mapFile">partition-hash-int.txt</property>

                           </function>

    #vim partition-hash-int.txt

                           1=0

                           2=1

                           10000=0

                           10010=1

2、登陆mycat后分别建立对应的表以及插入数据

mycat@TESTDB 08:08:56>show create table customer;

+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table    | Create Table                                                                                                                                                                                                                |

+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| customer | CREATE TABLE `customer` (

  `SHARDING_ID` int(11) DEFAULT NULL,

  `id` int(11) NOT NULL,

  `customer_id` int(11) DEFAULT NULL,

  `order_id` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)

mycat@TESTDB 07:19:09>insert into customer(SHARDING_ID,id,customer_id,order_id) values (1,1,1,1);

Query OK, 1 rows affected (0.05 sec)

mycat@TESTDB 07:19:09>insert into customer(SHARDING_ID,id,customer_id,order_id) values (2,2,2,2);

Query OK, 1 rows affected (0.05 sec)

mycat@TESTDB 07:54:27>select * from customer;

+-------------+----+-------------+----------+

| SHARDING_ID | id | customer_id | order_id |

+-------------+----+-------------+----------+

|           2 |  2 |           2 |        2 |

|           1 |  1 |           1 |        1 |

+-------------+----+-------------+----------+

2 rows in set (0.02 sec)

mycat@TESTDB 07:43:10>show create table orders;

+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table  | Create Table                                                                                                                                                                                                 |

+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| orders | CREATE TABLE `orders` (

  `SHARDING_ID` int(11) DEFAULT NULL,

  `id` int(11) NOT NULL,

  `customer_id` int(11) DEFAULT NULL,

  `customer_name` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

    

mycat@TESTDB 07:43:57>insert into orders(SHARDING_ID,id,customer_id,customer_name) values (1,1,1,'qw');

Query OK, 1 row affected (0.24 sec)

mycat@TESTDB 07:44:39>insert into orders(SHARDING_ID,id,customer_id,customer_name) values (1,2,1,'qw');

Query OK, 1 row affected (0.25 sec)

mycat@TESTDB 07:44:45>insert into orders(SHARDING_ID,id,customer_id,customer_name) values (1,3,1,'qw');

Query OK, 1 row affected (0.24 sec)

mycat@TESTDB 07:44:45>insert into orders(SHARDING_ID,id,customer_id,customer_name) values (1,3,3,'qw');

ERROR 1064 (HY000): can't find (root) parent sharding node for sql:insert into orders(SHARDING_ID,id,customer_id,customer_name) values (1,3,3,'qw')

mycat@TESTDB 07:45:50>select * from orders;

+-------------+----+-------------+---------------+

| SHARDING_ID | id | customer_id | customer_name |

+-------------+----+-------------+---------------+

|                    2 |  1 |                 1 | qw           |

|                    2 |  2 |                 2 | qw           |

|                    1 |  3 |                 2 | qw           |

+-------------+----+-------------+---------------+

3 rows in set (0.01 sec)

mycat@TESTDB 07:53:01>show create table order_items;

+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table       | Create Table                                                                                                                                                                       |

+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| order_items | CREATE TABLE `order_items` (

  `SHARDING_ID` int(11) DEFAULT NULL,

  `order_id` int(11) DEFAULT NULL,

  `order_name` varchar(15) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)

mycat@TESTDB 07:53:59>insert into order_items(SHARDING_ID,order_id,order_name) values (1,1,'qw');

Query OK, 1 row affected (0.05 sec)

mycat@TESTDB 07:55:17>insert into order_items(SHARDING_ID,order_id,order_name) values (1,2,'qw');

Query OK, 1 row affected (0.07 sec)

mycat@TESTDB 07:55:30>insert into order_items(SHARDING_ID,order_id,order_name) values (1,3,'qw');

Query OK, 1 row affected (0.07 sec)

mycat@TESTDB 07:55:52>insert into order_items(SHARDING_ID,order_id,order_name) values (1,4,'qw');

ERROR 1064 (HY000): can't find (root) parent sharding node for sql:insert into order_items(SHARDING_ID,order_id,order_name) values (1,4,'qw')

mycat@TESTDB 07:56:21>select * from order_items;

+-------------+----------+------------+

| SHARDING_ID | order_id | order_name |

+-------------+----------+------------+

|                1 |               2 | qw        |

|                1 |               3 | qw        |

|                1 |               1 | qw        |

+-------------+----------+------------+

3 rows in set (0.02 sec)

mycat@TESTDB 08:09:45>show create table customer_addr;

+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table         | Create Table                                                                                                                                                                               |

+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| customer_addr | CREATE TABLE `customer_addr` (

  `SHARDING_ID` int(11) DEFAULT NULL,

  `customer_id` int(11) DEFAULT NULL,

  `customer_name` varchar(15) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)

mycat@TESTDB 07:57:59>insert into customer_addr(SHARDING_ID,customer_id,customer_name) values (1,1,'qw');

Query OK, 1 row affected (0.26 sec)

mycat@TESTDB 07:58:28>insert into customer_addr(SHARDING_ID,customer_id,customer_name) values (1,2,'qw');

Query OK, 1 row affected (0.05 sec)

mycat@TESTDB 07:58:32>insert into customer_addr(SHARDING_ID,customer_id,customer_name) values (1,3,'qw');

ERROR 1064 (HY000): can't find (root) parent sharding node for sql:insert into customer_addr(SHARDING_ID,customer_id,customer_name) values (1,3,'yue')

mycat@TESTDB 08:04:42>select * from customer_addr;

+-------------+----+-------------+---------------+

| SHARDING_ID | id | customer_id | customer_name |

+-------------+----+-------------+---------------+

|           1 |  1 |           1 | qw            |

|           1 |  2 |           2 | qw            |

|           1 |  3 |           2 | qw            |

+-------------+----+-------------+---------------+

3 rows in set (0.01 sec)

3、分片表子表配置 childTable标签:

  1. name属性
  2. joinKey属性:插入子表的时候会使用这个列的值查找父表存储的数据节点。
  3. parentKey属性:属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinkey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。
  4. primaryKey属性:同table标签所描述的。
  5. needAddLimit属性:同table标签所描述的。

总结:子表中的joinKey="***_id"字段取值取决于父表primaryKey="ID"中的值,不然会报错(简单说joinKey是primaryKey的外键)

时间: 2024-04-20 17:09:19

MyCAT枚举分片规则 & childTable的相关文章

MySQL系列教程(五)

MyCAT MyCat是基于阿里开源的Cobar产品而研发,Cobar的稳定性.可靠性.优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远.业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品. MYCAT背后有一支强大的技术团队,其参与者都是5年以上资深软件工程师.架构师.DBA等,优秀的技术团队保证了MYCAT的产品质量.MYCAT并不依托于任

一步一步在Windows中使用MyCat负载均衡 上篇

传统关系型数据库的分布式开发通常需要自己做,不仅耗时耗力而且效果不是很理想,当想快速搭建时,最初想到的是看有没有第三方,网上牛人还是很多的,做得比较好的其中之一Mycat,它是开源的分布式数据库系统,解决数据库的负载均衡,主备复制,读写分离,简单来说就是你只管直接与mycat通讯,至于分离什么的交给它里面自己做,其它啥都不用操心. 至于什么是MyCat有什么优势,可以看看官网介绍  Mycat 数据库分库分表中间件 . 上图是MyCat架构图. MyCat可以与HAProxy使用实现高可用数据库

Mysql分库分表Mycat详解介绍

一直对Mysql分库分表有点兴趣,但是也一直停留在有兴趣的阶段,没有遇到能应用的场景.人生苦短,与其等一个机会,不如自己创造吧.稍微调研了下,选择使用 Mycat 这样一款开源产品.没有什么特别的理由,也不去讨论挖掘机哪家强,只是为了学习. 本机环境 电脑环境:Ubuntu 16.04 JDK:1.8 Docker version 1.11.2 Mysql 5.7.13 Mycat 1.5-RELEASE Navicat for Mysql 安装Mysql 为了测试方便,Mysql都跑在Dock

[项目构建 十四]babasport Mycat配置及使用详解.

首先我们来看下什么是Mycat:MyCat:开源分布式数据库中间件, 这里定义的很简单, 就是分布式数据库的中间件. 其实Mycat 是可以时mysql进行集群的中间件, 我们可以对mysql来分库分表 来应对日益增长的数据量. 每台机器只存少量数据, 数据总和是分布式的机器上数据量总和. 例如我们一个表中有512条数据(当然实际情况可能有成千上万条数据), 那么现在我们有三台机器装有mysql数据库, 我们想将这些数据按照一定规则的存储在三台机器上, 那么我们设定规则: 表的id%/512 取

Mycat分库分表的简单实践

   MySQL的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错. 关于分库分表     当然自己也理了一下,分库分表的这些内容,如果分成几个策略或者阶段,大概有下面的几种. 最上面的第一种是直接拆表,比如数据库db1下面有test1,test2,test3三个表,通过中间件看到的还是表test,里面的数据做了这样的拆分,能够咋一定程度上分解压力,如果细细品来,和分区表的套路有些像.   接下来的几类也是不断

MyCAT部署及实现读写分离(转)

MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之.于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显.这篇文章主要是MyCAT的入门部署. 一.安装java 因Mycat是用java开发的,所以需要在实验环境下安装java,官方建议jdk1.7及以上版本 Java Oracle官方下载地址为: http://www.oracle.com/technetwork/java/javase/archive-139210.html   解压j

Informix动态服务器表分片策略的计划和调整

"数据分片"允许在表一级对数据存储进行控制."表分片"是INFORMIX数据库的一个特征.用户可以对表中的记录或索引进行分组,并且存储在不同的位置,这样可以将数据存储到多个磁盘上,从而减少对磁盘I/O的竞争.数据分片的方案以及分片数据所存放的一组dbspace构成了"分片策略".数据分片有两种基本类型:基于轮转分片"和 "基于表达式分片",对于"基于轮转法分片",正如其名字一样,数据是根据轮转法方

数据库分区分片框架

序言 一直在做企业应用,目前要做一些互联网应用,当然只是应用是放在互联网的,数据量距离真正的互联网应用还是有相当大的差距的.但是不可避免的,在数据库出现瓶颈的情况还是有的,现在做互联网上的应用,当然也要未雨绸缪,要考虑数据量大的时候的解决方案. 这个目前开源的商用的也都有不少解决方案,一来,做技术的都有这么个臭毛病,即使是使用别人的方案,自己也要搞清楚内部的一些实现机制,这样才会有真正的体会,否则去评估一个方案的时候,就只能盲人摸象了. 为此,构建一个验证型的分布式数据库框架,来解决数据库的垂直

浅析python中的分片与截断序列_python

序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的第一个元素:且切片不包括右边界,例如[0:3]代表元素0.1.2不包括3. l=['a','b','c','d',5] 1.获取列表的前3个元素 >>> l[0:3] ['a', 'b', 'c'] >>> l[:3] ['a', 'b', 'c'] 2.获取列表的后3个元素 >>> l[-