当前位置:   article > 正文

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

mycat分表后怎么关联查询

主从关系

准备三台不同ip的虚拟机

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

主192.168.47.131 配置/etc/my.cnf,在【mysqld】下配置

  1. log-error=/var/log/mysqld.log
  2. pid-file=/var/run/mysqld/mysqld.pid
  3. 接着在这儿配置
  4. server-id=1
  5. log-bin=/var/lib/mysql/mysqlbin
  6. read-only=0
  7. binlog-ignore-db=mysql

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

  1. log-error=/var/log/mysqld.log
  2. pid-file=/var/run/mysqld/mysqld.pid
  3. 接着在这儿配置
  4. server-id=2
  5. log-bin=/var/lib/mysql/mysqlbin

设置读写分离balance=3,将读请求writehost对应的标签readhost上,数据库从表与主表的数据不一致,springboot会读到从表的数据 因为从表是读操作

在主终端查看主节点状态

  1. mysql> show master status;
  2. +-----------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +-----------------+----------+--------------+------------------+-------------------+
  5. | mysqlbin.000003 | 2168 | | mysql | |
  6. +-----------------+----------+--------------+------------------+-------------------+

在从终端设置主从关系

  1. 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;
  2. 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

  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://io.mycat/">
  4. <!-- schema定义逻辑库的标签 name:逻辑库的名称 dataNode:表示逻辑库关联的节点名称 -->
  5. <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
  6. <table name="customer" dataNode="dn2"></table>
  7. </schema>
  8. <!-- dataNode:定义节点 name:节点名称必须和上面schema的dataNode值保持一致 dataNode:关联的主机名
  9. database:关联的实际数据库名称
  10. -->
  11. <dataNode name="dn1" dataHost="host1" database="my_order" />
  12. <dataNode name="dn2" dataHost="host2" database="my_consumer" />
  13. <!-- name:数据主机的名称 -->
  14. <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
  15. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  16. <!-- 按照心跳机制来判断真实的数据库是否正常运行-->
  17. <heartbeat>select user()</heartbeat>
  18. <!-- 配置主节点的信息 -->
  19. <writeHost host="hostM1" url="192.168.47.131:3306" user="root"
  20. password="123456">
  21. </writeHost>
  22. <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
  23. </dataHost>
  24. <dataHost name="host2" maxCon="1000" minCon="10" balance="3"
  25. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  26. <!-- 按照心跳机制来判断真实的数据库是否正常运行-->
  27. <heartbeat>select user()</heartbeat>
  28. <!-- 配置主节点的信息 -->
  29. <writeHost host="hostM1" url="192.168.47.132:3306" user="root"
  30. password="123456">
  31. </writeHost>
  32. </dataHost>
  33. </mycat:schema>

 测试垂直分库

  1. mysql> use TESTDB;
  2. Reading table information for completion of table and column names
  3. You can turn off this feature to get a quicker startup with -A
  4. Database changed
  5. mysql> show databases;
  6. +----------+
  7. | DATABASE |
  8. +----------+
  9. | TESTDB |
  10. +----------+
  11. 1 row in set (0.00 sec)
  12. mysql> CREATE TABLE customer(
  13. -> id INT AUTO_INCREMENT,
  14. -> NAME VARCHAR(200),
  15. -> PRIMARY KEY(id)
  16. -> );
  17. Query OK, 0 rows affected (0.08 sec)
  18. mysql> CREATE TABLE orders(
  19. -> id INT AUTO_INCREMENT,
  20. -> order_type INT,
  21. -> customer_id INT,
  22. -> amount DECIMAL(10,2),
  23. -> PRIMARY KEY(id)
  24. -> );
  25. Query OK, 0 rows affected (0.01 sec)
  26. mysql> CREATE TABLE orders_detail(
  27. -> id INT AUTO_INCREMENT,
  28. -> detail VARCHAR(2000),
  29. -> order_id INT,
  30. -> PRIMARY KEY(id)
  31. -> );
  32. Query OK, 0 rows affected (0.02 sec)
  33. mysql> CREATE TABLE dict_order_type(
  34. -> id INT AUTO_INCREMENT,
  35. -> order_type VARCHAR(200),
  36. -> PRIMARY KEY(id)
  37. -> );
  38. Query OK, 0 rows affected (0.01 sec)
  39. mysql> select *from customer;
  40. Empty set (0.05 sec)
  41. mysql> select *from orders;
  42. Empty set (0.00 sec)

 分表完成  在不同的数据库中

 垂直具体配置详解

水平分库

mysql中单表的储存条数是有限制的 最大达到10000条 那么如何在10000条之后继续延续表中的数据呢 使用mycat进行水平分表 当一个表中的条数有限时 可以在其他数据库延续相同数据字段表的条数 进行水平拆分假如表中的数据有10000条 那么进行水平拆分时另一个数据库中的表就有5000条 这就是水平拆分

总节点数(有多少个数据库)数对客户id取余 余数为0在一个表 余数为1在另一个表

在schema.xml中配置

 在rule.xml文件中配置

  1. <tableRule name="mod_rule">
  2. <rule>
  3. #以customer_id最为水平拆表的标准
  4. <columns>customer_id</columns>
  5. <algorithm>mod-long</algorithm>
  6. </rule>
  7. </tableRule>

  1. <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
  2. <!-- how many data nodes -->
  3. <property name="count">2</property>
  4. #此处count=2是根据当前的业务量决定可以变化
  5. </function>

想要水平拆分表中数据 本数据库要创建与被拆分表的相同字段的表

不能进行没有字段的插入语句,否则会报错

  1. mysql> INSERT INTO orders VALUES (1,101,100,100100);
  2. ERROR 1064 (HY000): partition table, insert must provide ColumnList

正确操作

  1. [root@localhost ~]# mysql -umycat -p123456 -P 8066 -h192.168.47.133
  2. mysql> use TESTDB;
  3. Reading table information for completion of table and column names
  4. You can turn off this feature to get a quicker startup with -A
  5. Database changed
  6. mysql> SHOW TABLES;
  7. +--------------------+
  8. | Tables_in_my_order |
  9. +--------------------+
  10. | customer |
  11. | orders |
  12. | dict_order_type |
  13. | orders_detail |
  14. +--------------------+
  15. 4 rows in set (0.01 sec)
  16. mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
  17. (id,order_type,customer_id,amount) VALUES(4,101,101,103000);
  18. INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
  19. INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);Query OK, 1 row affected (0.08 sec)
  20. mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
  21. Query OK, 1 row affected (0.02 sec)
  22. mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
  23. Query OK, 1 row affected (0.01 sec)
  24. mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
  25. Query OK, 1 row affected (0.01 sec)
  26. mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
  27. Query OK, 1 row affected (0.01 sec)
  28. mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
  29. 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数据库中添加订单详情表

  1. #订单详细表 rows:600
  2. CREATE TABLE orders_detail(
  3. id INT AUTO_INCREMENT,
  4. detail VARCHAR(2000),
  5. order_id INT,
  6. PRIMARY KEY(id)
  7. );

重启mycat 进入mycat终端测试

进入mycat安装目录的bin下   ./mycat console

  1. mysql> use TESTDB;(切记 不要忘记切换数据库 这个非常容易出错 数据库不对 就连接不上 操作不了)
  2. Reading table information for completion of table and column names
  3. You can turn off this feature to get a quicker startup with -A
  4. Database changed
  5. #进行插入数据(订单详情)
  6. mysql> INSERT INTO orders_detail(id,detail,order_id) values(61,'detail61',1);
  7. Query OK, 1 row affected (0.09 sec)
  8. mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(62,'detail62',2);
  9. Query OK, 1 row affected (0.06 sec)
  10. mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(63,'detail63',3);
  11. Query OK, 1 row affected (0.06 sec)
  12. mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(64,'detail64',4);
  13. Query OK, 1 row affected (0.06 sec)
  14. mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(65,'detail65',5);
  15. Query OK, 1 row affected (0.05 sec)
  16. mysql> INSERT INTO orders_detail(id,detail,order_id) VALUES(66,'detail66',6);
  17. Query OK, 1 row affected (0.06 sec)
  18. #进行联表查询 可以看到查询成功 在订单表中可以看到订单详情
  19. mysql> select * from orders as o inner join orders_detail as od on o.id=od.order_id;
  20. ;
  21. +----+------------+-------------+-----------+----+----------+----------+
  22. | id | order_type | customer_id | amount | id | detail | order_id |
  23. +----+------------+-------------+-----------+----+----------+----------+
  24. | 1 | 101 | 100 | 100100.00 | 61 | detail61 | 1 |
  25. | 2 | 101 | 100 | 100300.00 | 62 | detail62 | 2 |
  26. | 6 | 102 | 100 | 100020.00 | 66 | detail66 | 6 |
  27. | 3 | 101 | 101 | 120000.00 | 63 | detail63 | 3 |
  28. | 4 | 101 | 101 | 103000.00 | 64 | detail64 | 4 |
  29. | 5 | 102 | 101 | 100400.00 | 65 | detail65 | 5 |
  30. +----+------------+-------------+-----------+----+----------+----------+
  31. 6 rows in set (0.02 sec)

 联表查询结果

  1. mysql> select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;
  2. +----+------------+-------------+-----------+----------+
  3. | id | order_type | customer_id | amount | detail |
  4. +----+------------+-------------+-----------+----------+
  5. | 3 | 101 | 101 | 120000.00 | detail63 |
  6. | 4 | 101 | 101 | 103000.00 | detail64 |
  7. | 5 | 102 | 101 | 100400.00 | detail65 |
  8. | 1 | 101 | 100 | 100100.00 | detail61 |
  9. | 2 | 101 | 100 | 100300.00 | detail62 |
  10. | 6 | 102 | 100 | 100020.00 | detail66 |
  11. +----+------------+-------------+-----------+----------+
  12. 6 rows in set (0.01 sec)

分片完成 联表查询完成 完美 说明一下mycat不支持mysql8.0.28 本人亲自踩坑 建议实验mysql5.7系列版本

提供建表语句

  1. #客户表 rows:20
  2. CREATE TABLE customer(
  3. id INT AUTO_INCREMENT,
  4. NAME VARCHAR(200),
  5. PRIMARY KEY(id)
  6. );
  7. #订单表 rows:600
  8. CREATE TABLE orders(
  9. id INT AUTO_INCREMENT,
  10. order_type INT,
  11. customer_id INT,
  12. amount DECIMAL(10,2),
  13. PRIMARY KEY(id)
  14. );
  15. #订单详细表 rows:600
  16. CREATE TABLE orders_detail(
  17. id INT AUTO_INCREMENT,
  18. detail VARCHAR(2000),
  19. order_id INT,
  20. PRIMARY KEY(id)
  21. );
  22. #订单状态字典表 rows:20
  23. CREATE TABLE dict_order_type(
  24. id INT AUTO_INCREMENT,
  25. order_type VARCHAR(200),
  26. PRIMARY KEY(id)
  27. );

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/407082
推荐阅读
相关标签
  

闽ICP备14008679号