MySQL8读写分离集群
文章目录
- 前言
- MySQL读写分离原理
- 搭建MySQL读写分离集群
- MySQL8.0之前
- MySQL8.0之后
- 后记
前言
上一期介绍并实现了MySQL的主从复制,由于主从复制架构仅仅能解决数据冗余备份的问题,从节点不对外提供服务
,依然存在单节点的高并发
问题
所以在主从复制的基础上,演变出了MySQL读写分离集群!
MySQL读写分离原理
在MySQL读写分离中:master节点专门用来做数据的修改操作(如create、update、insert、delete
等),在主库上写,然后主库通过主从复制
把数据的更改通过binlog
同步到所有从库上
再将所有的查询操作都映射到从库上,这样就可以很好的分摊读写的压力
,不用全部请求都集中在主库上,这样MySQL的并发处理能力就能得到极大的提高
**在MySQL8.0之前:**这个过程需要一个中间件(如MyCat
,Sharding-JDBC
等),识别解析客户端的所有请求,将所有的写操作映射到master节点,而读操作都转到slave从库上
MySQL8.0之后:MySQL自身已支持读写分离
(支持一主多从
的读写分离,多主多从
的还是需要引入中间件实现)
一主多从的读写分离:
注意:
MySQL8.0之后该一主多从
的读写分离可不依赖中间件
搭建MySQL读写分离集群
MySQL8.0之前
1、下载MyCat安装包
下载MyCat:http://dl.mycat.org.cn
2、分别配置schema.xml
和server.xml
我这里配置虚拟库meet0and1-schema
映射到主从节点上的meet0and1
真实库
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 定义MyCat的虚拟逻辑库,dataNode:映射真实数据节点 --> <schema name="meet0and1-schema" checkSQLschema="false" sqlMaxLimit="800" dataNode="meet0and1Node" /><!-- 定义MyCat的数据节点,name必须和dataNode值一致,dataHost映射真实主机,database映射真实的库 --><dataNode name="meet0and1Node" dataHost="meet0and1Host" database="meet0and1" /><!-- 配置数据主机,name必须和dataHost一致 --><dataHost name="meet0and1Host" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><!--心跳检测--><heartbeat>select user()</heartbeat><!--主节点(写)--><writeHost host="hostM1" url="192.168.31.161:3306" user="root" password="123456"><!--从节点(读)--><readHost host="hostS1" url="192.168.31.162:3306" user="root" password="123456" /></writeHost></dataHost>
</mycat:schema>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><!-- 这里配置的都是一些系统属性--><system><!-- 默认的sql解析方式 --><property name="defaultSqlParser">druidparser</property><property name="charset">utf8mb4</property></system><!-- 配置登录mycat的用户信息 --><user name="root"><property name="password">123456</property><!-- 该用户可以操作哪个逻辑库 --><property name="schemas">meet0and1-schema</property></user>
</mycat:server>
3、启动MyCat
在mycat的bin目录下,启动MyCat
# 以前台窗口启动
./mycat console
# 以后台守护进程启动
./mycat start
./mycat status
./mycat stop
./mycat restart
4、MyCat实现MySQL读写分离
修改properties连接MySQL配置
# MyCat的server.xml中配置的用户和密码
spring.datasource.username=root
spring.datasource.password=123456
# MyCat服务的端口8066,meet0and1-schema:MyCat中配置映射到meet0and1的虚拟库
spring.datasource.url=jdbc:mysql://192.168.31.161:8066/meet0and1-schema?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
**注意:**Spring中事务是支持传播的,MyCat为避免在一个查询中又执行了更新操作,而将连接请求转到slave从库导致主从数据不一致的情况,所以MyCat会开启了事务的连接请求都转到master主库
如下面的findAll
方法,查询操作应该走从库,但由于在类上开启了事务,若方法上的事务传播属性不设置为SUPPORTS
,执行这个方法就会走master主库
@Service
@Transactional(rollbackFor = Exception.class)
public class SysUserService {@Autowiredprivate SysUserDao sysUserDao;/*** Propagation.SUPPORTS:支持事务的传播* 有事务则融入:如其他含有事务的方法调用这个方法时,融入调用方的事务* 没有则不开启事务:它自身的方法不开启事务,且这里覆盖了类上配置的事务* (方法上的事务优先级大于类上开启的事务)*/@Transactional(propagation = Propagation.SUPPORTS)public List<SysUser> findAll() {return sysUserDao.findAll();}/*** 执行写操作,会走master主库*/public void save(SysUser sysUser) {sysUserDao.save(sysUser);}}
MySQL8.0之后
MySQL8.0之后一主多从
的读写分离,可不再依赖任何中间件
1、连接MySQL时只有url配置有变化
# 语法:默认配置的第一个节点为主(写)库,后面的都为从(读)库
jdbc:mysql:replication://主(写)库,从(读)库1,从(读)库2,从(读)库N/库名
示例:
spring.datasource.url=jdbc:mysql:replication://192.168.31.161:3306,192.168.31.162:3306/meet0and1?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
2、只有显示设置方法的事务为只读(readOnly = true
),并且单独执行它时才会走从(读)库
只有事务为只读的查询操作才走从(读)库
!
为保证主从节点数据的一致性
:当有其它service
方法调用时,无论他们是否包含事务,即使不包含更新操作(insert/update/delete),走的都是主(写)库
,如下面几种
@Service
public class SysUserService {@Autowiredprivate SysUserMapper sysUserMapper;/*** 这里只有设置事务为只读,且单独执行该方法时才走从(读)库*/@Transactional(readOnly = true)public List<SysUser> findAll(){return sysUserMapper.findAll();}@Transactionalpublic void hasTranFind(){// 走主(写)库findAll().forEach(System.out::println);}public void notTranFind(){// 走主(写)库findAll().forEach(System.out::println);}public void notTranSave(SysUser sysUser){// 走主(写)库findAll().forEach(System.out::println);sysUserMapper.save(sysUser);}/*** 该方法执行会报错:Connection is read-only. Queries leading to data modification are not allowed* (设置只读的事务方法中,不能有非查询操作)*/@Transactional(readOnly = true)public List<SysUser> findAll2(SysUser sysUser){sysUserMapper.save(sysUser);return sysUserMapper.findAll();}}
后记
现在MyCat的社区和项目维护不是很友好,MySQL8.0之后自身虽支持一主多从的读写分离
但在并发极高的大型项目中要实现分库分表
,读写分离
和分布式主键
等功能还是推荐Sharding-JDBC
相关文章:

MySQL8读写分离集群
文章目录前言MySQL读写分离原理搭建MySQL读写分离集群MySQL8.0之前MySQL8.0之后后记前言 上一期介绍并实现了MySQL的主从复制,由于主从复制架构仅仅能解决数据冗余备份的问题,从节点不对外提供服务,依然存在单节点的高并发问题 所以在主从复…...

蓝桥冲刺31天之第七天
目录 A:三角回文数 B:数数 C:数组切分 D:倍数问题 一星陨落,黯淡不了星空灿烂; 一花凋零,荒芜不了整个春天。 如果命运是世界上最烂的编剧, 你就要争取做人生最好的演员。 即使生…...
【Python百日进阶-Web开发-Vue3】Day550 - Vue3 商城后台 10:Veux4-02基本使用
文章目录 二、Vuex的基本使用2.4 Mutations 应用 :同步更新state2.4.1 `src/store/index.js`2.4.2 `src/views/index.vue`2.5 Module的应用:分模块2.5.1 `src/store/modules/product.js`2.5.2 `src/store/modules/cart.js`2.5.3 `src/store/index.js`2.5.4 `src/views/index.…...

ESP32驱动-红外寻迹传感器驱动
红外寻迹传感器驱动 1、红外寻迹传感器介绍 红外寻迹传感器具有一对红外线发射管与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,输出接口会输出一个数字信号(低电平或高电平,取决于电路…...
【TS】TypeScript泛型 T 的用法详解
一、什么是泛型? 泛型,从字面上理解,泛型就是一般的,广泛的的意思。 TypeScript中泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体类型,而是在使用的时候再指定类型…...

Vue 3.0 单文件组件 【Vue3 从零开始】
#介绍 在很多 Vue 项目中,我们使用 app.component 来定义全局组件,紧接着用 app.mount(#app) 在每个页面内指定一个容器元素。 这种方式在很多中小规模的项目中运作的很好,在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的…...

北邮22信通:你是不是在looking for……那串代码?(2)第三章单链表
相信有了第二章顺序表的基础,小伙伴们学习第三章链表应该会轻松一点吧 目录 类模板下的单链表 1.1书上干净完整代码(无增改、适合自己动手实验) 1.2对书上代码的完善和对一些问题的验证和解释代码 1.补全一个函数: 2.this指…...

蓝库云|告诉你传统产业该如何进行数字化转型
在后疫情时代下,企业该如何在面临生存危机的情形下,投入「数字化转型」、提升公司竞争力,已成为许多公司的当务之急,但到底什么是数字化转型呢?传统产业又如何着手进行数位转型? 数字化转型是什么…...

121.(leaflet篇)leaflet结合echarts4迁徙图
听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>...

链表及其基本操作
1.单链表:1.1定义/性质:链表是线性表的链式存储方式。单链表通过指针线性遍历,删除/增加节点时间复杂度为O(1),访问节点时间复杂度为O(n)。单链表分为带头结点和不带头结点两种,带头结点是为了方便统一操作(…...

【Java基础 下】 031 -- 反射 动态代理
一、什么是反射? 换句话说就是(从类里拿出来) 可以获取到:(利用反射,我们可以获取到类中所有的东西) 获取是先从class字节码文件中获取的 二、获取class对象的三种方式 三种方式也对应了三种阶段…...

springcloud3 GateWay
一 GateWay 1.1 GateWay的作用 gateway相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求通过gateway后由定义的路由和断言进行转发,路由代表需要转发请求的地址,断言相当于请求这些地址时所满足的条件ÿ…...

万字长文:Stable Diffusion 保姆级教程
万字长文:Stable Diffusion 保姆级教程 2022年绝对是人工智能爆发的元年,前有 stability.ai 开源 Stable Diffusion 模型,后有 Open AI 发布 ChatGPT,二者都是里程碑式的节点事件,其重要性不亚于当年苹果发布iPhone&a…...

WAMP搭建靶场
WAMP W:windows A:apache M:mysql,mariadb P:php 1. 下载phpstudy Windows版phpstudy下载 - 小皮面板(phpstudy) 2. 安装phpstudy 默认安装即可 3. 下载DVWA靶场 https://github.com/digininja/DVWA/archive/…...

Uipath Excel 自动化系列13-ForEachExcelSheet(遍历Sheet)
活动描述 ForEachExcelSheet(遍历Sheet):遍历Excel中的工作表,可以对 Excel 工作簿中的每个工作表重复一个或多个活动,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用场景:当处理包含多张工作表的 Excel 文件,…...

JDBC快速入门
🍎道阻且长,行则将至。🍓 目录 一、JDBC入门 1.概述 (1)JDBC本质 (2)JDBC好处 2.快速入门 (1)步骤 (2)实践 (3)两个小问题 一、JDBC入门 1.概述 JDBC就是使用Java语言操作关系型数据库的一套API,全称:( Java…...

蓝桥杯三月刷题 第六天
文章目录💥前言😉解题报告💥星期计算🤔一、思路:😎二、代码:💥考勤刷卡🤔一、思路:😎二、代码:💥卡片🤔一、思路:😎二、代…...

分享几个常用的运维 shell 脚本
今天咸鱼给大家分享几个不错的 Linux 运维脚本,这些脚本中大量使用了 Linux 的文本三剑客: awkgrepsed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根据 PID 显示进程所有信息 根据用户输入的PID,过滤出该PID所有的信息 #! /b…...

分隔链表(精美图示详解哦)
全文目录引言分隔链表题目描述与思路实现总结引言 前面,我们熟悉了管理链表中的数据的方法,也了解了几道与链表相关的题目: 戳我看单链表详解哦 在本篇文章中,我们将再了解一道题目:分隔链表: 分隔链表OJ…...

腾讯乐固加固+app签名+多渠道打包
一、腾讯乐固-基础版免费加固-上传未加固的app-下载加固包(加固成功会清除原apk的签名信息和多渠道信息)https://console.cloud.tencent.com/ms/reinforce/list/basic二、使用AndroidStudio自带工具apksigner对apk重新签名找到apksigner.bat文件 路径D:\…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...