一套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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法设计与分析 例题 绘制Huffman树、循环赛、分治、最短路与动态规划

1.考虑用哈夫曼算法来找字符a,b,c,d,e,f 的最优编码。这些字符出现在文件中 的频数之比为 20:10:6:4:44:16。要求&#xff1a; &#xff08;1&#xff09;&#xff08;4 分&#xff09;简述使用哈夫曼算法构造最优编码的基本步骤&#xff1b; &#xff08;2&#xff09;&…

Java数据结构---栈和队列

目录 栈&#xff08;Stack&#xff09; 队列&#xff08;Queue&#xff09; 循环队列 栈&#xff08;Stack&#xff09; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除操作元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一…

2024最新商业视频打赏系统源码 多套模板 有代理后台 已对接支付

简介&#xff1a; 2024最新商业视频打赏系统源码 多套模板 有代理后台 已对接支付 图片&#xff1a; 源码下载

IC-Light-在stable diffusion中实现图像的光影控制新方法 - 技术原理篇

&#x1f468;背景与来源 最近在stable diffusion的粉丝群看到光影控制又有了新的玩法&#xff0c;是controlnet的作者lllyasviel&#xff0c;发了一款名为IC-Light的模型&#xff0c;并且已经被另外一位名为huchenlei的朋友实现了comfyui和webUI&#xff08;forge &#xff0…

事件高级部分

一&#xff0c;注册事件 即给元素添加事件 1.传统注册方式 2.方法监听注册方式 事件类型&#xff1a;字符串形式&#xff0c;不用带on 可以给一个元素添加多个程序 二.删除事件 1.方式 参数见上文 三.DOM事件流 事件的传播过程叫做事件流 js代码只能获取一个阶段&#xf…

【考研数学】汤家凤“免单“数学题被吐槽‘太难’,老汤回应「怎么还有脸笑」,网友:这些题有毒!

我看了汤家凤老师出的几道题&#xff0c;实际上对于考研的同学来说&#xff0c;确实是送分题 第一个是三角函数变换中的万能公式&#xff1b;第二个e^x的泰勒展开公式&#xff1b;第三个是第一类重要极限。只要复习过&#xff0c;那基本上都能正常做出来。 至于汤家凤老师说「…

STM32快速入门(总线协议之I2C一主多从(软件实现 硬件实现))

STM32快速入门&#xff08;总线协议之I2C一主多从&#xff08;软件实现 & 硬件实现&#xff09;&#xff09; 前言 支持一对多&#xff08;一主多从&#xff09;、多对多传输&#xff08;多主多从&#xff09;&#xff0c;只支持半双工&#xff0c;一般有两根数据线&…

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起&#xff0c;目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开&#xff0c;可以将任何容器与任何算法结合使用&#xff0c;只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …

OGG几何内核-网格化的改进

OGG社区于4月19日发布了OGG 1.0 preview版本。相对于OCCT 7.7.0有很多改进&#xff0c;目前在持续研究中。最近测试了一下网格化&#xff0c;确实有很好的改进。对比展示如下&#xff1a; 几何内核&#xff1a; OGG 1.0 preview 几何内核&#xff1a;OCCT 7.7.0 采用OCCT几何内…

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…

cmu15445 2023fall project3 详细过程(下)QUERY EXECUTION

QUERY EXECUTION task3/task4 Task #3 - HashJoin Executor and Optimization1、HashJoin1.1 思路1.2 代码 2 NestedLoopJoin优化为HashJoin2.1 思路2.2 代码 Task #4 Sort Limit Executors Top-N Optimization Window Functions1、Sort1.1 思路1.2 代码 2、Limit Executors2…

Linux与Windows互传文件【笔记】

Linux与Windows互传文件【笔记】 前言前言推荐Linux与Windows互传文件首先确保Windows安装ssh如何传送文件问题 最后 前言 这是陈旧已久的草稿2023-05-10 00:01:24 这个是准备把计组课程华为智能计组的&#xff0c;传输文件。 最后发现&#xff0c;好像没有实现了。 现在202…

Java 守护线程 ( Daemon Thread )详解

在Java中&#xff0c;线程分为两类&#xff1a;用户线程(User Thread)和守护线程(Daemon Thread)。守护线程是后台线程&#xff0c;主要服务于用户线程&#xff0c;当所有的用户线程结束时&#xff0c;守护线程也会自动结束&#xff0c;JVM会随之退出。守护线程的一个典型例子是…

pikachu靶场(xss通关教程)

&#xff08;注&#xff1a;若复制注入代码攻击无效&#xff0c;请手动输入注入语句&#xff0c;在英文输入法下&#xff09; 反射型xss(get型) 1.打开网站 发现有个框&#xff0c;然后我们在框中输入一个“1”进行测试&#xff0c; 可以看到提交的数据在url处有显示&#xf…

AI跟踪报道第41期-新加坡内哥谈技术-本周AI新闻:本周Al新闻: 准备好了吗?事情即将変得瘋狂

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Oracle 删除表中的列

Oracle 删除表中的列 CONN SCOTT/TIGER DROP TABLE T1; create table t1 as select * from emp; insert into t1 select * from t1; / / --到6000行&#xff0c;构造一个实验用大表T1。 COMMIT; select EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout 文章编号&…

异常处理/CC++ 中 assert 断言 应用实践和注意事项

文章目录 概述assert 本质浅析Release版本下的assert是否生效默认设置下 QtCreator环境 assert 过程默认配置下 VS环境 assert 过程配置VS发布模式下的断言生效VS环境Release版本的UI程序Release下请当我不生效 请勿滥用assert导致逻辑错误再强调不要在assert内执行逻辑功能怎敢…

react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)

什么是 Context 机制&#xff1f; Context 机制是 react 实现外层组件向内层组件传值的一种方案&#xff0c;父组件可以向其内部的任一组件传值&#xff0c;无论是子组件还是孙组件或更深层次的组件。 实现步骤 1.使用createContext方法创建一个上下文对象 Ctx 2.在顶层组件中通…

轮转数组 与 消失的数字

轮转数组 思路一 创建一个新内存空间&#xff0c;将需轮转的数依次放入&#xff0c;之后在把其它数放入 代码&#xff1a; void rotate(int* nums, int numsSize, int k) {k k % numsSize;// 确定有效的旋转次数if(k 0)return;int* newnums (int*)malloc(sizeof(int) * nu…