mysql读写分离的最佳实践

news/2024/10/7 23:59:13

一. 传统的读写分离方式

在 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 Shell 中 ReplicaSet 对象的状态:

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

the router in the MySQL Shell ReplicaSet object:

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

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

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

我们可以在 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=: 在会话中定义要访问的实例类型:

结论

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

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

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

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

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


参考链接:

MySQL 8.2 – transparent read/write splitting

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

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

相关文章

《机器学习初步》笔记 第一章

第一章 绪论 1.1 引言 机器学习的经典定义:利用经验(数据)改善系统自身的性能 经典的机器学习过程:机器学习最重要的理论模型:PAC(概览近似正确)1.2 基本术语 数据集:一组记录的集合 学习/训练:通过执行某个学习算法,得到模型,学的的模型对应数据的某种潜在规律 示例…

XTimer定时微服务项目

定时微服务项目,分布式架构下的定时器Xtimer定时微服务 项目背景 在学校社团中,有给社团成员发送活动通知的任务需求 有定期执行某项任务的需求,比如每周末举办一次线下活动,每个月举行一次团建 再比如,我有一个任务需要设置定时发布 定时微服务调研对比方案 不足点JavaTi…

集合竞价如何看强弱?

买股票前先把集合竞价搞懂 一、集合竞价介绍 1. 什么是集合竞价 所谓集合竞价是指在股票每个交易日上午9:15—9:25,由投资者按照自己所能接受的心理价格自由地进行买卖申请。详情可参考下图:注:严谨的集合竞价时间为9:15-9:25,下文在聊到集合竞价时候我会把9:25-9:30时间…

ECS云服务器搭建Mysql,并提供公网连接

搭建mysql8.0参考:https://blog.csdn.net/ShockChen7/article/details/126965940 搭建完成之后,使用navicat发现连接不上,发现是因为安全组没有设置:安全组需要开放3306端口。 百度参考: 然后我改了下安全组就可以供外部连接了。

清单文件 AndroidManifest.xml

每个应用的根目录中都必须包含一个 AndroidManifest.xml,并且文件名必须一模一样。 这个文件中包含了APP的配置信息,系统需要根据里面的内容运行APP的代码,显示界面。

gradle

Gradle 是一个项目自动化构建工具,帮我们做了依赖、打包、部署、发布、各种渠道的差异管理等工作。 项目级别的 build.gradle 指定了当前项目的总体编译规则。 模块级别的 build.gradle 对应于具体模块,每个模块都有自己的 build.gradle,它指定了当前模块的详细编译规则。想…

20222420 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.1 学习内容总结 1.1.1 初步了解缓冲区溢出漏洞 首先学习了安全漏洞的相关概念,然后聚焦在其中的缓冲区溢出漏洞上。学习了缓冲区溢出漏洞相关的定义和发生的原因,并了解了缓冲区溢出发展历史上的经典攻击,如红色代码蠕虫、冲击波病毒、震荡波病毒、心脏出血、乌…