mycat E-R关系分片策略测试

1.E-R关系策略的由来

join是关系数据库最常用的一个特性,然而在分布式环境中,跨分片的join最复杂,最难解决。

这是官方文档的描述。

具体点,比如:
  mycat逻辑库hello,两张表格t1,t2。做了分库策略,t1放到了datanode1,t2放到了datanode2。如果我t1 join t2检索数据,
怎么办?

这就是E-R关系策略要解决的问题。

mycat借鉴了table group的概念,将子表的存储位置依赖于子表,并且在物理上紧邻存放,解决了join的效率和性能问题。E-R关系的数据分片策略,根据这一思路,将子表的记录和所关联的父表记录存放在同一个数据分片上。

2.测试官方教程文档上的E-R关系表

customer采用sharding-by-intfile(分片枚举)策略,分片在dn1,dn2上,orders依赖父表进行分片,两个表的关联关系为orders.customer_id=customer.id。示意图如下:

![](http://i2.51cto.com/images/blog/201712/21/1298cf4400570a0d5bcc4bdd40070e27.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
   rule="sharding-by-intfile">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>

</table>
  
  
   解释:

<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
   rule="sharding-by-intfile">

这一行是定义customer表,主键是id,分片部署在dn1,dn2,分片规则是sharding-by-intfile

<childTable name="orders" joinKey="customer_id" parentKey="id"/>
   
   这一行是定义orders是childtable。
   childtable是依赖父表的结构,就是前面时候的E-R关系的表。
   childtable的joinkey会按照父表的parentkey一起切分。

</table>
   这是对应  <table name=  的结束格式,参考xml格式。

3.

表格设计:

customer表
   id(primarykey)   name    city   (用city做分片)

orders表
   customer_id(primary key)    orders

两表格关系:
   customer表的主键id为orders表主键customer_id的外键

4.mycat上实际测试:

停止mycat服务,修改配置文件,如下:

[[email protected] conf]# cat schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="hello" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="t1" dataNode="dn1,dn2" rule="sharding-by-intfile" />

<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="t2" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="t3" dataNode="dn1" />
<table name="t4" dataNode="dn2" />
<table name="customer" primaryKey="id" dataNode="dn1,dn2"
   rule="sharding-by-intfile">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>

</table>
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="mysql1" database="db1" />
<dataNode name="dn2" dataHost="mysql3" database="db2" />

<dataHost name="mysql1" maxCon="1000" minCon="10" balance="3"
  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.211.138:3306" user="root"
   password="[email protected]">
</writeHost>
<writeHost host="hostS1" url="192.168.211.139:3306" user="root"
                                   password="[email protected]">
                </writeHost>

</dataHost>

<dataHost name="mysql3" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.211.142:3306" user="root"
                                   password="[email protected]">
                 <!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.211.142:3306" user="root" password="[email protected]"/>
</writeHost>
</dataHost>

</mycat:schema>

定义分片规则:

<tableRule name="sharding-by-intfile">
                <rule>
                        <columns>city</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>
                <property name="type">1</property>
                <property name="defaultNode">0</property>
        </function>

[[email protected] conf]# cat partition-hash-int.txt 
gz=0
sz=1

启动mycat,创建表格:

mysql> create table customer(id int not null primary key,name varchar(10),city varchar(20));
Query OK, 0 rows affected (0.11 sec)

mysql> create table orders (customer_id int not null primary key,orders int not null,foreign key(customer_id) references customer(id) 
on delete cascade on update cascade);
Query OK, 0 rows affected (0.25 sec)

customer插入数据测试:

mysql> insert into customer(id,name,city) values(1,'am1','gz'),(2,'am2','gz'),(3,'am3','sz');
   mysql> select * from customer where city='gz';
+----+------+------+
| id | name | city |
+----+------+------+
|  1 | am1  | gz   |
|  2 | am2  | gz   |
+----+------+------+
2 rows in set (0.08 sec)

mysql> explain select * from customer where city='gz';
+-----------+----------------------------------------------------+
| DATA_NODE | SQL                                                |
+-----------+----------------------------------------------------+
| dn1       | SELECT * FROM customer WHERE city = 'gz' LIMIT 100 |
+-----------+----------------------------------------------------+
1 row in set (0.01 sec)

gz的数据都在dn1实现了分片。

orders插入数据测试:

mysql> insert into orders(customer_id,orders) values(1,10001);
Query OK, 1 row affected (0.33 sec)

mysql> insert into orders(customer_id,orders) values(2,10002);
Query OK, 1 row affected (0.29 sec)

mysql> insert into orders(customer_id,orders) values(3,10003);
Query OK, 1 row affected (0.48 sec)

根据E-R分片规则,orders表格根据外键的值也就是customer的主键值切分,

也就是orders.customer_id=customer.id的数据分在一个区。

分别在db1,db2检索数据,看看是否达到E-R分片的设计要求。

原文地址:http://blog.51cto.com/goome/2058958

时间: 2024-10-19 20:21:21

mycat E-R关系分片策略测试的相关文章

【分库分表】sharding-jdbc—分片策略

一.分片策略 Sharding-JDBC认为对于分片策略存有两种维度: 数据源分片策略(DatabaseShardingStrategy):数据被分配的目标数据源 表分片策略(TableShardingStrategy):数据被分配的目标表 两种分片策略API完全相同,但是表分片策略是依赖于数据源分片策略的(即:先分库然后才有分表) 二.分片算法 Sharding分片策略继承自ShardingStrategy,提供了5种分片策略: 由于分片算法和业务实现紧密相关,因此Sharding-JDBC并

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

1.1    安装环境 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 1.2  安装步骤 Mycat有windows.linux多种版本.本教程为linux安装步骤,windows基本相同. 第一步:下载Mycat-server-xxxx-linux.tar.gz 第二步:将压缩包解压缩.建议将mycat放到/usr/local/mycat目录下. 第三步:进入mycat目录,启动mycat ./mycat start 停止: ./mycat st

关于创建主键和索引的关系一个小小测试

创建主键时,所对应的列如果没有索引,数据库默认会自动创建一个索引:如果对于列有索引,那么创建主键不会再创建索引.这里要注意,列值必须满足主键的要求(唯一,非空),简单测试如下: SQL> create table wxlun_pri(a number); Table created. SQL> alter table wxlun_pri add constraint PRIMARY_KEY_REPLY primary key (a);     ------创建主键约束 Table altere

MyCAT 源码解析 —— 分片结果合并(使用unsaferow)

1. 概述 2. 多分片执行 SQL 3. 合并多分片结果 3.1 记录头(header) 3.2 记录行(row) 3.1 AbstractDataNodeMerge 3.2 DataNodeMergeManager 3.3 UnsafeRow 3.4 UnsafeExternalRowSorter 3.5 UnsafeRowGrouper 4. 救护中心 ??????关注微信公众号:[芋道源码]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表

网络基础之--IP数据报、分片策略、路由表

IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成. 首部的前一部分是固定长度共 20 字节是所有 IP 数据报必须具有的. 在首部的固定部分的后面是一些可选字段其长度是可变的. IP 数据报首部的固定部分中的各字段 版本--占 4 位指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4) 首部长度--占 4 位可表示的最大数值是 15 个单位(一个单位为 4 字节)因此 IP 的首部长度的最大值是 60 字节. 区分服务--占 8 位用来获得更好的服务在旧标准中叫做服务

Cisco ASA和Juniper SRX/NetScreen的不同默认分片策略

这几今天一直在研究思科和Juniper防火墙建立IPSec VPN的MTU问题, 底层基础可以参考思科官方的这篇文章,讲解的十分详细: http://www.cisco.com/c/en/us/support/docs/ip/generic-routing-encapsulation-gre/25885-pmtud-ipfrag.html 顺便介绍Linux和Windows下两个测试Path MTU的两个小工具:http://packetlife.net/blog/2008/aug/18/pat

Solr commit 策略测试

已知Solr 的Commit策略: 服务器端: 1)AutoCommit 2)AutoSoftCommit 客户端 Commit 本次我测试了客户端关闭Commit的情况下,服务器端Commit策略的调整,对搜索的效果 首先,关闭了客户端的Commit,使用以下命令提交: curl 'http://localhost:8983/solr/core0/update?commit=false' -H 'Content-type:text/json' -d '[{"id":"2&q

mycat教程(二) —— mycat使用教程及分片方法案例

在完成mycat安装后, 开始一个示例来尽快熟悉mycat 一.环境说明 1. 服务器说明 服务器名称 地址 说明 mycat服务器 10.211.55.13 mycat中间件服务器 mysql服务器 10.211.55.9 mysql服务器 2. mysql 库和表说明 库名称 说明 db01 只有一个user表 db02 item表 db03 item表 db02,db03上的item表根据id%2取模保存数据, 也就是进行了数据分片 db01 创建表语句 CREATE TABLE `use

linux用户密码策略测试

1.linux普通用户默认密码策略: 用passwd修改用户密码,常常提示"BAD PASSWORD: it is based on a dictionary word".实际上linux要求的密码验证机制是在/etc/login.defs中规定最小密码字符数:同时还要受到/etc/pam.d/passwd的限定.但是在root用户下怎么设置都可以,可以不受验证机制的约束,即便出来"BAD PASSWORD: it is based on a dictionary word&