MyCat高可用集群(四)数据库水平拆分——分表

MyCat高可用集群

第一章 MyCat的安装,实现数据读写分离

第二章 搭建MySQL双主双从服务器

第三章 数据库垂直拆分——分库

第四章 数据库水平拆分——分表

第五章 基于HAProxy的MyCat高可用集群

第六章 Mycat监控——Mycat-web

第七章 Mycat安全设置



前言

当单个表的行数超过200万行时,读写性能会下降,影响查询效率,此时需要进行水平拆分(分表)进行优化。

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。


一、环境准备

三台CentOS7虚拟机

名称 主机名 IP
MyCat centos7_1 192.168.80.70
M1(dn1) centos7_2 192.168.80.20
M2 (dn2) centos7_3 192.168.80.30

二、实现分表

1、分表字段

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

分段字段 效果
id(主键、或创建时间) 查询订单注重时效,历史订单被查询的次数少,如此分片会造成一个节点访问多,一个访问少,不平均。
customer_id(客户id) 根据客户id去分,两个节点访问平均,一个客户的所有订单都在同一个节点

2、修改配置文件

#修改schema.xml文件
#为orders表设置数据节点为dn1、dn2,并指定分片规则为mod_rule(自定义的名字)
vim schema.xml
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>
在这里插入图片描述

#修改配置文件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>

3、在数据节点dn2(M2)上建orders表
#分库的时候只有dn1有orders表,分表需要两个节点都有orders库

#订单表
CREATE TABLE orders(
	id INT AUTO_INCREMENT,
	order_type INT,
	customer_id INT,
	amount DECIMAL(10,2),
	PRIMARY KEY(id)  
);

4、重启Mycat
./mycat console

5、访问Mycat实现分片

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

#访问Mycat
mysql -umycat -p123456 -P8066 -h 192.168.80.70
#切换到TESTDB
USE TESTDB;
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(7,102,102,100020);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(8,102,103,100020);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(9,102,104,100020);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(10,102,105,100020);

#在mycat、dn1、dn2中查看orders表数据,分表成功

SELECT * FROM orders;
在这里插入图片描述

#查看M1、M2中的数据
在这里插入图片描述

三、Mycat 的分片join查询

Orders订单表已经进行分表操作了,和它关联的orders_detail订单详情表要进行join查询。因此orders_detail也要进行分片操作。

1、ER表

Mycat借鉴了NewSQL 领域的新秀Foundation DB 的设计思路,Foundation DB 创新性的提出了Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION 的效率和性能问题,根据这一思路,提出了基于E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。

#修改schema.xml配置文件,在orders内添加childTable

<table name="orders" dat
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值