MySQL-分库分表详解(四)

news/2024/11/29 6:35:49/

♥️作者:小刘在C站

♥️个人主页: 小刘主页 

♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生!

♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术

♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSDN让你我相遇!

前言上章讲到MySQL-分库分表(三)本章继续

目录

MySQL

5 MyCat分片

5.1 垂直拆分

5.1.1 场景

 5.1.2 准备

5.1.3 配置

1). schema.xml

2). server.xml

5.1.4 测试

5.1.5 全局表

配置完毕后,重新启动MyCat。


MySQL

MySQL是一个关系型数据库管理系统由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

5 MyCat分片

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

现在考虑将其进行垂直分库操作,将商品相关的表拆分到一个数据库服务器,订单表拆分的一个数据库服务器,用户及省市区表拆分到一个服务器。最终结构如下:

 5.1.2 准备

准备三台服务器, IP 地址如图所示:

并且在 192.168.200.210 192.168.200.213, 192.168.200.214 上面创建数据库
shopping

5.1.3 配置

1). schema.xml

<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="goods_id" />
<table name="tb_goods_item" dataNode="dn1" primaryKey="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.200.210: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>

2). server.xml

<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">SHOPPING</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="true">
<schema name="DB01" dml="0110" >
<table name="TB_ORDER" dml="1110"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">SHOPPING</property>
<property name="readOnly">true</property>
</user>

5.1.4 测试

1). 上传测试 SQL 脚本到服务器的 /root 目录

2). 执行指令导入测试数据
重新启动 MyCat 后,在 mycat 的命令行中,通过 source 指令导入表结构,以及对应的数据,查看数据分布情况。
source /root/shopping-table.sql
source /root/shopping-insert.sql
将表结构及对应的测试数据导入之后,可以检查一下各个数据库服务器中的表结构分布情况。 检查是否和我们准备工作中规划的服务器一致。

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

MyCat 的命令行中,当我们执行以下多表联查的 SQL 语句时,可以正常查询出数据。

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 ;

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

实现该需求对应的 SQL 语句如下:
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 ;
但是现在存在一个问题,订单相关的表结构是在 192.168.200.213 数据库服务器中,而省市区的数
据库表是在 192.168.200.214 数据库服务器中。那么在 MyCat 中执行是否可以成功呢?

经过测试,我们看到, SQL 语句执行报错。原因就是因为 MyCat 在执行该 SQL 语句时,需要往具体的数据库服务器中路由,而当前没有一个数据库服务器完全包含了订单以及省市区的表结构,造成 SQL 语句失败,报错。
对于上述的这种现象,我们如何来解决呢? 下面我们介绍的全局表,就可以轻松解决这个问题。

5.1.5 全局表

对于省、市、区 / 县表 tb_areas_provinces , tb_areas_city , tb_areas_region ,是属于
数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。
修改 schema.xml 中的逻辑表的配置,修改 tb_areas_provinces tb_areas_city
tb_areas_region 三个逻辑表,增加 type 属性,配置为 global ,就代表该表是全局表,就会在
所涉及到的 dataNode 中创建给表。对于当前配置来说,也就意味着所有的节点中都有该表了。

<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"/> 

配置完毕后,重新启动MyCat

1). 删除原来每一个数据库服务器中的所有表结构
2). 通过 source 指令,导入表及数据
source /root/shopping-table.sql
source /root/shopping-insert.sql
3). 检查每一个数据库服务器中的表及数据分布,看到三个节点中都有这三张全局表
4). 然后再次执行上面的多表联查的 SQL 语句
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 ;

  是可以正常执行成功的。          

5). 当在 MyCat 中更新全局表的时候,我们可以看到,所有分片节点中的数据都发生了变化,每个节点的全局表数据时刻保持一致。

♥️关注,就是我创作的动力

♥️点赞,就是对我最大的认可

♥️这里是小刘,励志用心做好每一篇文章,谢谢大家


http://www.ppmy.cn/news/749338.html

相关文章

spring-bean的基础知识

1.bean的别名 2.bean的作用范围 单例多例&#xff0c;即现在创建的bean对象是一个还是多个&#xff0c;默认情况下是单例&#xff0c;可在配置文件修改 <bean scope"singleton/prototype"/> 适合单例的bean 1.表现层对象 2.业务层对象 3.数据层对象 4.工具对…

AMD“换标”的背后

AMD“换标”的背后 文/王易见 当一个企业的产品面临客户质疑和不信任的时候&#xff0c;他们可能的一个做法是将这产品更新换代掉&#xff0c;当一个企业的品牌遭遇品牌危机的时候&#xff0c;他们可能的一个做法是重新创立一个品牌&#xff0c;彻底消除其在客户心中的阴影&…

AMD 规范

异步模块定义规范&#xff08;AMD&#xff09;制定了定义模块的规则&#xff0c;这样模块和模块的依赖可以被异步加载。这和浏览器的异步加载模块的环境刚好适应&#xff08;浏览器同步加载模块会导致性能、可用性、调试和跨域访问等问题&#xff09;。 此AMD与科技公司AMD 及其…

AMD GPU内存管理(2):GEM/TTM

参考内核代码:Linux-6.1/driver/gpu/drm/amd 一、背景 在AMD的Linux GPU驱动中,只有计算相关的业务(amdkfd)直接使用TTM来allocate/free内存,当然在dma-buf来进行进程间通信内存共享时也用到了GEM。而在图形相关业务中既使用了GEM也使用了TTM。下面对GEM和TTM的核心结构和函…

JavaScript AMD 模块

JavaScript AMD (Asynchronous Module Definition) 是一种 JavaScript 模块化编程的规范&#xff0c;它允许您异步加载模块并且在加载完成后执行模块的代码。这种方式的优势在于可以按需加载模块&#xff0c;并且可以在加载模块时并行执行其他任务&#xff0c;从而提升应用的性…

AMD模块写法

AMD模块的写法 require.js加载的模块&#xff0c;采用AMD规范。也就是说&#xff0c;模块必须按照AMD的规定来写。 具体来说&#xff0c;就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块&#xff0c;那么可以直接定义在define()函数之中。 假定现在有一…

amd模块化

一、amd定义及规范说明 AMD(Asynchronous Module Definition)&#xff1a;异步模块加载机制&#xff0c;是一个在浏览器端模块化开发的规范。什么是异步模块加载机制&#xff1a;JavaScript在浏览器中被解析和执行时具有阻塞的特性&#xff0c;当JavaScript代码执行时&#xf…

区分计算机和服务器的内存条,AMD专用内存是什么意思 AMD专用内存和普通内存条的区别及真相...

相信一些用户在网上在购买内存的时候找到一些低价位的内存,看描述上写有“AMD专用内存”,AMD专用内存是什么意思?那么对于这种称为AMD专用内存的不难理解,肯定intel平台是使用不了的,而只有AMD平台能够使用,今天装机之家来给大家说说AMD专用内存和普通内存条的区别及真相…