在分库分表时,我们先安装好mycat:https://blog.csdn.net/wangyunzhao007/article/details/107330854

一、垂直切分

按照业务模块进行切分,将不同模块的表切分到不同的数据库中。

垂直切分很简单,我们需要在修改配置文件/usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><table name="customer" dataNode="dn2" ></table></schema><dataNode name="dn1" dataHost="host1" database="orders" /><dataNode name="dn2" dataHost="host2" database="orders" /><dataHost name="host1" 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.157.130:3306" user="root"password="123456"></writeHost></dataHost><dataHost name="host2" 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.157.129:3306" user="root"password="123456"></writeHost></dataHost></mycat:schema>

配置分析(我是做了130和129的主从的,复制的库名为zhao,不能用同名的库。其实这里应该用两台主机的地址的,读主机配置自己的从机)

我们分别登录129和130的mysql,执行以下语句

#登录mysql
mysql -uroot -p123456
#创建orders库
CREATE DATABASE orders;

然后我们重启mycat

./mycat console

使用mycat数据操作窗口建立四个表,建表语句如下

#登录mycat的数据操作窗口,ip为安装mysql的地址,不用和mysql在一起机器
mysql -umycat -p123456 -h 192.168.157.130 -P8066

建表语句如下:

#客户表 rows:20万
CREATE TABLE customer(
id INT AUTO_INCREMENT,
NAME VARCHAR(200),
PRIMARY KEY(id)
);
#订单表 rows:600万
CREATE TABLE orders(
id INT AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
#订单详细表 rows:600万
CREATE TABLE orders_detail(
id INT AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id)
);
#订单状态字典表 rows:20
CREATE TABLE dict_order_type(
id INT AUTO_INCREMENT,
order_type VARCHAR(200),
PRIMARY KEY(id)
);

然后我们可以看到分库成功!

二、水平切分

将一张大表按照一定的切分规则,按照行切分到不同的表或者不同的库中。

1.根据字段分类

1)修改配置文件 /usr/local/mycat/conf/schema.xml

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

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

如下图

2)修改配置文件/usr/local/mycat/conf/rule.xml

  1. 在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,
  2. 还有选择分片算法 mod-long(对字段求模运算) , customer_id 对两个节点求模,根据结果分片
  3. 配置算法 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>

3)重启Mycat,让配置生效

./mycat console

4)在数据节点 dn2 上建 orders 表

建表语句如上

5) 插入数据

在 mycat 里向 orders 表插入数据, INSERT 字段不能省略

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

6)验证是否分片成功

在mycat(使用mycat数据操作窗口登录)、 dn1(130数据库)、 dn2(129数据库)中查看orders表数据,分表成功

拓展知识:mycat的分片join

Orders 订单表已经进行分表操作了,和它关联的 orders_detail 订单详情表如何进行 join 查询。

1)修改 schema.xml 配置文件

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

2)dn2 创建 orders_detail 表

建表语句如上

3)重启mycat

./mycat console

4)访问 Mycat的数据操作窗口 向 orders_detail 表插入数据

INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1);
INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6);

5) 在mycat、 dn1、 dn2中运行两个表join语句

Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;

结果如下:

 ​

2.全局表

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

  • 变动不频繁
  • 数据量总体变化不大
  • 数据规模不大,很少有超过数十万条记录

鉴于此, Mycat 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:

  • 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
  • 全局表的查询操作,只从一个节点获取
  • 全局表可以跟任何一个表进行 JOIN 操作

1)修改 schema.xml 配置文件

<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>

 ​

2)在dn2 创建 dict_order_type 表

建表语句如上

3)重启 Mycat

./mycat console

4)访问 Mycat 向 dict_order_type 表插入数据

INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1');
INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2');

5)在Mycat、 dn1、 dn2中查询表数据

select * from dict_order_type;

3.分片枚举

通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则。

1) 修改schema.xml配置文件

<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>

2) 修改rule.xml配置文件

<tableRule name="sharding_by_intfile"><rule><columns>areacode</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>

配置文件标签解释

  1. columns:分片字段, algorithm:分片函数
  2. mapFile: 标识配置文件名称, type: 0为int型、 非0为String,
  3. defaultNode: 默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
  4. 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错

3) 修改partition-hash-int.txt配置文件

110=0
120=1

4) 重启 Mycat

代码如上

5) 访问Mycat创建表

#订单归属区域信息表
CREATE TABLE orders_ware_info
(
`id` INT AUTO_INCREMENT comment '编号',
`order_id` INT comment '订单编号',
`address` VARCHAR(200) comment '地址',
`areacode` VARCHAR(20) comment '区域编号',
PRIMARY KEY(id)
);

6) 插入数据

INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'北京','110');
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'天津','120');

7) 查询Mycat、 dn1、 dn2可以看到数据分片效果

4.范围约定

此分片适用于,提前规划好分片字段某个范围属于哪个分片。

1) 修改schema.xml配置文件

<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>

2) 修改rule.xml配置文件

<tableRule name="auto_sharding_long"><rule><columns>order_id</columns><algorithm>rang-long</algorithm></rule>
</tableRule>
<function name="rang-long"class="io.mycat.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property><property name="defaultNode">0</property>
</function>

3) 修改autopartition-long.txt配置文件

0-102=0
103-200=1

4) 重启 Mycat

命令如上

5) 访问Mycat的数据操作窗口创建表

#支付信息表
CREATE TABLE payment_info
(
`id` INT AUTO_INCREMENT comment '编号',
`order_id` INT comment '订单编号',
`payment_status` INT comment '支付状态',
PRIMARY KEY(id)
);

6) 插入数据

INSERT INTO payment_info (id,order_id,payment_status) VALUES (1,101,0);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (2,102,1);
INSERT INTO payment_info (id,order_id ,payment_status) VALUES (3,103,0);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (4,104,1);

7) 查询Mycat、 dn1、 dn2可以看到数据分片效果

select * from payment_info;

5.按日期(天)分片

此规则为按天分片。 设定时间格式、范围

1) 修改schema.xml配置文件

<table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table>

2) 修改rule.xml配置文件

<tableRule name="sharding_by_date"><rule><columns>login_date</columns><algorithm>shardingByDate</algorithm></rule>
</tableRule>
<function name="shardingByDate" class="io.mycat.route.function.PartitionByDate"><property name="dateFormat">yyyy-MM-dd</property><property name="sBeginDate">2019-01-01</property><property name="sEndDate">2019-01-04</property><property name="sPartionDay">2</property>
</function>

配置文件标签解释:

  • columns:分片字段, algorithm:分片函数
  • dateFormat :日期格式
  • sBeginDate :开始日期
  • sEndDate:结束日期,则代表数据达到了这个日期的分片后循环从开始分片插入
  • sPartionDay :分区天数,即默认从开始日期算起,分隔 2 天一个分区

3) 重启 Mycat

命令如上

4) 访问Mycat数据操作窗口创建表

#用户信息表
CREATE TABLE login_info
(
`id` INT AUTO_INCREMENT comment '编号',
`user_id` INT comment '用户编号',
`login_date` date comment '登录日期',
PRIMARY KEY(id)
);

5) 插入数据

INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2019-01-01');
INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2019-01-02');
INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2019-01-03');
INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2019-01-04');
INSERT INTO login_info(id,user_id,login_date) VALUES (5,103,'2019-01-05');
INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2019-01-06');

6) 查询Mycat、 dn1、 dn2可以看到数据分片效果

select * from login_info;

【mycat】分库分表相关推荐

  1. mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置

    一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件,运行在代码应用和MySQL数据库之间的应用. 前身: corb ...

  2. docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...

    一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...

  3. MySQL单表膨胀优化之MyCat分库分表

    MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...

  4. 利用MyCAT分库分表

    文章目录 MyCAT分库分表 一.分库分表简介 二.垂直切分---分库 1.思想 2.配置实现 三.水平切分 MyCAT分库分表 一.分库分表简介 在业务数据量过多的时候,而且数据不断持续增长的情况下 ...

  5. MyCat分库分表和读写分离

    文章目录 1.MyCat 1.1.MyCat简介 1.2.Mycat对多数据库的支持 1.3.MyCAT架构 1.4.MyCat分库分表 1.5.MyCat下载与安装 1.5.1.下载mycat 1. ...

  6. mycat分库分表与读写分离

    mycat分库分表与读写分离 Dockerfile搭建mycat 1.创建mycat的配置文件 #新建目录 mkdir /docker/mycat#切换目录 cd /docker/mycat#下载my ...

  7. mycat分库分表demo

    关于Mycat,它是一个阿里的开源项目,用来解决分库分表的海量数据存储和查询优化,关于它的简介,可以直接参考介绍:Mycat简介. 下面对自己的demo做个记录: 我之前从192.168.68.3克隆 ...

  8. 细讲MyCat分库分表策略

    作为服务端模式的典型代表,MyCat不仅提供了丰富的分库分表策略,也提供了非常灵活的读写分离策略,并且其对客户端的侵入性是非常小的.本文主要讲解MyCat主要提供的分库分表策略,并且还会讲解MyCat ...

  9. 【mycat】mycat分库分表

    mycat分库分表 Mycat2 一大优势就是可以在终端直接创建数据源.集群.库表,并在创建时指定 分库.分表. 操作之前,请先启动一主一从的mysql服务,启动mycat服务 以下步骤不是必须,看自 ...

  10. mycat分库分表+springcloud微服务小案例实现

    文章目录 1. MyCat综合案例 1.1 案例概述 1.1.1 案例介绍 1.1.2 系统架构 1.1.3 技术选型 1.2 案例需求 1.3 案例环境搭建 1.3.1 数据库 1.3.2 工程预览 ...

最新文章

  1. 泛型擦除机制、自定义注解、代理、反射
  2. python开发工具管理系统_Python开发桌面软件文档及网址管理工具,强迫症的福音...
  3. 写一个c语言的链表记录一下
  4. java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕
  5. oracle12C 创建用户学习
  6. Flutter之Widget 更新机制updateChild原理浅析
  7. PreferenceScreen 中如何自定义SwitchPreferenceCompat的布局
  8. 用计算机如何打对数,怎样使用科学计算器计算对数?
  9. Apache AXIS 1.4 RCE
  10. 基于百度AI平台Python实现人像动漫画
  11. 你未必知的拼音打字快打十招
  12. case when then 后返回多个值
  13. js实现几秒倒计时之后自动跳转页面
  14. 查询单号物流信息是否揽收教你一键操作
  15. php去除换行(回车换行)的三种方法
  16. 相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?
  17. quartus频率计 时钟设置_Quartus II EDA频率计设计
  18. mysql select符合查询_mysql学习-select查询,子查询,联接查询,union,intersect,except联合...
  19. [机缘参悟-66]:深度思考-廉价的情绪抚慰
  20. 大数据平台架构:数据平台建设的几种方案

热门文章

  1. linux 内核函数 copy_from_user和copy_to_user 介绍
  2. RPC RESTful 解释
  3. Binwalk固件分析利器
  4. 关于SysinternalsSuite全部工具【详解】
  5. 框架、文档、视图类之间的调用关系
  6. design principle:java 回调与委派/委托机制
  7. (五)OpenStack---M版---双节点搭建---Nova安装和配置
  8. 算法 求一个数组的最长递减子序列 C
  9. arm-linux-gcc makefile,ARM-LINUX-GCC简易万能makefile
  10. junit5_使用junit做其他事情