MyCat分片-垂直分库

此文档来源于网络,如有侵权,请联系删除!

需求场景

在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分,原有的数据库表如下。

在这里插入图片描述

一、环境准备

①如图所示准备三台Linux服务器(ip为:192.168.200.210、192.168.200.213、192.168.200.214)可以根据自己的实际情况进行准备。
②三台服务器上都安装MySQL,在192.168.200.210服务器上安装MyCat。
③三台服务器关闭防火墙或者开放对应的端口。
④分别在三台MySQL中创建数据库 shopping。

在这里插入图片描述

二、实现

1.MyCat—schema.xml文件配置

schema.xml文件配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100">
		<table name="tb_goods_base" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_brand" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_cat" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_desc" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_item" dataNode="dn1" primaryKey="goods_id" />
		
		<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
		<table name="tb_order_master" dataNode="dn2" primaryKey="order_id" />
		<table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" />
		
		<table name="tb_user" dataNode="dn3" primaryKey="id" />
		<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
		<table name="tb_areas_provinces" dataNode="dn3" primaryKey="id" />
		<table name="tb_areas_city" dataNode="dn3" primaryKey="id" />
		<table name="tb_areas_region" dataNode="dn3" primaryKey="id" />
	</schema>
	
	<dataNode name="dn1" dataHost="dhost1" database="shopping" />
	<dataNode name="dn2" dataHost="dhost2" database="shopping" />
	<dataNode name="dn3" dataHost="dhost3" database="shopping" />
	
	<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.3.248:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
	</dataHost>
	<!-- -->
	<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
	</dataHost>
	
	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
	</dataHost>
	
</mycat:schema>

2.MyCat—server.xml文件配置

server.xml文件配置如下:(部分主要配置信息展示)

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">SHOPPING</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	<user name="user">
		<property name="password">123456</property>
		<property name="schemas">SHOPPING</property>
		<property name="readOnly">true</property>
	</user>

3.MyCat启动

1.进入到MyCat的安装目录

#切换到/usr/local/mycat/目录
cd /usr/local/mycat/

在这里插入图片描述
2.启动MyCat(若MyCat处于启动状态需要停止MyCat在重新启动)

#启动MyCat
bin/mycat start
#停止MyCat
bin/mycat stop

在这里插入图片描述
3.查看logs目录下的启动日志,查看MyCat是否启动完成(如下图所示表示MyCat启动成功)

#查看wrapper.log日志内容
tail -f logs/wrapper.log

在这里插入图片描述

4.MyCat登录

1.登录MyCat

mysql -h 192.168.200.210 -P 8066 -uroot -p123456

在这里插入图片描述
2.查看数据库、表等相关信息

#查看数据库(schema.xml配置文件中定义的数据库已存在)
show databases;

在这里插入图片描述

#切换到SHOPPING数据库
use SHOPPING;

在这里插入图片描述

#查看表(schema.xml配置文件中定义的虚拟表已存在)
show tables;

在这里插入图片描述

5.创建表结构及数据导入

1.上传shopping-table.sql表结构文件与shopping-insert.sql数据文件

由于文件内容过多无法展示,需要自行下载:
链接:https://pan.baidu.com/s/11Om-w1Oty0jO98GIL8dK3w?pwd=xjv5 点击前往
提取码:xjv5

上传文件到/root目录下

在这里插入图片描述

2.执行shopping-table.sql表结构文件与shopping-insert.sql数据文件

#执行shopping-table.sql文件
source /root/shopping-table.sql

在这里插入图片描述
在这里插入图片描述

查看三个数据库可以发现(根据schema.xml配置文件的配置进行了实现)

192.168.200.210的数据库中存放了 tb_goods_base、tb_goods_brand、tb_goods_cat、tb_goods_desc、tb_goods_item这五张表

192.168.200.213的数据库中存放了 tb_order_item、tb_order_master、tb_order_pay_log这三张表;

192.168.200.214的数据库中存放了 tb_user、tb_user_address、tb_areas_provinces、tb_areas_city、tb_areas_region这五张表

#执行shopping-insert.sql文件
source /root/shopping-insert.sql

在这里插入图片描述

查看三个数据库内的表可以发现有数据了

三、全局表配置

例子1

查询用户的收件人及收件人地址信息(包含省、市、区)。

查询成功

select ua.user_id,ua.contact,p.province,c.city,r.area,ua.address from tb_user_address ua,tb_areas_city c,tb_areas_provinces p,tb_areas_region r where ua.province_id = p.provinceid and ua.city_id = c.cityid and ua.town_id = r.areaid;

在这里插入图片描述

此查询语句只涉及了一个分片所以查询成功

例子2

查询每一笔订单及订单的收件地址信息(包含省、市、区)。

SELECT order_id,payment,receiver,province,city,area FROM tb_order_master o,tb_areas_provinces p,tb_areas_city c,tb_areas_region r WHERE o.receiver_province = p.provinceid AND o.receiver_city = c.cityid AND o.receiver_region = r.areaid;

查询报错
在这里插入图片描述

此查询语句涉及多个分片所以查询报错,为了解决这个问题需要进行全局表配置

全局表配置

对于省、市、区/县表tb_areas_provinces,tb_areas_city,tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。

在这里插入图片描述

1.修改MyCat—schema.xml文件配置

schema.xml文件配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100">

		<table name="tb_goods_base" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_brand" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_cat" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_desc" dataNode="dn1" primaryKey="id" />
		<table name="tb_goods_item" dataNode="dn1" primaryKey="goods_id" />
		
		<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
		<table name="tb_order_master" dataNode="dn2" primaryKey="order_id" />
		<table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" />
		
		<table name="tb_user" dataNode="dn3" primaryKey="id" />
		<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
		
		<table name="tb_areas_provinces" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
		<table name="tb_areas_city" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
		<table name="tb_areas_region" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
		
	</schema>
	
	<dataNode name="dn1" dataHost="dhost1" database="shopping" />
	<dataNode name="dn2" dataHost="dhost2" database="shopping" />
	<dataNode name="dn3" dataHost="dhost3" database="shopping" />
	
	<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.3.248:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
	</dataHost>
	<!-- -->
	<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
	</dataHost>
	
	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="1234" />
	</dataHost>
	
</mycat:schema>

2.测试

①停止MyCat
②清空三台数据库shopping数据库中的表
③启动MyCat
④重新导入表结构及数据

查询用户的收件人及收件人地址信息(包含省、市、区)。

查询成功

在这里插入图片描述

查询每一笔订单及订单的收件地址信息(包含省、市、区)。

查询成功

在这里插入图片描述

此文档来源于网络,如有侵权,请联系删除!

猜你喜欢

转载自blog.csdn.net/weixin_44904239/article/details/130595983