mysql读写分离的最佳实践

news2024/10/10 2:15:34

一. 传统的读写分离方式

在 MySQL 中实现读写分离可以通过以下几种方式来达到目的:

1. 主从复制

使用主从复制(Master-Slave Replication)是实现读写分离的常见方式。

  • 主库:处理所有的写入操作(INSERT、UPDATE、DELETE)。
  • 从库:负责处理读操作(SELECT)。

步骤

  1. 设置主从复制
    • 在主库上配置 binlog,并创建复制用户。
    • 在从库上配置 server-id,并指向主库的 binlog。
  2. 应用程序配置
    • 将写操作指向主库。
    • 将读操作指向从库。可以在应用层实现逻辑来决定查询使用哪个库。
2. 连接池配置

在应用程序中,使用连接池(如 HikariCP、C3P0)来管理数据库连接。

  • 读写分离:配置连接池分别用于写(主库)和读(从库)。

示例

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://主库地址");
config.setUsername("用户名");
config.setPassword("密码");
HikariDataSource dataSource = new HikariDataSource(config);

// 读操作
HikariConfig readConfig = new HikariConfig();
readConfig.setJdbcUrl("jdbc:mysql://从库地址");
HikariDataSource readDataSource = new HikariDataSource(readConfig);
3. 使用中间件

使用中间件(如 Mycat、Atlas)可以简化读写分离的实现。

  • 中间件负责路由请求,将写操作转发到主库,将读操作转发到从库。
  • 配置和管理更加灵活。
4. 应用程序逻辑

在应用程序中根据业务需求手动控制读写操作。例如:

  • 所有的写操作都通过一个 DAO(数据访问对象)发送到主库。
  • 所有的读操作则通过另一个 DAO 发送到从库。
注意事项
  • 延迟问题:从库的数据可能会有延迟,因此在进行读操作时要注意数据一致性。
  • 负载均衡:可以配置多个从库进行负载均衡。
  • 故障转移:确保主库或从库发生故障时能够快速切换。

实现读写分离可以显著提升数据库的性能,尤其是在读操作较多的场景中。


二.基于MySQL 8.2的 InnoDB ReplicaSet组件实现读写分离

我们一直在等待它!现在它已经可用!MySQL 中的读/写拆分!!

在规模上,我们在副本之间分配读取,但这必须在应用程序中以某种方式进行管理:将写入指向某处,将读取指向其他地方。

使用 MySQL 8.2,MySQL Router 现在能够识别读取和写入,并将它们路由到 InnoDB 集群中的主实例,或者路由到异步复制源进行写入,路由到辅助实例或副本进行读取。

为了说明这一点,我部署了最简单的架构:MySQL InnoDB ReplicaSet。

MySQL InnoDB ReplicaSet

MySQL InnoDB ReplicaSet

这是 MySQL Shell 中 ReplicaSet 对象的状态:

ReplicaSet status

Bootstrap MySQL Router 8.2
配置 (bootstrap) MySQL Router:

Bootstrap MySQL Router 8.2

the router in the MySQL Shell ReplicaSet object:

routers configuration

使用读写端口连接(6450):

use write&read port connect

我们可以看到,默认情况下,如果我们执行读取,我们将到达副本(辅助),但是如果我们启动事务,我们将到达复制源(主),而无需更改端口并使用相同的连接。

我们还可以看到使用只读事务时的区别:

read transaction use read replica

我们可以在 MySQL Router 的配置文件中看到生成的 R/W 分割设置:

[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://myreplica/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto

您还可以使用命令 ROUTER SET access_mode=: 在会话中定义要访问的实例类型:

RouterSetAccressMode

结论

总之,MySQL Router 8.2 支持读写拆分。这是一项有价值的功能,可用于优化数据库性能和可扩展性,而无需对应用程序进行任何更改。

此配置使您能够将所有读取流量引导至只读实例,并将所有写入流量引导至读写实例。

此功能不仅增强了整体用户体验,还简化了数据库管理和部署。

读写实例是主实例或源。只读实例是副本(InnoDB 群集辅助实例、ReplicaSet 辅助实例或副本群集中的辅助实例)。

享受 MySQL,再也没有借口不将工作负载分散到副本!


参考链接:

MySQL 8.2 – transparent read/write splitting

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

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

相关文章

Qt+VS2019+大恒相机相机回调方式总结

一、前言 大恒驱动安装完成后,在安装目录有SDK调用文档,里面有更详细的调用介绍,此文档对近期做的Demo做一个回顾性总结。 二、调用流程概述 三、针对性内容介绍: 1. 在执行相机操作之前,需要先执行此代码&#xff1…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. Evaluation of Large Language Models for Summarization Tasks in the Medical Domain: A Narrative Review摘要研究…

rust中async/await的使用

在Rust中,async/await 用于编写异步代码。它允许您以同步的方式编写异步代码,使得异步操作更易于理解和编写。 安装依赖: cargo add futures cargo add async-std 使用示例: 示例1: use async_std::task::block_o…

学习MDX

MDX(Markdown JSX)是一种开源的文件格式,它允许你在Markdown文件中使用JavaScript表达式和组件。MDX将Markdown的易用性与React组件的强大功能结合起来,使得你可以在编写文档、博客文章或其他内容时,嵌入可交互的组件…

顶会论文复现:PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

文章目录 1 资料2 我的总结3 复现源码首先你需要有gpt的api接口安装:数据集执行指令源码 4 结果 1 资料 我复现的源码:https://github.com/Whiffe/test_set_contamination 官网源码:https://github.com/tatsu-lab/test_set_contamination 论文&#x…

tts(text to speech)使用 pyttsx3 实现文本转语音 - python 实现

文本转语音(Text-to-Speech,TTS)技术是一种将文本信息转换为口语输出的技术。它涉及多个学科,包括声学、语言学、数学信号处理技术和多媒体技术等。TTS技术能够将计算机中的文本信息转换为自然流畅的语音输出,广泛应用…

OJ在线评测系统 后端微服务架构 注册中心 Nacos入门到启动

注册中心 服务架构中的注册中心是一个关键组件,用于管理和协助微服务之间的通信。注册中心的主要职责是服务的注册和发现,确保各个微服务能够相互找到并进行调用。 主要功能: 服务注册:微服务在启动时,将自身信息&am…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 OpenHarmony Camera驱动模型结构 HDI Implementation&#x…

【ubuntu】ubuntu20.04安装显卡驱动

1.安装 点击右下角Apply Changes。 等安装好之后,重启。 现在的nvidia驱动已经很好安装了,比早期时安装出现黑屏等情况好了很多。 2.验证 nvidia-smi

Mybatis plus快速使用

文章目录 Mybatis plus快速使用1.ORM2.mybatis plus介绍3.mybatis plus使用1.添加依赖2.配置信息3.启动类加入 MapperScan(“填入mapper包的位置”)4.创建user接口,在mapper中加入UserMapper接口5.mybatis-plus crud注解启动springboot项目ma…

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…

Ajax面试题:(第一天)

目录 1.说一下网络模型 2.在浏览器地址栏键入URL,按下回车之后会经历以下流程: 3.什么是三次握手和四次挥手? 4.http协议和https协议的区别 1.说一下网络模型 注:各层含义按自己理解即可 2.在浏览器地址栏键入URL,…

mybatis自定义类型处理器

mybatis自定义类型处理器 其实使用MySQL或Oracle数据库很少会遇到自定义类型处理器的情况,之前是因为项目中使用了PGSQL才接触到这块的,这里简单做一下记录 要创建一个自定义的类型处理器,就需要继承BaseTypeHandler类或者实现TypeHandler接…

数据结构 ——— 相交链表(链表的共节点)

题目要求 两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点,如果两个链表不存在相交节点,则返回 NULL 手搓两个相交简易链表 代码演示: struct ListNode* a1 (struct ListNode*)malloc(sizeof(struc…

Git 分支提交同步到主干的详细教程——(包含命令行和idea操作两种方式)

文章目录 Git 分支提交同步到主干的详细教程一、Git 命令行操作1. 确保分支上的代码已提交2. 切换到主干分支3. 拉取最新的主干分支代码4. 合并分支到主干方式一:使用 merge 进行合并方式二:使用 rebase 进行合并 5. 推送合并后的代码到远程主干分支命令…

github 搭建个人导航网

最近搭建了个 个人的导航网,具体内容见下图,欢迎大家访问吖,点击访问 具体实现是使用 vue3 编写,白嫖 github 的 page 部署 首先在 github上创建一个仓库:name.github.io # name是你 github 的名字 然后在本地创建一…

Linux安装部署MySQL8.0加遇着问题解决

1.首先我先给个URL下载MySQL官方网站https://downloads.mysql.com/archives/community/ 2.选择Linux的红帽系统 3.接着选择红帽系统的7版本,x86 4.接着选择MySQL版本,此时我选择8.4.0,下载rpm bundle这个,下载下面这个就好 5.Windows文件上传到Linux系统 rz上传文件命令,找到…

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

【redis-05】redis保证和mysql数据一致性

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

Qt+大恒相机回调图片刷新使用方式

一、前言 上篇文章介绍了如何调用大恒SDK获得回调图片,这篇介绍如何使用这些图片并刷新到界面上。考虑到相机的帧率很高,比如200fps是很高的回调频率。那么我们的刷新频率是做不到这么快,也没必要这么快。一般刷新在60帧左右就够了。 二、思路…