Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)

简介: Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)

Mycat分片技术_水平拆分-分表



前言


上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题。


水平拆分


相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。


理解:


我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。


实现分表


1、 选择要拆分的表


MySQL 单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就 达到了瓶颈,会影响查询效率,需要进行水平拆分(分表)进行优化。


2、分表字段


以 orders 表为例,可以根据不同自字段进行分表


3、 修改配置文件 schema.xml


为 orders 表设置数据节点为 dn1、dn2,并指定分片规则为 mod_rule(自定义的名字)

<table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>


4、修改配置文件rule.xml


分片规则:


在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id, 还有选择分片算法 mod-long(对字段 求模运算),customer_id 对两个节点求模,根据结果分片.配置算法 mod-long 参数 count 为 2,两个节点。

<tableRule name="mod_rule">
  <rule>
   <columns>customer_id</columns>
   <algorithm>mod-long</algorithm>
  </rule>
</tableRule>
<function name="mod-long"    
class="io.mycat.route.function.PartitionByMod">
  <!-- how many data nodes -->
  <property name="count">2</property>
</function>


5、 在数据节点dn2上建orders表

create table orders(
  id int auto_increment,
  order_type int,
  customer_id int,
  amount decimal(10,2),
  primary key(id)
);


6、 重启Mycat,让配置生效

mycat restart


7、 访问Mycat实现分片

INSERT INTO
orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
INSERT INTO
orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO
orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO
orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO
orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO
orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);


实时学习反馈


1.Mycat技术中水平拆分主要解决___问题。


A 表字段多

B 表数据量大

C 兼容

D 并发


2.Mycat技术中水平拆分表时配置分片规则为取模时在_____配置文 件中修改。


A server.xml

B ehcache.xml

C rule.xml

D rule.xml


Mycat分片技术_ER表



分片 join


遇到问题: orders表分片了,那和他相关的orders_detail 表未分片, join联 查的时候, master1正常查询出结果, master2上由于没有 orders_detail 表,则报错, 最后聚合结果肯定也是错误的。


ER 表


将子表的存储位置依赖于主表,并且物理上紧邻存放因此彻底解决了JION的效率和性能问题,根据这一思路,提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。


修改配置文件schema.xml

<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
    <childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>


参数:


childTable:子表


Master2上没有订单详情表创建一下

create table orders_detail(
id int auto_increment,
order_id int,
detail varchar(200),
primary key(id)
);


重启Mycat服务

mycat restart


Mycat服务添加数据

insert into orders_detail(detail, order_id) values('detail1',1);
insert into orders_detail(detail, order_id) values('detail1',2);
insert into orders_detail(detail, order_id) values('detail1',3);
insert into orders_detail(detail, order_id) values('detail1',4);
insert into orders_detail(detail, order_id) values('detail1',5);


测试数据

select a.*,b.detail from orders a join orders_detail b on a.id=b.order_id;


实时学习反馈


1.Mycat技术中ER表解决___问题。


A 表字段多

B 表数据量大

C JOIN的效率和性能问题

D 数据节点多


2. Mycat技术中通过___标签配置ER表父子关系。


A child

B Table

C dataNode

D childTable


Mycat分片技术_全局表



全局表描述


在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典 表具有以下几个特性:


变动不频繁

数据量总体变化不大

数据规模不大,很少有超过数十万条记录。


全局表特征


全局表的插入更新操作会实时在所有节点上执行,保持各个分片的数据一致。

全局表的查询操作,只从一个节点获取。

全局表可以和任何一个表进行 JOIN 操作。


注意: 将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据JOIN 的难题。通过全局表+基 于E-R 关系的分片策略,Mycat 可以满足 80%以上的企业应用 开发。


配置全局表

<!--全局表配置比较简单,不用写 Rule 规则,修改schema.xml,如下配置即可-->
<table name="dict_order_type" dataNode="dn1,dn2" type="global"></table>


在dn2创建 dict_order_type 表

#订单类型字典表
create table dict_order_type(
  id int auto_increment,
  order_type varchar(200),
  primary key(id)
);


重启Mycat

mycat restart


Mycat上添加数据

insert into dict_order_type(id,order_type)values(101,'type1');
insert into dict_order_type(id,order_type)values(102,'type2');


测试数据

select * from dict_order_type;


实时学习反馈


1.Mycat技术中全局表主要解决___问题。


A 表数据量大

B 表字段多

C 变动不频繁和数据量总体不大的数据

D 代码量庞大,系统臃肿


2. Mycat技术中如何设置全局表____。


A global

B rule="mod_url"

C dataNode="global"

D type="global"

目录
相关文章
|
SQL 关系型数据库 MySQL
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
2271 0
|
关系型数据库 MySQL Java
MySQL单表膨胀优化之MyCat分库分表
MySQL单表膨胀优化之MyCat分库分表
404 0
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
1259 0
|
SQL 存储 关系型数据库
MySQL主从复制之原理&一主一从部署流程—2023.04
MySQL主从复制之原理&一主一从部署流程—2023.04
1965 0
|
算法 数据库
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
270 0
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
Java 关系型数据库 MySQL
MySQL 分库分表方案
本文总结了数据库分库分表的相关概念和实践,针对单张表数据量过大及增长迅速的问题,介绍了垂直和水平切分的方式及其适用场景。文章分析了分库分表后可能面临的事务支持、多库结果集合并、跨库join等问题,并列举了几种常见的开源分库分表中间件。最后强调了不建议水平分库分表的原因,帮助读者在规划时规避潜在问题。
1150 20
|
存储 Java API
【Java高手必备】揭秘!如何优雅地对List进行排序?掌握这几种技巧,让你的代码瞬间高大上!
【8月更文挑战第23天】本文深入探讨了Java中对List集合进行排序的各种方法,包括使用Collections.sort()、自定义Comparator以及Java 8的Stream API。通过示例代码展示了不同情况下如何选择合适的方法:从简单的整数排序到自定义类对象的排序,再到利用Comparator指定特殊排序规则,最后介绍了Stream API在排序操作中的简洁应用。理解这些技术的区别与应用场景有助于提高编程效率。
752 4
|
架构师 Java 数据中心
二阶段提交:确保分布式系统中数据一致性的关键协议
【10月更文挑战第16天】在分布式系统中,数据一致性的维护是一个至关重要的挑战。为了应对这一挑战,二阶段提交(Two-Phase Commit,简称2PC)协议应运而生。作为一种经典的分布式事务协议,2PC旨在确保在分布式系统中的所有节点在进行事务提交时保持一致性。
245 0
|
运维 负载均衡 关系型数据库
Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)
416 0