MySQL 案例实战--MySQL数据库 分库分表技术

前言

本环境是基于 Centos 7.8 系统构建MySQL-5.7.14
具体构建,请参考 MySQL-5.7.14 环境构建

随着我们的系统运行,存储在关系型数据库的数据量会越来越大,系统的访问的压力也会随之增大,如果一个库中的表数据超过了一定的数量,比如说MySQL中的表数据达到千万级别,就需要考虑进行分库分表。


一、什么是分库分表技术

为什么需要分库分表?

随着我们的系统运行,存储在关系型数据库的数据量会越来越大,系统的访问的压力也会随之增大,如果一个库中的表数据超过了一定的数量,比如说MySQL中的表数据达到千万级别,就需要考虑进行分库分表;
其次随着表数据的不断增大,会发现,查询也随着变得缓慢,如果添加索引的话,会发现影响到了新增和删除的性能,如果我们将数据库分散到不同的表上,单表的索引大小就得到了控制,对索引以及表结构的变更会变得很方便和高效;
当数据库实例的吞吐量达到性能的瓶颈时,我们需要扩展数据库实例,让每个数据库实例承担其中一部分数据库的请求,分解总体的大请求量的压力;
在数据库进行扩容的时候对应用层的配置改变最少, 就需要在每个数据库实例中预留足够的数据库数量

什么是分库分表?

简而言之就是数据拆分:将一个表结构分为多个表,或者将一个表数据分片后放入多个表,这些表可以放在同一个数据库里,也可以放到不同的数据库中,甚至可以放到不同的数据库实例中数据拆分的方式

分库分表有哪些解决方案呢?

垂直拆分:根据业务的维度,将原本一个库中的表拆分多个表,每个库中表与原有的结构不同
水平拆分:根据分片算法,将一个库拆分成多个库,每个库依旧保留原有的结构

分库分表设计架构
在这里插入图片描述
垂直拆分、水平差分的优缺点

扫描二维码关注公众号,回复: 12452328 查看本文章
拆分方式 优点 缺点
垂直拆分 1、拆分后业务清晰,拆分规则明确
2、系统之间进行整合或扩展容易
3、按照成本、应用等级、应用的类型等将表放到不同的机器上,便于管理
4、便于实现动静分离、冷热分离的数据库表的设计模式
5、数据维护简单
1、部分业务表无法进行关联、只能通过接口的方式来解决,提高了系统的复杂度
2、受每种业务不同的限制,存在单库性能瓶颈,对数据扩展和性能提升不友好
3、事务处理复杂
水平拆分 1、单库单表的数据保持一定的量级,有助于性能的提高
2、切分的表的结构相同,应用层改造较少,只需要增加路由规则即可
3、提高了系统的稳定性和负载能力
1、切分后数据是分散的,很难利用数据库的关联查询,跨库查询性能较差
2、拆分规则难以抽象
3、分片数据的一致性难以解决
4、数据扩容的难度和维护量极大

垂直拆分和水平拆分共同点

  • 存在分布式事务问题
  • 存在跨节点join的问题
  • 存在跨节点合并排序、分页的问题
  • 存在多数据源管理的问题

垂直拆分更偏向于业务拆分的过程,在技术上我们更倾向于水平切分的方案

二、垂直拆分 案例实战

垂直拆分架构
在这里插入图片描述

环境准备

几台部署有mysql环境的主机,具体部署,参考 MySQL-5.7.14 环境构建

角色 主机 IP地址
mycat mysql-yum 192.168.5.11/24
主库 mysql-rpm 192.168.5.12/24
从库1 mysql-binary 192.168.5.13/24
从库2 mysql-source_code 192.168.5.14/24

三个节点授权

mysql> grant all on *.* to 'root'@'192.168.5.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.09 sec

创建数据库

# 主库
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)
mysql> use db2;
Database changed

# 分库一同执行
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)

部署 mycat 环境

# 部署jdk
[root@mysql-yum ~]# ll jdk-8u144-linux-x64.rpm Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 
-rw-r--r-- 1 root root 169971490 Feb  7 13:23 jdk-8u144-linux-x64.rpm
-rw-r--r-- 1 root root  15662280 Feb  7 13:22 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mysql-yum ~]# yum install jdk-8u144-linux-x64.rpm -y

# 部署mycat
[root@mysql-yum ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mysql-yum ~]# cd /usr/local/mycat/
[root@mysql-yum mycat]# ll
total 12
drwxr-xr-x 2 root root  190 Feb  7 13:25 bin
drwxrwxrwx 2 root root    6 Mar  1  2016 catlet
drwxrwxrwx 4 root root 4096 Feb  7 13:25 conf
drwxr-xr-x 2 root root 4096 Feb  7 13:25 lib
drwxrwxrwx 2 root root    6 Oct 28  2016 logs
-rwxrwxrwx 1 root root  217 Oct 28  2016 version.txt

# 配置mycat环境变量
[root@mysql-yum mycat]# vim /etc/profile.d/mycat.sh
export PATH=$PATH:/usr/local/mycat/bin
[root@mysql-yum mycat]# source /etc/profile.d/mycat.sh

# 配置mycat配置文件
[root@mysql-yum ~]# 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">
		<table name="emp" dataNode="sh" />
		<table name="dept" dataNode="bj" />
	</schema>
	<dataNode name="sh" dataHost="db2" database="db2" />
	<dataNode name="bj" dataHost="db3" database="db2" />
	<dataHost name="db2" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db2" url="192.168.5.13:3306" user="root"  password="123456">
		</writeHost>
	</dataHost>
	<dataHost name="db3" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db3" url="192.168.5.14:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>


# 启动mycat
[root@mysql-yum ~]# mycat start
Starting Mycat-server...

# 查看mycat端口信息
[root@mysql-yum ~]# netstat -lnutp | egrep '[89]066'
tcp6       0      0 :::8066                 :::*                    LISTEN      20274/java          
tcp6       0      0 :::9066                 :::*                    LISTEN      20274/java  

测试分库效果

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [TESTDB]> 

# 插入数据
# 创建表emp表并插入数据
CREATE TABLE `emp` (
 `empno` int(4) NOT NULL,
 `ename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `job` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `mgr` int(4) NULL DEFAULT NULL,
 `hiredate` date NOT NULL,
 `sai` int(255) NOT NULL,
 `comm` int(255) NULL DEFAULT NULL,
 `deptno` int(2) NOT NULL,
 PRIMARY KEY (`empno`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `emp` VALUES (1001, '甘宁', '文员', 1013, '2000-12-17',
8000, NULL, 20);


INSERT INTO `emp` VALUES (1002, '黛绮丝', '销售员', 1006, '2001-02-
20', 16000, 3000, 30);

INSERT INTO `emp` VALUES (1003, '殷天正', '销售员', 1006, '2001-02-
22', 12500, 5000, 30);

INSERT INTO `emp` VALUES (1004, '刘备', '经理', 1009, '2001-04-02',
29750, NULL, 20);

INSERT INTO `emp` VALUES (1005, '谢逊', '销售员', 1006, '2001-09-
28', 12500, 14000, 30);

INSERT INTO `emp` VALUES (1006, '关羽', '经理', 1009, '2001-05-01',
28500, NULL, 30);

INSERT INTO `emp` VALUES (1007, '张飞', '经理', 1009, '2001-09-01',
24500, NULL, 10);

INSERT INTO `emp` VALUES (1008, '诸葛亮', '分析师', 1004, '2007-04-
19', 30000, NULL, 20);

INSERT INTO `emp` VALUES (1009, '曾阿牛', '董事长', NULL, '2001-11-
17', 50000, NULL, 10);

INSERT INTO `emp` VALUES (1010, '韦一笑', '销售员', 1006, '2001-09-
08', 15000, 0, 30);

INSERT INTO `emp` VALUES (1011, '周泰', '文员', 1006, '2007-05-23',
11000, NULL, 20);

INSERT INTO `emp` VALUES (1012, '程普', '文员', 1006, '2001-12-03',
9500, NULL, 30);

INSERT INTO `emp` VALUES (1013, '庞统', '分析师', 1004, '2001-12-
03', 30000, NULL, 20);

INSERT INTO `emp` VALUES (1014, '黄盖', '文员', 1007, '2002-01-23',
13000, NULL, 10);

INSERT INTO `emp` VALUES (1015, '张三', '保洁员', 1001, '2013-05-
01', 80000, 50000, 50);

# 创建dept表并插入数据:
CREATE TABLE `dept` (
 `deptno` int NOT NULL ,
 `dname` char(9) NOT NULL ,
 `loc` char(6) NOT NULL
 );

INSERT INTO `dept` VALUES (10, '教研部', '北京');

INSERT INTO `dept` VALUES (20, '学工部', '上海');

INSERT INTO `dept` VALUES (30, '销售部', '广州');

INSERT INTO `dept` VALUES (40, '财务部', '武汉');

查看记录
登录mycat查看:
在这里插入图片描述

主库:
在这里插入图片描述
分库–192.168.5.13:
在这里插入图片描述
分库–192.168.5.14:
在这里插入图片描述
分库成功!!!

三、水平拆分 案例实战

水平拆分:通俗来讲就是将大表按行还拆分

分片:对一个"bigtable",比如说t3表

  • 行数非常多,800w
  • 访问非常频繁
    分片的目的:
  • 将大数据量进行分布存储
  • 提供均衡的访问路由
    分片策略:
  • 范围 range 800w 1-400w 400w01-800w
  • 取模 mod 取余数
  • 枚举
  • 哈希 hash
  • 时间 流水
  • 优化关联查询
  • 全局表
  • ER分片

分片架构
在这里插入图片描述
基于*范围*分片

修改mycat配置文件

[root@mysql-yum ~]# 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">
		<table name="t3" dataNode="sh,bj" rule="auto-sharding-long" />
	</schema>
	<dataNode name="sh" dataHost="db2" database="db2" />
	<dataNode name="bj" dataHost="db3" database="db2" />
	<dataHost name="db2" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db2" url="192.168.5.13:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
	<dataHost name="db3" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db3" url="192.168.5.14:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>

[root@mysql-yum ~]# vim /usr/local/mycat/conf/rule.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
	<mycat:rule xmlns:mycat="http://io.mycat/">
		<tableRule name="auto-sharding-long">
		<rule>
	<columns>id</columns>
	<algorithm>rang-long</algorithm></rule>
		</tableRule>
	<function name="rang-long"
	class="io.mycat.route.function.AutoPartitionByLong">
	<property name="mapFile">autopartition-long.txt</property>
	</function>
</mycat:rule>


[root@mysql-yum ~]# vim /usr/local/mycat/conf/autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
#0-500M=0500M-1000M=1
#500M-1000M=1
#1000M-1500M=2
0-10=0
11-20=1

启动mycat

[root@mysql-yum ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

[root@mysql-yum ~]# netstat -lnutp | egrep '[89]066'
tcp6       0      0 :::8066                 :::*                    LISTEN      5359/java           
tcp6       0      0 :::9066                 :::*                    LISTEN      5359/java   

测试

# mycat 创建t3库,并插入数据
MySQL [TESTDB]> create table t3(id int,name char(20));
Query OK, 0 rows affected (0.00 sec)

MySQL [TESTDB]> insert into t3(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d');
Query OK, 4 rows affected (0.04 sec)

MySQL [TESTDB]> insert into t3(id,name) values(5,'xx'),(6,'yy'),(7,'zz'),(11,'aa'),(12,'bb'),(13,'cc'),(14,'dd');
Query OK, 7 rows affected (0.00 sec)

MySQL [TESTDB]> select * from t3;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | xx   |
|    6 | yy   |
|    7 | zz   |
|   11 | aa   |
|   12 | bb   |
|   13 | cc   |
|   14 | dd   |
|   11 | aa   |
|   12 | bb   |
|   13 | cc   |
|   14 | dd   |
+------+------+
15 rows in set (0.03 sec)

# 分库查看
--- 192.168.5.13
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| emp           |
| t3            |
+---------------+
2 rows in set (0.00 sec)

mysql> select * from t3;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | xx   |
|    6 | yy   |
|    7 | zz   |
+------+------+
7 rows in set (0.00 sec)

--- 192.168.5.14
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| dept          |
| t3            |
+---------------+
2 rows in set (0.00 sec)

mysql> select * from t3;
+------+------+
| id   | name |
+------+------+
|   11 | aa   |
|   12 | bb   |
|   13 | cc   |
|   14 | dd   |
|   11 | aa   |
|   12 | bb   |
|   13 | cc   |
|   14 | dd   |
+------+------+
8 rows in set (0.00 sec)

分表成功!!!


基于*取模*分片

编辑mycat配置文件

[root@mysql-yum ~]# 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">
		<table name="t4" dataNode="sh,bj" rule="mod-long" />
	</schema>
	<dataNode name="sh" dataHost="db2" database="db2" />
	<dataNode name="bj" dataHost="db3" database="db2" />
	<dataHost name="db2" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db2" url="192.168.5.13:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
	<dataHost name="db3" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db3" url="192.168.5.14:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>


[root@mysql-yum ~]# vim /usr/local/mycat/conf/rule.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
	<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
	<property name="count">2</property>
	</function>
</mycat:rule>

# 启动mycat
[root@mysql-yum ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

# 查看mycat端口状态
[root@mysql-yum ~]# netstat -lnutp | egrep '[89]066'
tcp6       0      0 :::8066                 :::*                    LISTEN      21276/java          
tcp6       0      0 :::9066                 :::*                    LISTEN      21276/java 

测试

mycat 创建数据库、表,并插入数据

MySQL [TESTDB]> create table t4(id int,name char(20));
Query OK, 0 rows affected (0.05 sec)

MySQL [TESTDB]> insert into t4(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d');
Query OK, 4 rows affected (0.02 sec)

mycat 端查看数据

在这里插入图片描述
从库查看
192.168.5.13
在这里插入图片描述

192.168.5.14
在这里插入图片描述
分表成功!!!

基于*枚举*分片

编辑mycat配置文件

[root@mysql-yum ~]# 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">
		<table name="t5" dataNode="sh,bj" rule="sharding-by-intfile" />
	</schema>
	<dataNode name="sh" dataHost="db2" database="db2" />
	<dataNode name="bj" dataHost="db3" database="db2" />
	<dataHost name="db2" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db2" url="192.168.5.13:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
	<dataHost name="db3" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db3" url="192.168.5.14:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>


[root@mysql-yum ~]# vim /usr/local/mycat/conf/rule.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

	<tableRule name="sharding-by-intfile">
        	<rule>
                	<columns>name</columns>
               	        <algorithm>hash-int</algorithm>
                </rule>
        </tableRule>
        <function name="hash-int"
                class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
        <property name="type">1</property>
                <property name="defaultNode">0</property>
    	</function>
</mycat:rule>


[root@mysql-yum ~]# vim /usr/local/mycat/conf/partition-hash-int.txt
#10000=0
#10010=1
bj=0
sh=1
DEFAULT_NODE=1


# 启动mycat
[root@mysql-yum ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...


# 查看mycat端口状态
[root@mysql-yum ~]# netstat -lnutp | egrep '[89]066'
tcp6       0      0 :::8066                 :::*                    LISTEN      23729/java          
tcp6       0      0 :::9066                 :::*                    LISTEN      23729/java 

测试:

mycat 创建数据库、表,并插入数据

MySQL [TESTDB]> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| t5               |
+------------------+
1 row in set (0.00 sec)

MySQL [TESTDB]> create table t5(id int,name char(20));
Query OK, 0 rows affected (0.13 sec)

MySQL [TESTDB]> insert into t5(id,name) values(1,'bj'),(2,'sh'),(3,'bj'),(4,'sh'),(5,'tj');
Query OK, 5 rows affected (0.01 sec)

mycat 段查看数据

mycat 端查看数据
在这里插入图片描述
从库查看

192.168.5.13
在这里插入图片描述

192.168.5.14
在这里插入图片描述
分表成功!!!

基于*mycat 全局表*分片

Mycat中表的类型中,定义了全局表和普通表,全局表,可以说就是在每一个数据库节点中都存在,在mycat中,对全局表的变更 操作,都会发送到每一个节点上,全局表的特点是,变化小,数据量不是特别多,而且全局都是依赖于它的,这种表在系统中,常见的是基础表,比如菜单、网站系统信息,数据字典等。全局表在mycat中,也是很有优先权的,可以和任何的表进行join操作全局表的作用。
在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题。
考虑到字典表具有以下几个特性:

  • 变动不频繁
  • 数据量总体变化不大
  • 数据规模不大,很少有超过数十万条记录。

鉴于此,MyCAT 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:

  • 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
  • 全局表的查询操作,只从一个节点获取
  • 全局表可以跟任何一个表进行 JOIN 操作

使用场景:
如果你的业务中有些数据类似于数据字典,比如配置文件的配置,
常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,
而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,
要在所有的分片上保存一份数据即可,Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同
分片内的全局表join,
避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取
时候将会随机获取一个节点读取数据。

编辑mycat配置文件

[root@mysql-yum ~]# 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">
	<table name="t_area" primaryKey="id" type="global" dataNode="sh,bj" />
	</schema>
	<dataNode name="sh" dataHost="db2" database="db2" />
	<dataNode name="bj" dataHost="db3" database="db2" />
	<dataHost name="db2" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db2" url="192.168.5.13:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
	<dataHost name="db3" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"
		slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="db3" url="192.168.5.14:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>


[root@mysql-yum ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

[root@mysql-yum ~]# netstat -lnutp | egrep '[89]066'
tcp6       0      0 :::8066                 :::*                    LISTEN      24913/java          
tcp6       0      0 :::9066                 :::*                    LISTEN      24913/java 

测试:

mycat 创建数据库、表,并插入数据

MySQL [TESTDB]> create table t_area(id int primary key,name char(20));
Query OK, 0 rows affected (0.01 sec)

MySQL [TESTDB]> insert into t_area(id,name) values(1,'a'),(2,'b'),(3,'c'),(4,'d');
Query OK, 4 rows affected (0.00 sec)

mycat 端查看数据

在这里插入图片描述
查看mycat 数据插入状况
在这里插入图片描述

查看mycat 数据读取状况
在这里插入图片描述
从库查看

192.168.5.13
在这里插入图片描述

192.168.5.14
在这里插入图片描述
结论:mycat 全局表水平分表方式:插入数据所有从节点,都执行插入动作,读取数据时,则由mycat随机调用任意从服务器读取

分表成功!!!

猜你喜欢

转载自blog.csdn.net/XY0918ZWQ/article/details/113738996