垂直分表就是将一个库下的多个表拆分到多个MySQL实例,实现库压力分流。
通过GTID模式复制,db01与db02之间不进行任何连接与复制
当前环境:
mycat --> db01与db02
db01 --> db03
db02 --> db04
当前垂直分表架构:
后端数据库创建表:
在数据节点 1 创建 temp_1表 ,在数据节点 2 创建 temp_2表
[root@db01 ~]# mysql -uroot -p -e "create table course.temp_1(id int,name varchar(64));"
Enter password:
[root@db02 ~]# mysql -uroot -p -e "create table course.temp_2(id int,name varchar(64));"
Enter password:
Mycat配置分表:
[root@db-mycat conf]# cat schema.xml
# 在schema标签下定义table标签,指定 temp_1表在 dn1数据节点中 # 在schema标签下定义table标签,指定 temp_2表在 dn2数据节点中# 定义 dn1数据节点
# 定义 dn2数据节点
# 定义 node1数据组主机
select user()
# 定义 node2数据组主机
select user()
重启Mycat服务:
mycat restart
查看数据节点状态:
db01与db03是一组数据库实例,db02与db04是一组数据库实例
[root@db-mycat conf]# mysql -uroot -p -h172.18.1.100 -P9066 -e "show @@datasource;"
Enter password:
+----------+------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | db01 | mysql | 172.18.1.76 | 3306 | W | 0 | 10 | 1000 | 85 | 0 | 0 |
| dn1 | db03 | mysql | 172.18.1.78 | 3306 | R | 0 | 7 | 1000 | 86 | 5 | 0 |
| dn2 | db02 | mysql | 172.18.1.77 | 3306 | W | 0 | 10 | 1000 | 85 | 0 | 0 |
| dn2 | db04 | mysql | 172.18.1.79 | 3306 | R | 0 | 7 | 1000 | 82 | 1 | 0 |
+----------+------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
查看Mycat中间件所有表:
可以看到 Mycat中间件可以在 course库下看到 两张表
已经实现 垂直分表效果
[root@db-mycat conf]# mysql -uroot -p -h172.18.1.100 -P8066 -e "use course; show tables;"
Enter password:
+------------------+
| Tables_in_course |
+------------------+
| temp_1 |
| temp_2 |
+------------------+
# 通过 Mycat中间件插入两条数据到 temp_1 temp_2 表内
[root@db-mycat conf]# mysql -uroot -p -h172.18.1.100 -P8066 -e "insert into course.temp_1 values(1,'aa');"
Enter password:
[root@db-mycat conf]# mysql -uroot -p -h172.18.1.100 -P8066 -e "insert into course.temp_2 values(2,'bb');"
Enter password:
# 通过 Mycat中间件查看被垂直分表的
[root@db-mycat conf]# mysql -uroot -p -h172.18.1.100 -P8066 -e "use course; select * from temp_1;"
Enter password:
+------+------+
| id | name |
+------+------+
| 1 | aa |
+------+------+
[root@db-mycat conf]# mysql -uroot -p -h172.18.1.100 -P8066 -e "use course; select * from temp_2;"
Enter password:
+------+------+
| id | name |
+------+------+
| 2 | bb |
+------+------+
查看后端真实数据库表:
可以看到每个数据库实例组 course库下只有一张表。
同时通过 Mycat插入的数据也被分别分流到了两个数据节点 dn1 、 dn2
# dn1 数据节点
[root@db01 ~]# mysql -uroot -p -e "use course; show tables;"
Enter password:
+------------------+
| Tables_in_course |
+------------------+
| temp_1 |
+------------------+
[root@db01 ~]# mysql -uroot -p -e "use course; select * from temp_1;"
Enter password:
+------+------+
| id | name |
+------+------+
| 1 | aa |
+------+------+
# dn2 数据节点
[root@db02 ~]# mysql -uroot -p -e "use course; show tables;"
Enter password:
+------------------+
| Tables_in_course |
+------------------+
| temp_2 |
+------------------+
[root@db02 ~]# mysql -uroot -p -e "use course; select * from temp_2;"
Enter password:
+------+------+
| id | name |
+------+------+
| 2 | bb |
+------+------+