前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用mycat实现分库分表

使用mycat实现分库分表

原创
作者头像
不凡
修改2021-11-01 13:50:10
7270
修改2021-11-01 13:50:10
举报
文章被收录于专栏:运维小郭运维小郭

分库的原则:有紧密关联关系的表应该在一个库里,相互没有关联的表可以分配到不同的库里。

因为单个数据库达到了瓶颈,所以进行了分库操作,也就是说把单个数据库的表分配到不同的数据库中,分摊压力。

因为单个数据表达到了瓶颈,所以进行了分库操作,也就是说把数据库中的的单个表按字段进行拆分。(拆分的数据包不能在一个数据库中,否则就没有了意义)

一.垂直拆分----分库

1.修改 schema 配置文件

代码语言:txt
复制
vim /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>
            <table name="orders" dataNode="dn1" ></table>
            <table name="orders_detail" dataNode="dn1" ></table>
            <table name="dict_order_type" dataNode="dn1" ></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="master1" url="192.168.10.1: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="master2" url="192.168.10.2:3306" user="root" password="123456">
                </writeHost>
        </dataHost>
        
</mycat:schema>

2.新增两个空白库

代码语言:txt
复制
##在数据节点192.168.10.1和192.168.10.2上分别创建数据库 orders 
CREATE DATABASE orders;

3、 启动 Mycat

代码语言:txt
复制
./mycat console

4.访问mycat进行分库

代码语言:txt
复制
mysql -umycat -p123456 -h 192.168.10.1 -P 8066
use TESTDB

##下面命令是创建数据表
#客户表 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.分析

选择达到瓶颈的表,然后分析,需要根据哪一字段进行拆分。

我们这边拆分了orders表,按“customer_id”进行拆分。

2.修改配置文件schema.xml

`

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

<table name="orders" dataNode="dn1,dn2" rule="mod\\_rule" ></table>

  1. 修改配置文件 rule.xml

##在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,

##还有选择分片算法 mod-long(对字段求模运算),customer_id 对两个节点求模,根据结果分片

##配置算法 mod-long 参数 count 为 2,两个节点

##mod_rule是新添加的规则

4、 在数据节点 192.168.10.2上建 orders 表

`

mysql -uroot -p123456

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

代码语言:txt
复制
**5、 重启 Mycat,让配置生效** 

**`**

 cd /usr/local/mycat/bin/

./mycat restart

6、 验证是否分表成功:访问 Mycat 实现分片

`

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

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(6,102,100,100020);

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

代码语言:txt
复制
## 三. mycat的分片“”join“”(关联)

orders表已经进行的分表,orders\_detail如何与之关联呢?

如果orders\_detail部分表又会造成什么样的后果?

如果order\_detail不分表,当用户去查询数据时首先到mycat,mycat对sql进行分片分析,分别到两台数据库,这时mysql1上只有3条数据,同时也有orders\_detail的3条数据,成功返回mycat,但是将sql发给mysql2时,发现这台数据库没有orders\_detail表,这时就会进行报错,把信息交给mycat,mycat合并,结果报错。所以说orders\_detail必须分表。那么又该怎么分呢?

orders\_detail相当于是orders的子表,之间有紧密的关联性。

##修改 schema.xml 配置文件

##删除第8 9行。

![](https://ask8088-private-1251520898.cn-south.myqcloud.com/developer-images/article/8880527/ri7ooliv48.png?q-sign-algorithm=sha1&q-ak=AKID2uZ1FGBdx1pNgjE3KK4YliPpzyjLZvug&q-sign-time=1635739079;1635746279&q-key-time=1635739079;1635746279&q-header-list=&q-url-param-list=&q-signature=04867b59bd5103efd0d96a6f2cb0c5f659c430e9)

##在 dn2 创建 orders\_detail 表 

CREATE TABLE orders.orders_detail(id INT AUTO_INCREMENT,detail VARCHAR(2000), order_id INT, PRIMARY KEY(id));

##重启 Mycat

./mycat restart

##访问 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);

##在mycat、192.168.10.1, 192.168.10.2中运行两个表join语句

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

代码语言:txt
复制

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.垂直拆分----分库
  • 二. .水平拆分----分表
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档