当前位置: 代码迷 >> 综合 >> Mycat 水平拆分----分表
  详细解决方案

Mycat 水平拆分----分表

热度:97   发布时间:2023-12-15 00:50:09.0

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

每个表中 包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就

是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如下图:

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

Mycat原理图如下 :

Mycat和Mysql环境搭建如前几篇文章。

主/从机IP如下说明:

192.168.1.111       主机   dn1

192.168.1.109      从机   dn2

具体分表操作有如下几个步骤:

一. 选择分表字段

以 orders 表(表结构语句如下面)为例,可以根据不同字段进行分表

(1)id(主键、或创建时间)    查询订单注重时效,历史订单被查询的次数少,如此分片会造成一个节点访问多,一个访问少,不平均。

(2)customer_id(客户 id)    根据客户 id 去分,两个节点访问平均,一个客户的所 有订单都在同一个节点。故此处选择它来分表。

二.   修改schema.xml配置文件

添加table语句(如下截图),将orders表挂载在两个节点(dn1,dn2)上

vim /usr/local/mycat/conf/schema.xml

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

三. 修改分表规则---客户id(customer_id)取模

经过前面的分析,我们选择了客户id这个字段来作为分表字段。

在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,选择分片算法 mod-long(对字段求模运算),customer_id 对2个节点(dn1,dn2)求模。

根据结果分片配置算法 mod-long 参数 count 为 2,即两个节点。

说明:mod-long(mycat自带的算法)

vim /usr/local/mycat/conf/rule.xml

把 mod-long函数算法的节点数修改为2个节点,因为这里我们只有两个节点(dn1,dn2)

rule修改部分的源文件内容:

 <tableRule name="mod_rule"><rule><columns>customer_id</columns><algorithm>mod-long</algorithm></rule></tableRule>

四. 登录dn2上的mysql 创建orders这个表

在上节垂直分库中,我已经在dn1上创建了orders表,此处dn1上就不需要再创建表了

登录mysql:cd /usr/local/mysql/bin

./mysql -u root -p

创建订单表 语句如下:

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

五.  访问 Mycat 实现分片

1. 重启 Mycat,让配置生效

cd /usr/local/mycat/bin

./mycat console

2. 登录mycat

mysql -u mycat -p -h 192.168.1.111 -P 8066

密码:123456

3. 通过mycat插入数据到orders表中

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

4. 通过mycat查询刚刚我们插入的那6条数据(select * from orders;)

六. 分表操作结果分析

如下图所示,可以看出customer_id=100的数据通过取模操作,3条数据全部插入到了主机中(dn1)。

customer_id=101的通过取模操作,3条数据全部插入到了从机中(dn2)。

也就是说通过配置mycat中的rule.xml规则文件(这里选择的是对customer_id取模),将通过mycat插入的数据很好的分到了2个节点上的orders表中,从而达到了分表的目的,减轻了数据库的压力。