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

news2024/11/29 2:49:08

📢📢📢📣📣📣
作者: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.coloradmin.cn/o/1668245.html

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

相关文章

Linux进程控制——Linux进程终止

前言&#xff1a;前面了解完前面的Linux进程基础概念后&#xff0c;我们算是解决了Linux进程中的一大麻烦&#xff0c;现在我们准备更深入的了解Linux进程——Linux进程控制&#xff01; 我们主要介绍的Linux进程控制内容包括&#xff1a;进程终止&#xff0c;进程等待与替换&a…

答辩PPT设计缺乏专业感?笔灵AI提供简洁且关键的幻灯片设计

在我原本的认知里面&#xff0c;答辩PPT是要包含论文各个章节的&#xff0c;在答辩时需要方方面面都讲到的&#xff0c;什么摘要、文献综述、实证分析、研究结果样样不落。但是&#xff0c;这大错特错&#xff01; 答辩PPT环节时长一般不超过5分钟&#xff0c;老师想要的答辩P…

Linunx应急响应

Linux应急流程 1,请提交攻击者的 IP 地址2,请提交攻击者使⽤的操作系统3,请提交攻击者进⼊⽹站后台的密码4,请提交攻击者⾸次攻击成功的时间&#xff0c;格式&#xff1a;DD/MM/YY:hh:mm:ss5,请提交攻击者上传的恶意⽂件名&#xff08;含路径&#xff09;6,请提交攻击者写⼊的恶…

机器学习特征降维

目录 特征降维概念 低方差过滤法 PCA主成分分析 相关系数法 小结 特征降维概念 特征对训练模型时非常重要的&#xff1b;用于训练的数据集包含一些不重要的特征&#xff0c;可能导致模型性能不好、泛化性能不佳&#xff1b;例如&#xff1a; 某些特征的取值较为接近&…

Multisim 14 常见电子仪器的使用和Multisim的使用

multisim multisim&#xff0c;即电子电路仿真设计软件。Multisim是美国国家仪器&#xff08;NI&#xff09;有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中&#xff0c;开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码&#xff0c;测试人员负责找出代码中的问题。然而&#xff0c;这种方法可能导致沟通不足&#xff0c;而且会浪费时间和资源。为了解决这些问题&#xff0c;出现了一种新的开…

IM是什么意思?

IM&#xff08;即时通讯&#xff09;作为现代通讯领域的重要且普遍应用&#xff0c;已成为人们日常生活和工作中不可或缺的通信方式。随着科技的不断发展和互联网的普及&#xff0c;IM工具通过实时信息传递&#xff0c;将沟通变得更加迅速、便捷、高效。 IM的诞生极大地改变了…

【python量化交易】qteasy使用教程06——创建自定义因子选股交易策略

创建自定义因子选股策略 使用qteasy创建自定义因子选股交易策略开始前的准备工作本节的目标Alpha选股策略的选股思想计算选股指标用FactorSorter定义Alpha选股策略交易策略的回测结果用GeneralStg定义一个Alpha选股策略回测结果&#xff1a;本节回顾 使用qteasy创建自定义因子选…

(Java)心得:LeetCode——19.删除链表的倒数第 N 个节点

一、原题 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&…

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

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

[AIGC] redis 持久化相关的几道面试题

文章目录 1. 什么是Redis持久化&#xff1f;2. Redis 的持久化机制是什么&#xff1f;各自的优缺点&#xff1f;2.1 RDB&#xff08;Redis DataBase&#xff09;&#xff0c;快照2.2 AOF&#xff08;Append Only File&#xff09;&#xff0c;日志 3. 优缺点是什么&#xff1f;…

【C++11】列表初始化、右值引用的详细讲解(上)

前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全&#xff0c;不仅功能更强大&#xff0c;而且能提升程序员的开发效率加了许多特性&#xff0c;约140个新特性。使得C…

Golang 开发实战day13 - Reciver Functions

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day13 - 接收…

拌合楼管理系统(十九)ini配置文件本地加密

前 言&#xff1a; 项目中&#xff0c;数据库服务器与程序不在一起&#xff0c;且不允许通过互联网直接访问数据库。 解决方法是通过web服务来做中间件来解决数据交互的问题。但如果web服务交互又存在身份验证问题&#xff0c;需要实现访问对应的接口是经过授权的&#xff0c;未…

sumif的求和区域是文本格式怎么办?

sumif函数的求和区域是文本型数字&#xff0c;不更改源数据的情况下怎么求和呢&#xff1f; 一、不能使用SUMIF、SUMIFS函数 这两个函数的求和区域只能是引用&#xff0c;不能是公式运算的内存数组&#xff0c;因此不能用公式或运算符将求和区转换成数值。当引用来的数据是文本…

【Java】变量类型

类变量&#xff1a;独立于方法之外的变量&#xff0c;用static修饰实例变量&#xff1a;独立于方法之外的变量&#xff0c;不过没有static修饰局部变量&#xff1a;类的方法中的变量 示例1&#xff1a; public class test_A {static int a;//类变量(静态变量)String b;//实例…

C语言例题34、反向输出字符串(递归方式)

题目要求&#xff1a;输入5个字符后&#xff0c;使用递归方式逆序输出 #include <stdio.h>void reverse(int num) {char cur_char;if (num 1) {cur_char getchar();printf("逆序输出为&#xff1a;");putchar(cur_char);} else {cur_char getchar();revers…

用迭代加深解决加成序列问题

可以看到这个最坏的结果是100层搜索&#xff0c;但是其实1 2 4 8 16 32 64 128&#xff0c;到128的话也只要8&#xff0c;所以大概只需要10几层搜索就可以解决了&#xff0c;这个时候就可以用迭代加深的方法&#xff0c;深度一点点的加&#xff0c;如果大于概深度就舍去。有人说…

腾讯提出InstantMesh:超快速的图像转 3D且质量很高,30秒内免费从一张图片生成3D模型

腾讯提出的InstantMes&#xff0c;能够从单张图像快速生成高质量的三维网格模型。这项技术利用了前馈框架&#xff0c;结合了多视图扩散模型和基于大规模重建模型&#xff08;LRM&#xff09;的稀疏视图重建技术&#xff0c;极大地优化了3D资产的创建过程。 如上图所示&#xf…

C++的数据结构(三):栈

栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构&#xff0c;它只允许在一端&#xff08;称为栈顶&#xff09;进行插入和删除操作。栈的这种特性使得它在解决函数调用、括号匹配、表达式求值等问题时具有天然的优势…