1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

时间:2022-07-27 00:54:55

相关推荐

mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

主从关系

准备三台不同ip的虚拟机

(第一批)主从关系的配置

主192.168.47.131配置/etc/f,在【mysqld】下配置

log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid接着在这儿配置server-id=1log-bin=/var/lib/mysql/mysqlbinread-only=0binlog-ignore-db=mysql

从192.168.47.132 配置/etc/f,在【mysqld】下配置,主从关系的id不一致(切记)

log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid接着在这儿配置server-id=2log-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 namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> 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

正确操作

[root@localhost ~]# mysql -umycat -p123456 -P 8066 -h192.168.47.133mysql> use TESTDB;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> 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 namesYou can turn off this feature to get a quicker startup with -ADatabase 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:20CREATE TABLE dict_order_type(id INT AUTO_INCREMENT,order_type VARCHAR(200),PRIMARY KEY(id));

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。