当前位置:网站首页>mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)
mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)
2022-07-31 02:30:00 【倾心*】
主从关系
准备三台不同ip的虚拟机
(第一批)主从关系的配置
主192.168.47.131 配置/etc/my.cnf,在【mysqld】下配置
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
接着在这儿配置
server-id=1
log-bin=/var/lib/mysql/mysqlbin
read-only=0
binlog-ignore-db=mysql从192.168.47.132 配置/etc/my.cnf,在【mysqld】下配置,主从关系的id不一致(切记)
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
接着在这儿配置
server-id=2
log-bin=/var/lib/mysql/mysqlbin设置读写分离balance=3,将读请求writehost对应的标签readhost上,数据库从表与主表的数据不一致,springboot会读到从表的数据 因为从表是读操作
在主终端查看主节点状态
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| mysqlbin.000003 | 2168 | | mysql | |
+-----------------+----------+--------------+------------------+-------------------+在从终端设置主从关系
mysql> change master to master_host= '192.168.47.131', master_user='root', master_password='123456', master_log_file='mysqlbin.000003', master_log_pos=2168;
Query OK, 0 rows affected, 8 warnings (0.00 sec)运行show slave status\G;
可看到yes yes 必须是这两项 否则主从没有配置起来

常用命令
开启主从关系 start slave;
关闭主从关系 stop slave;
重置主节点 reset master;
查看主从关系的状态 show slave status\G;
垂直分库的配置
为了避免虚拟机过多 停掉主从关系 stop slave;
(第一批)垂直分库的配置
scehma.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- schema定义逻辑库的标签 name:逻辑库的名称 dataNode:表示逻辑库关联的节点名称 -->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"></table>
</schema>
<!-- dataNode:定义节点 name:节点名称必须和上面schema的dataNode值保持一致 dataNode:关联的主机名
database:关联的实际数据库名称
-->
<dataNode name="dn1" dataHost="host1" database="my_order" />
<dataNode name="dn2" dataHost="host2" database="my_consumer" />
<!-- name:数据主机的名称 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 按照心跳机制来判断真实的数据库是否正常运行-->
<heartbeat>select user()</heartbeat>
<!-- 配置主节点的信息 -->
<writeHost host="hostM1" url="192.168.47.131:3306" user="root"
password="123456">
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 按照心跳机制来判断真实的数据库是否正常运行-->
<heartbeat>select user()</heartbeat>
<!-- 配置主节点的信息 -->
<writeHost host="hostM1" url="192.168.47.132:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>测试垂直分库
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
mysql> CREATE TABLE customer(
-> id INT AUTO_INCREMENT,
-> NAME VARCHAR(200),
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> CREATE TABLE orders(
-> id INT AUTO_INCREMENT,
-> order_type INT,
-> customer_id INT,
-> amount DECIMAL(10,2),
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE orders_detail(
-> id INT AUTO_INCREMENT,
-> detail VARCHAR(2000),
-> order_id INT,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE dict_order_type(
-> id INT AUTO_INCREMENT,
-> order_type VARCHAR(200),
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> select *from customer;
Empty set (0.05 sec)
mysql> select *from orders;
Empty set (0.00 sec) 分表完成 在不同的数据库中
垂直具体配置详解

水平分库
mysql中单表的储存条数是有限制的 最大达到10000条 那么如何在10000条之后继续延续表中的数据呢 使用mycat进行水平分表 当一个表中的条数有限时 可以在其他数据库延续相同数据字段表的条数 进行水平拆分假如表中的数据有10000条 那么进行水平拆分时另一个数据库中的表就有5000条 这就是水平拆分
总节点数(有多少个数据库)数对客户id取余 余数为0在一个表 余数为1在另一个表
在schema.xml中配置

在rule.xml文件中配置
<tableRule name="mod_rule">
<rule>
#以customer_id最为水平拆表的标准
<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>
#此处count=2是根据当前的业务量决定可以变化
</function>想要水平拆分表中数据 本数据库要创建与被拆分表的相同字段的表
不能进行没有字段的插入语句,否则会报错
mysql> INSERT INTO orders VALUES (1,101,100,100100);
ERROR 1064 (HY000): partition table, insert must provide ColumnList正确操作
[[email protected] ~]# mysql -umycat -p123456 -P 8066 -h192.168.47.133
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES;
+--------------------+
| Tables_in_my_order |
+--------------------+
| customer |
| orders |
| dict_order_type |
| orders_detail |
+--------------------+
4 rows in set (0.01 sec)
mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
(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);Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
Query OK, 1 row affected (0.02 sec)
mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
Query OK, 1 row affected (0.01 sec)最终结果customer_id 100对2取余为0 在一数据库表 101对2取余为1在另一个数据库表
显然 1 2 6 余数为0 3 4 5 余数为1

水平分表完成
mycat分片join进行联表查询
orders已经进行分表操作了 那么和它关联的order_detail订单详情表如何进行join查询 此时也要对orders_detail进行分片操作 想要关联查询 有外键的是子表 主表没有外键
子表的记录与所关联父表的记录放在同一个数据分片上
分片也就是关联表的配置
在schema.xml文件中,具体配置如下

验证时在my_consumer数据库中添加订单详情表
#订单详细表 rows:600万
CREATE TABLE orders_detail(
id INT AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id)
);重启mycat 进入mycat终端测试
进入mycat安装目录的bin下 ./mycat console
mysql> use TESTDB;(切记 不要忘记切换数据库 这个非常容易出错 数据库不对 就连接不上 操作不了)
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
#进行插入数据(订单详情)
mysql> INSERT INTO orders_detail(id,detail,order_id) values(61,'detail61',1);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(62,'detail62',2);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(63,'detail63',3);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(64,'detail64',4);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(65,'detail65',5);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(66,'detail66',6);
Query OK, 1 row affected (0.06 sec)
#进行联表查询 可以看到查询成功 在订单表中可以看到订单详情
mysql> select * from orders as o inner join orders_detail as od on o.id=od.order_id;
;
+----+------------+-------------+-----------+----+----------+----------+
| id | order_type | customer_id | amount | id | detail | order_id |
+----+------------+-------------+-----------+----+----------+----------+
| 1 | 101 | 100 | 100100.00 | 61 | detail61 | 1 |
| 2 | 101 | 100 | 100300.00 | 62 | detail62 | 2 |
| 6 | 102 | 100 | 100020.00 | 66 | detail66 | 6 |
| 3 | 101 | 101 | 120000.00 | 63 | detail63 | 3 |
| 4 | 101 | 101 | 103000.00 | 64 | detail64 | 4 |
| 5 | 102 | 101 | 100400.00 | 65 | detail65 | 5 |
+----+------------+-------------+-----------+----+----------+----------+
6 rows in set (0.02 sec)
联表查询结果
mysql> select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;
+----+------------+-------------+-----------+----------+
| id | order_type | customer_id | amount | detail |
+----+------------+-------------+-----------+----------+
| 3 | 101 | 101 | 120000.00 | detail63 |
| 4 | 101 | 101 | 103000.00 | detail64 |
| 5 | 102 | 101 | 100400.00 | detail65 |
| 1 | 101 | 100 | 100100.00 | detail61 |
| 2 | 101 | 100 | 100300.00 | detail62 |
| 6 | 102 | 100 | 100020.00 | detail66 |
+----+------------+-------------+-----------+----------+
6 rows in set (0.01 sec)分片完成 联表查询完成 完美 说明一下mycat不支持mysql8.0.28 本人亲自踩坑 建议实验mysql5.7系列版本
提供建表语句
#客户表 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)
);边栏推荐
- Introduction to flask series 】 【 flask - using SQLAlchemy
- Pythagorean tuple od js
- Modbus on AT32 MCU
- 经典链表OJ强训题——快慢双指针高效解法
- PDF split/merge
- 系统需求多变如何设计
- Drools Rule Properties, Advanced Syntax
- leetcode-128: longest continuous sequence
- Drools basic introduction, introductory case, basic syntax
- 曼城推出可检测情绪的智能围巾,把球迷给整迷惑了
猜你喜欢

Force buckled brush the stairs (7/30)

Huawei od dice js

934. The Shortest Bridge

MPPT solar charge controller data collection - through the gateway acquisition capacity battery SOC battery voltage, wi-fi

全流程调度——MySQL与Sqoop

Linux下redis7的安装,启动与停止

12 pictures take you to fully understand service current limit, circuit breaker, downgrade, and avalanche

Crypto Life, a day in the life of a Web3 project partner

Difference between CMOS and TTL?

STP选举(步骤+案列)详解
随机推荐
Drools WorkBench的简介与使用
User interaction + formatted output
直播预告 | KDD2022博士论文奖冠亚军对话
CorelDRAW2022精简亚太新增功能详细介绍
FPGA-based vending machine
Tower of Hanoi problem
cudaMemcpy学习笔记
拒绝加班,程序员开发的效率工具集
Inner monologue from a female test engineer...
Detailed explanation of STP election (step + case)
What have I experienced to become a tester who is harder than development?
怎样做好一个创业公司CTO?
Arbitrum Interview | L2 Summer, what does the standout Arbitrum bring to developers?
Hanyuan Hi-Tech 8-channel HDMI integrated multi-service high-definition video optical transceiver 8-channel HDMI video + 8-channel two-way audio + 8-channel 485 data + 8-channel E1 + 32-channel teleph
STM32CUBEMX develops GD32F303 (11) ---- ADC scans multiple channels in DMA mode
12 pictures take you to fully understand service current limit, circuit breaker, downgrade, and avalanche
Calculate S=a+aa+…+aa…a
The real CTO is a technical person who understands products
leetcode-399: division evaluation
SQL注入 Less47(报错注入) 和Less49(时间盲注)