MySQL8读写分离集群

news2024/12/26 13:28:19

文章目录

    • 前言
    • MySQL读写分离原理
    • 搭建MySQL读写分离集群
      • MySQL8.0之前
      • MySQL8.0之后
    • 后记

前言

上一期介绍并实现了MySQL的主从复制,由于主从复制架构仅仅能解决数据冗余备份的问题,从节点不对外提供服务,依然存在单节点的高并发问题

所以在主从复制的基础上,演变出了MySQL读写分离集群!

MySQL读写分离原理

在MySQL读写分离中:master节点专门用来做数据的修改操作(如create、update、insert、delete等),在主库上写,然后主库通过主从复制把数据的更改通过binlog同步到所有从库上

再将所有的查询操作都映射到从库上,这样就可以很好的分摊读写的压力,不用全部请求都集中在主库上,这样MySQL的并发处理能力就能得到极大的提高

**在MySQL8.0之前:**这个过程需要一个中间件(如MyCatSharding-JDBC等),识别解析客户端的所有请求,将所有的写操作映射到master节点,而读操作都转到slave从库上

MySQL8.0之后:MySQL自身已支持读写分离(支持一主多从的读写分离,多主多从的还是需要引入中间件实现)

一主多从的读写分离:

注意:MySQL8.0之后该一主多从的读写分离可不依赖中间件

搭建MySQL读写分离集群

MySQL8.0之前

1、下载MyCat安装包

下载MyCat:http://dl.mycat.org.cn

2、分别配置schema.xmlserver.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 {

    @Autowired
    private 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 {

    @Autowired
    private SysUserMapper sysUserMapper;

    /**
     * 这里只有设置事务为只读,且单独执行该方法时才走从(读)库
     */
    @Transactional(readOnly = true)
    public List<SysUser> findAll(){
        return sysUserMapper.findAll();
    }

    @Transactional
    public 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



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

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

相关文章

【Vue】10分钟带你读懂Vue的过滤器

一、什么是过滤器&#xff1f;过滤器提供给我们的一种数据处理方式。过滤器功能不是必须要使用的&#xff0c;因为它所实现的功能也能用计算属性或者函数调用的方式来实现。Vue.js 允许你自定义过滤器&#xff0c;可被用于一些常见的文本格式化。二、过滤器声明与使用过滤器应该…

重构SeleniumeDownloader底层浏览器驱动

一、解决bug&#xff1a;Selenium with PhantomJS&#xff0c;重构SeleniumeDownloader底层浏览器驱动 0、小背景&#xff1a; 想爬取外网steam的数据&#xff0c;但是steam官网在海外&#xff0c;加上steam处于反爬考虑&#xff0c;对于异步数据-json数据进行处理&#xff0…

三天吃透RabbitMQ面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信

51驱动NRF24L01通信&#xff0c;NRF24L01与TTL转NRF24L01模块通信NRF24L01一、简介二、引脚功能描述程序设计一、对 24L01 的程序编程的基本思路如下&#xff1a;二、Tx 与 Rx 的配置过程1、Tx 模式初始化过程&#xff1a;2、Rx 模式初始化过程&#xff1a;三、基本程序函数通信…

五分钟了解支付、交易、清算、银行等专业名词的含义?

五分钟了解支付、交易、清算、银行等专业名词的含义&#xff1f;1. 支付类名词01 支付应用02 支付场景03 交易类型04 支付类型&#xff08;按通道类型&#xff09;05 支付类型&#xff08;按业务双方类型&#xff09;06 支付方式07 支付产品08 收银台类型09 支付通道10 通道类型…

LeetCode-416. 分割等和子集

目录题目分析回溯法动态规划动态规划(压缩)题目来源 416. 分割等和子集 题目分析 这道题目是要找是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 那么只要找到集合里能够出现 sum / 2 的子集总和&#xff0c;就算是可以分割成两个相同元素和子集了…

使用 ONLYOFFICE 宏借助 ChatGPT 生成文章

AI 技术在过去几年中得到了显著提升&#xff0c;同时也成为了我们日常生活中必不可少的一部分。现在&#xff0c;我们会将这种高科技功能纳入到文档撰写过程。在本文中&#xff0c;我们将展示如何构建一个宏来使用 ChatGPT API 生成文章。 关于 ChatGPT ChatGPT 是由 OpenAI 开…

html2canvas和jspdf导出pdf,每个页面模块占一页,在pdf中垂直居中显示

需求&#xff1a;html页面转换pdf&#xff0c;页面有多个模块&#xff0c;页面中有文本、echarts、表格等模块&#xff0c;一个模块占一页&#xff0c;因为模块高度不够&#xff0c;所以需要垂直居中 通过html2canvas和jspdf实现&#xff0c;html2canvas用于将页面元素生成canv…

以java编写员工管理系统(测试过 无问题)

一、系统结果的部分展示 二、题目以及相关要求 三、组成 1.该系统由 Employee 类 、commonEmployee类、Testemd类和managerEmployee类组成 2.Employee实现的代码 public class Employee {private String id;private String name;private String job;private int holiday…

弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记

弱监督参考图像分割&#xff1a;Learning From Box Annotations for Referring Image Segmentation论文阅读笔记一、Abstract二、引言三、相关工作A、全监督参考图像分割B、基于 Box 的实例分割C、带有噪声标签的学习四、提出的方法A、概述B、伪标签生成目标轮廓预测Proposal 选…

exe打包工具:advanced installer介绍(一)

前言近年来&#xff0c;web服务逐渐走向云端部署浏览器化、去APP化&#xff0c;然而exe安装仍有着举足轻重的地位&#xff0c;其好处不言而喻&#xff0c;拿到exe安装包后&#xff0c;基本就可以傻瓜安装和操作了&#xff0c;十分便捷。业务场景通过各种IDE/QT/C#/Java等开发工…

项目的生命周期与成本、风险、变更的关系

成本与人力投入水平 项目成本的投入在初始阶段逐渐增加&#xff0c;在执行的中间阶段达到顶峰&#xff0c;在项目收尾阶段逐渐下降。成本的投入趋势如下图所示&#xff1a; 初始阶段&#xff1a;从人力成本来看&#xff0c;信息系统开发团队在前期制定项目管理章程及项目管理…

PCB焊盘设计基本原则

SMT的组装质量与PCB焊盘设计有直接的关系&#xff0c;焊盘的大小比例十分重要。如果PCB焊盘设计正确&#xff0c;贴装时少量的歪斜可以再次回流焊纠正(称为自定位或自校正效应)&#xff0c;相反&#xff0c;如果PCB焊盘设计不正确&#xff0c;即使贴装位置十分准确&#xff0c;…

图像金字塔,原理、实现及应用

什么是图像金字塔 图像金字塔是对图像的一种多尺度表达&#xff0c;将各个尺度的图像按照分辨率从小到大&#xff0c;依次从上到下排列&#xff0c;就会形成类似金字塔的结构&#xff0c;因此称为图像金字塔。 常见的图像金字塔有两类&#xff0c;一种是高斯金字塔&#xff0…

为什么越来越多的人开始学习大数据

因为根据国内的发展形势&#xff0c;大数据未来的发展前景会非常好&#xff0c;前景好需求高&#xff0c;自然会吸引越来越多的人进入大数据行业 我国市场环境处于急需大数据人才但人才不足的阶段&#xff0c;所以未来大数据领域会有很多的就业机遇。 2022年春季&#xff0c;…

camunda流程引擎基本使用(笔记)

文章目录一、camunda基础1.1 安装与部署流程引擎1.2 流程引擎结构1.3 流程引擎的基本使用1.3.1 创建一个BPMN Diagram1.3.2 实现一个外部工作者1.3.3 部署流程1.3.4 创建一个流程实例并消费1.3.5 向流程中添加用户任务1.3.6 添加网关1.3.7 业务规则二、Java 集成流程引擎2.1 为…

酷开科技大数据揭秘!酷开系统中的千屏千面究竟指的是什么?

互联网行业的快速发展&#xff0c;给我们带来了极大的便利。回顾整个互联网行业的发展历程&#xff0c;从PC时代到移动互联网时代&#xff0c;从移动互联网时代到物联网时代&#xff0c;现在又即将从物联网时代迈入人工智能时代。这些飞速发展的背后&#xff0c;其实是对数据利…

ICG-alkyne,吲哚菁绿-炔基结构式,实验室科研试剂,CAS号:1622335-41-4

ICG-alkyne,吲哚菁绿-炔基 中文名称&#xff1a;吲哚菁绿-炔基 CAS号&#xff1a;1622335-41-4 英文名称&#xff1a;ICG-alkyne 英文别名&#xff1a;ICG-alk 性状&#xff1a;绿色粉末 化学式&#xff1a;C48H53N3O4S 分子量&#xff1a;768.03 溶剂&#xff1a;溶于…

3BHE029110R0111 ABB

3BHE029110R0111 ABB变频器控制方式低压通用变频输出电压为380&#xff5e;650V&#xff0c;输出功率为0.75&#xff5e;400kW&#xff0c;工作频率为0&#xff5e;400Hz&#xff0c;它的主电路都采用交—直—交电路。其控制方式经历了以下四代。1U/fC的正弦脉宽调制&#xff0…

ggplot2的组图拓展包(1):patchwork(中篇)

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集上篇和上篇续介绍了使用操作符进行组图的方法&#xff0c;这里默认读者已经能够理解各种操作符在本篇推文中的使用场景。本篇目录如下&#xff1a;0 示例图形6 plot_layout函数&#xff08;下&#xff09;6.1 guid…