MyCat分片-垂直分库

news2024/9/23 19:22:35

文章目录

  • 需求场景
  • 一、环境准备
  • 二、实现
    • 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&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
④重新导入表结构及数据

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

查询成功

在这里插入图片描述

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

查询成功

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ChatGPT辅助学习——让你的学生主动找到学习的方法!

ChatGPT就像一座巨大的金矿&#xff0c;能挖到多少金子&#xff0c;完全取决于你的思维、认知和行动力。 当大部分人还在观望&#xff0c;或者拿着ChatGPT随便玩一玩的时候。 有的人&#xff0c;已经快速把它切入垂直领域&#xff0c;开始深耕。 如果你的孩子或者学生正在上初…

静态库和动态库的制作与使用

1.静态库的制作与使用 小知识&#xff1a;删除命令行&#xff0c;或者是配置好的路径之类的&#xff1a;退出编辑模式后&#xff1a;dd 保存并退出&#xff1a;退出编辑模式后&#xff0c;&#xff1a;wq (1)静态库的制作 1.首先生成你需要加入的文件的.O文件。使用如下代码 …

网络编程六--UDP服务器客户端

写在前面 UDP&#xff08;User Datagram Protocol&#xff09;称为用户数据报协议&#xff0c;是一种无连接的传输协议。 UDP的主要应用在即使丢失部分数据&#xff0c;也不影响整体效果的场景。例实时传输视频或音频时&#xff0c;即使丢失部分数据&#xff0c;也不会影响整…

C++11大杂烩

C11大杂烩 文章目录 C11大杂烩介绍语法统一的列表初始化&#xff1a;{}初始化initializer_list简化声明的方式autotypeid().name():获取类型名decltype nullptr范围for循环stl库中的一些变化arrayforward_list final和override右值引用和移动语义左值引用和右值引用 移动构造和…

有没有好用的UI在线设计工具?这5个设计师必备!

这篇文章介绍了 5 款在线UI设计工具&#xff0c;分别是即时设计、InVision Studio、Axure、Framer 和 Principle。其中&#xff0c;即时设计是一款次世代的在线协作UI设计工具&#xff0c;支持多人协同在线设计一键交付、插入交互式动画等功能&#xff0c;最近还更新了全球首款…

网络基础知识1—网络

文章目录 1.网络划分1.1局域网&#xff08;内网&#xff09;1.2广域网&#xff08;公网&#xff09; 2.网络的作用3.端口号3.1作用3.2两台主机中的进程传输数据3.3格式3.4注意 4.协议4.1概念4.2三要素4.3最终体现4.4作用 5.五元组5.1源IP5.2源端口5.3目的IP5.4目的端口5.5协议 …

MySQL中这14个神仙功能

1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&#xff0c;名称不同的用户的具体名称有哪些&#xff1f; 具体sql如下&#xff1a; select name from user group by name;但如果想把name相同的c…

IO 流学习总结

一&#xff1a;IO 流的概述 1. 什么是 IO 流&#xff1f; 存储和读取数据的解决方法 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 2. IO 流的作用&#xff1f; 用于读写数据&#xff08;本地文件&#xff0c;网络&#xff09; 3. IO 流按…

三年亏百亿仍要造“跑车”,哪吒还有几次试错?

文丨智能相对论 作者丨leo陈 燃油车时代&#xff0c;国产品牌没有一款真正意义上成功的“低价跑车”&#xff0c;那在新能源时代&#xff0c;“电”是否可以创造这种可能&#xff1f; 第一个交出答卷的是哪吒汽车。不久前&#xff0c;哪吒发布首款纯电跑车“哪吒GT”&#x…

3个方法提高电脑运行速度,亲测有效!

案例&#xff1a;怎样提高电脑运行的速度&#xff1f; 【随着使用时间的增长&#xff0c;我的电脑运行速度越来越慢&#xff0c;这样我感到十分不方便和烦恼。有什么办法可以提高电脑的运行速度吗&#xff1f;】 在日常使用电脑过程中&#xff0c;我们难免会遇到电脑运行缓慢…

【C++】第13章: 类继承

文章目录 第十三章 类继承13.1 一个简单的基类13.1.1 派生一个类13.1.2 构造函数&#xff1a;访问权限的考虑13.1.3 使用派生类13.1.4 派生类和基类之间的特殊关系 13.2 继承&#xff1a;is-a关系13.3 多态公有继承13.4 静态联编与动态联编13.4.1 指针和引用类型的兼容性13.4.2…

Doris简介、部署、功能介绍以及架构设计

Doris简介、部署、功能介绍以及架构设计 1. Doris简介 Doris 中文官方文档&#xff1a;https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary 1.1 Doris概述 ​ Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人…

5.10晚间黄金CPI精准分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;本周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周三&#xff08;5月10日&#xff09;亚欧盘中&#xff0c;现货黄金震荡下跌&#xff0c;现报2030美元/盎司&#xff0c;稍早一度触及2038美元/盎司高点。美联储理事…

day30_jdbc

今日内容 零、 复习昨日 一、作业 二、SQL注入 三、PreparedStatement 四、事务 五、DBUtil 零、 复习昨日 见晨考 一、作业 package com.qf.homework;import com.qf.entity.User;import java.sql.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import …

Selenium技术在CentOS6.8系统的腾讯云服务器上的相关使用(Linux环境下)

目录 一、解释说明二、操作过程中Linux相关命令1、下载谷歌浏览器2、查看谷歌浏览器的版本3、下载对应版本的谷歌驱动&#xff08;或者本地上传&#xff09;4、解压下载的文件5、移动下载文件6、给予文件执行权限7、更新pip3到最高版本8、下载Selenium第三方库9、正式测试10、最…

Rust 快速入门60分① 看完这篇就能写代码了

Rust 一门赋予每个人构建可靠且高效软件能力的语言https://hannyang.blog.csdn.net/article/details/130467813?spm1001.2014.3001.5502关于Rust安装等内容请参考上文链接&#xff0c;写完上文就在考虑写点关于Rust的入门文章&#xff0c;本专辑将直接从Rust基础入门内容开始讲…

如何预测药品市场规模

药品市场规模预测是一个非常关键的步骤&#xff0c;可以帮助判断该项目是否值得投资或开发。以下是一些常见的方法&#xff1a; 药品市场规模可以细分为治疗领域市场规模、药品种类市场规模、区域市场规模、渠道市场规模、品牌市场规模、性质市场规模等。这些规模的了解是一个非…

【Hello Algorithm】异或法

作者&#xff1a;小萌新 专栏&#xff1a;算法 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;介绍算法中的异或法 异或法 异或的概念异或的两个性质题目一 不使用额外变量交换两个数字题目二 出现奇数次的数字题目三 如何从一个整型数字中提取出…

石油化工行业室内外高精度人员定位系统解决方案

石油化工行业是高危行业&#xff0c;很容易发生安全事故&#xff0c;对于石化企业来说&#xff0c;加强人员的安全管控非常有必要。我们可以通过人员定位技术&#xff0c;提升石化企业安全管理水平。下面给大家分享石油化工行业室内外高精度人员定位系统解决方案。 方案概述 石…

BERT原理Fine TuningBert变种

文章目录 BERT原理训练时的任务任务一任务二任务二的改进 模型的输入 BERT - Fine Tuning单个句子的预测类序列标注类Q&A类seq2seq&#xff1f; BERT 变种Transformer-XLXLNetAutoregressive Language ModelDenoising Auto-Encoder乱序Two-Stream Attention与Transformer-X…