一套MySQL读写分离分库分表的架构,被秀到了!

📢📢📢📣📣📣
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理

文章目录

    • 📣 前言
    • 📣 1.分库分表
      • ✨ 1.1 垂直分库
      • ✨ 1.2 水平分库
      • ✨ 1.3 垂直分表
      • ✨ 1.4 水平分表(库内分表)
    • 📣 2.Mycat中间件
    • 📣 3.Mycat安装
    • 📣 4.架构设计
      • ✨ 4.1 server.xml配置
      • ✨ 4.2 schema.xml配置
      • ✨ 4.3 rule.xml配置
    • 📣 5.验证架构
      • ✨ 5.1 读写分离验证
      • ✨ 5.2 分库分表验证
    • 📣 6.总结

📣 前言

本文介绍了Mycat数据库中间件实现的MySQL读写分离分库分表的高可用架构

📣 1.分库分表

分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

① 分库:垂直分库、水平分库
② 分表:垂直分表、水平分表
分库是指把一个数据库拆分为多个数据库,一般分为垂直分库和水平分库。
分表指的是通过一定规则,将一张表分解成多张不同的表,一般分为垂直分表和水平分表。

✨ 1.1 垂直分库

1 、概念:垂直分库以表为依据,按照业务归属不同,将不同的表拆分到不同的业务库中。
每个库可以放在不同的服务器上,核心理念是专库专用。
2 、结果:垂直分库的结果是
①每个库的表结构都不一样;
②每个库的数据也不一样,没有交集;
③所有库的并集是全量数据。

在这里插入图片描述

✨ 1.2 水平分库

1 、概念:水平分库是以字段为依据,按照一定策略(hash、range 等),
将一个库中的数据拆分到多个库中。
2 、结果:水平分库的结果是
①每个库的结构都一样;
②每个库的数据都不一样,没有交集;
③所有库的并集是全量数据。

在这里插入图片描述

✨ 1.3 垂直分表

1 、概念:垂直分表即“宽表拆窄表”,以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。垂直分表一般是表中的字段较多,将冗余字段,不常用字段,数据较大,长度较长(例如 text 类型字段)的拆分到“扩展表“。一般是针对那种几百列的宽表,也可以避免在查询时,数据量太大造成的“跨页”问题。
2 、结果:垂直分表的结果是
①每个表的结构都不一样;
②每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,
一般是主键,用于关联数据;
③所有表的并集是全量数据。

在这里插入图片描述

✨ 1.4 水平分表(库内分表)

概念:水平分表是以字段为依据,按照一定策略(hash、range 等),
将一个表中的数据拆分到多个表中,也称为库内分表。
结果:水平分表的结果是
①每个表的结构都一样;
②每个表的数据都不一样,没有交集;
③所有表的并集是全量数据。

在这里插入图片描述

📣 2.Mycat中间件

Mycat适用的场景很丰富,以下是几个典型的应用场景单纯的读写分离,此时配置最为简单,支持读写分离,主从切换分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据作为海量数据实时查询的一种简单有效方案.

📣 3.Mycat安装

1.安装包下载
https://github.com/MyCATApache/Mycat-Server

2.JDK安装
Mycat 是由 Java 编写的,运行环境需要有 Java 支持。
Mycat 1.6.7.3 最低需要 JDK 1.8
yum install -y java-1.8.0-openjdk*
java -version

3.解压安装
tar -zxvf Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
cp -r mycat /usr/local/
chmod +x /usr/local/mycat/bin/mycat
ln -s /usr/local/mycat/bin/mycat /usr/local/bin/mycat
mycat --help
#启动Mycat
mycat start
mycat status

📣 4.架构设计

✨ 4.1 server.xml配置

server.xml:定义用户以及系统相关变量,如端口等

✨ 4.2 schema.xml配置

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="t1" primaryKey="id" dataNode="dn1,dn2" rule="mod-long"></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="testdb01" />
<dataNode name="dn2" dataHost="host2" database="testdb02" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="172.72.0.2:3306" user="root" password="root">
<readHost host="hostS1" url="172.72.0.3:3306" user="root" password="root" />
<readHost host="hostS2" url="172.72.0.4:3306" user="root" password="root" />
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="172.72.0.2:3306" user="root" password="root">
<readHost host="hostS1" url="172.72.0.3:3306" user="root" password="root" />
<readHost host="hostS2" url="172.72.0.4:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>

✨ 4.3 rule.xml配置

rule.xml:定义分片规则,
按照mod-long方式,字段id分片
此处是进行了垂直分库,分到了2个库


📣 5.验证架构

✨ 5.1 读写分离验证

测试读负载均衡
注意:root的用户和密码是配置文件里配置好的
for i in $(seq 1 10);
do mysql -uroot -proot
-h192.168.3.15 -P8066 -e
‘select @@hostname;’;
done | egrep ‘[0-9]’

✨ 5.2 分库分表验证

1.testdb01、testdb02这2套库分别创建表create table testdb01.t1 
(
id int not null primary key auto_increment,
name varchar(20) not null
);create table testdb02.t1 
(
id int not null primary key auto_increment,
name varchar(20) not null
);
2.Mycat登陆插入数据
mysql -uroot -proot -h192.168.3.15 -P8066
use TESTDB
insert into t1(id,name) values(1,'a');
insert into t1(id,name) values(2,'b');
insert into t1(id,name) values(3,'c');
insert into t1(id,name) values(4,'d');
insert into t1(id,name) values(5,'c');
insert into t1(id,name) values(6,'d');mysql> select * from t1;
+----+------+
| id | name |
+----+------+
|  2 | b    |
|  4 | d    |
|  6 | d    |
|  1 | a    |
|  3 | c    |
|  5 | c    |
+----+------+
6 rows in set (0.05 sec)

3.主从库分库分表
我们已经看到数据已经分别写入2套库表了root@master:/# mysql -uroot -proot
mysql> select * from testdb01.t1;
+----+------+
| id | name |
+----+------+
|  2 | b    |
|  4 | d    |
|  6 | d    |
+----+------+
3 rows in set (0.00 sec)mysql> select * from testdb02.t1;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  3 | c    |
|  5 | c    |
+----+------+
3 rows in set (0.00 sec)

📣 6.总结

Mycat首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是 MySQL

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

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

相关文章

数据增强,迁移学习,Resnet分类实战

目录 1. 数据增强&#xff08;Data Augmentation&#xff09; 2. 迁移学习 3. 模型保存 4. 102种类花分类实战 1. 数据集 2.导入包 3. 数据读取与预处理操作 4. Datasets制作输入数据 5.将标签的名字读出 6.展示原始数据 7.加载models中提供的模型 8.初始化…

Android Studio在android Emulator中运行的项目黑屏

前言&#xff1a; 最近在做一个Android相关的小项目&#xff0c;因为之前这方面的项目做的比较的少。今天在使用虚拟机调试的时候经常出现一些莫名其妙的问题&#xff0c;经过自己多次的尝试和搜索终于解决了这些问题。 问题&#xff1a; 每次run&#xff08;运行&#xff09…

【机器学习300问】88、什么是Batch Norm算法?

一、什么是Batch Norm&#xff1f; &#xff08;1&#xff09;Batch Norm的本质 神经网络中的Batch Normalization&#xff08;批量归一化&#xff0c;简称BatchNorm或BN&#xff09;是一种改进神经网络训练过程的规范化方法&#xff0c;BatchNorm的主要目的是加速神经网络的训…

构建教育新未来:智慧校园平台的深度解读与全景呈现

引言 在全球数字化转型的大潮中&#xff0c;智慧校园平台作为教育信息化的重要载体&#xff0c;正以前所未有的姿态颠覆传统的教育模式&#xff0c;引领教育行业步入一个崭新的时代。这个融合了大数据、人工智能、云计算、物联网等一系列前沿科技的平台&#xff0c;以其强大的功…

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…

PyTorch的卷积和池化

卷积计算 input 表示输入的图像filter 表示卷积核, 也叫做滤波器input 经过 filter 的得到输出为最右侧的图像&#xff0c;该图叫做特征图 卷积的计算是将卷积核放入左上角&#xff0c;在局部区域间做点积&#xff0c;然后将卷积核在Input上面依次从左向右&#xff0c;从上到下…

免费证件照一键换底色

最近星期天在家搞了一个小工具&#xff0c;在这里分享下! 废话不多说看看效果&#xff1a; 效果还不错&#xff0c;需要的可以联系我!!!!!!!!! 别的网上可都是一次五块钱这种。太贵了。。&#xff01;&#xff01;

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

VS项目Debug下生成的EXE在生产机器上运行

使用Visual Studio开发应用程序时&#xff0c;为了临时在非开发机上看一下效果&#xff0c;就直接把Debug下的文件全部拷贝到该机器上&#xff0c;直接双击exe运行。双击之后&#xff0c;没有直接打开应用程序&#xff0c;而是弹出了一个Error弹框。  赶快在网上搜了一遍&…

MFC窗口更新与重绘

窗口更新与重绘 窗口或控件更新其外观的情况通常包括以下几种&#xff1a; 窗口大小变化&#xff1a; 当用户调整窗口大小时&#xff0c;窗口的客户区大小会改变&#xff0c;需要重新绘制窗口内容以适应新的大小。 窗口重叠或暴露&#xff1a; 当窗口被其他窗口遮挡部分或完…

「 安全设计 」68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标

美国网络安全和基础设施安全局&#xff08;CISA&#xff0c;CyberSecurity & Infrastructure Security Agency&#xff09;于2024年5月开始呼吁企业是时候将网络安全融入到技术产品的设计和制造中了&#xff0c;并发起了安全设计承诺行动&#xff0c;该承诺旨在补充和建立现…

一个物业管理服务项目的思考——智慧停车场无人值守呼叫系统到电梯五方对讲再到呼叫中心

目录 起源智慧停车场无人值守呼叫系统然后电梯五方对讲系统又然后物业呼叫中心集控E控中心怎么做 之前介绍过一个关于 点这个链接&#xff1a;门卫、岗亭、值班室、门房、传达室如果距离办公室和机房比较远的情况下怎么实现电话通话&#xff0c;基本上属于物业管理服务的范围。…

强化学习在一致性模型中的应用与实验验证

在人工智能领域&#xff0c;文本到图像的生成任务一直是研究的热点。近年来&#xff0c;扩散模型和一致性模型因其在图像生成中的卓越性能而受到广泛关注。然而&#xff0c;这些模型在生成速度和微调灵活性上存在局限。为了解决这些问题&#xff0c;康奈尔大学的研究团队提出了…

【STM32+HAL+Proteus】系列学习教程---中断(NVIC、EXTI、按键)

实现目标 1、掌握STM32的中断知识 2、学会STM32CubeMX软件关于中断的配置 3、具体目标&#xff1a;1、外部中断检测按键&#xff0c;每按一次计一次数&#xff0c;满5次LED1状态取反。 一、中断概述 1.1、中断定义 CPU执行程序时&#xff0c;由于发生了某种随机的事件(包括…

实验室纳新宣讲会(java后端)

前言 这是陈旧已久的草稿2021-09-16 15:41:38 当时我进入实验室&#xff0c;也是大二了&#xff0c;实验室纳新需要宣讲&#xff0c; 但是当时有疫情&#xff0c;又没宣讲成。 现在2024-5-12 22:00:39&#xff0c;发布到[个人]专栏中。 实验室纳新宣讲会&#xff08;java后…

基于GD32的简易数字示波器(4)- 软件

这期记录的是项目实战&#xff0c;做一个简易的数字示波器。 教程来源于嘉立创&#xff0c;帖子主要做学习记录&#xff0c;方便以后查看。 本期主要介绍GD32的keil5环境和串口下载。详细教程可观看下方链接。 软件-第1讲-工程模板新建_哔哩哔哩_bilibili 2.1 开发环境搭建 …

logback日志持久化

1、问题描述 使用logback持久化记录日志。 2、我的代码 logback是Springboot框架里自带的&#xff0c;所以只要引入“spring-boot-starter”就行了。无需额外引入logback依赖。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns&…

2005-2022年各省居民人均可支配收入数据(含城镇居民人均可支配收入、农村居民人均可支配收入)(无缺失)

2005-2022年各省居民人均可支配收入数据&#xff08;含城镇居民人均可支配收入、农村居民人均可支配收入&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;全体居民人均可支配收入、…

探索大型语言模型(LLM)的世界

​ 引言 大型语言模型&#xff08;LLM&#xff09;作为人工智能领域的前沿技术&#xff0c;正在重塑我们与机器的交流方式&#xff0c;在医疗、金融、技术等多个行业领域中发挥着重要作用。本文将从技术角度深入分析LLM的工作原理&#xff0c;探讨其在不同领域的应用&#xff0…

开源软件托管平台gogs操作注意事项

文章目录 一、基本说明二、gogs私有化部署三、设置仓库git链接自动生成参数四、关闭新用户注册入口 私有化部署gogs托管平台&#xff0c;即把gogs安装在我们自己的电脑或者云服务器上。 一、基本说明 系统环境&#xff1a;ubuntu 20.4docker安装 二、gogs私有化部署 前期准…