文章目录
- 需求场景
- 一、环境准备
- 二、实现
- 1.MyCat—schema.xml文件配置
- 2.MyCat—server.xml文件配置
- 3.MyCat启动
- 4.MyCat登录
- 5.创建表结构及数据导入
- 三、全局表配置
- 全局表配置
此文档来源于网络,如有侵权,请联系删除!
需求场景
在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分,原有的数据库表如下。
一、环境准备
①如图所示准备三台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&serverTimezone=Asia/Shanghai&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&serverTimezone=Asia/Shanghai&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&serverTimezone=Asia/Shanghai&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&serverTimezone=Asia/Shanghai&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&serverTimezone=Asia/Shanghai&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&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
</dataHost>
</mycat:schema>
2.测试
①停止MyCat
②清空三台数据库shopping数据库中的表
③启动MyCat
④重新导入表结构及数据
查询用户的收件人及收件人地址信息(包含省、市、区)。
查询成功
查询每一笔订单及订单的收件地址信息(包含省、市、区)。
查询成功
此文档来源于网络,如有侵权,请联系删除!