Java大佬必知必会——MySQL主从复制

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 如果你现在有两台MySQL,一台版本是03年的MySQL5.0,另一台是18年的MySQL8.0.11。新版本可以作为老版本的从服务器,但反过来是不可行的。如果二进制文件包含了已存在的数据,就会造成数据重复了。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。,老版本可能无法解析新版本的新特性,甚至复制的文件格式都差异太大。MySQL从库只会复制它本身缺失的最新数据,利用二进制文件里的。

在这里插入图片描述

本文收录在我开源的《Java学习面试指南》中,目前已经更新有近200道面试官常考的面试题,涵盖了Java系列、Redis系列、MySQL系列、多线程系列、Kafka系列、JVM系列、ZooKeeper系列等等。GitHub地址:https://github.com/hdgaadd/JavaGetOffer,相信你看了一定会有所收获。

1. MySQL主从复制

面试官:MySQL主从复制了解吧?

回答这个问题前,大家先思考下MySQL主从复制起到了什么作用。知道技术诞生的缘由,技术原理和步骤的整个逻辑推导就很清晰。

MySQL主从复制把数据库数据同步到多台服务器上,同理就可以把读操作分布到多台服务器上,这对于那些读密集型的系统性能提升是很大的。

数据有了多台服务器的备份,就不怕单点故障。我们只需要快速切换到另一台MySQL服务器即可,减少了数据库宕机的时间。

MySQL主从复制主要是利用了主库的Binary Log二进制文件来进行数据复制

复制的步骤可以分为三步。

  1. 主库根据数据库事务提交的顺序,把数据更改记录到二进制文件Binary Log中。
  2. 备库建立TCP/IP连接后通过IO线程获取Binary Log,同时将Binary Log复制到中继日志Relay Log。
  3. 备库再读取中继日志Realy Log中的事件,重放到备库的数据里。

如果你现在有两台MySQL,一台版本是03年的MySQL5.0,另一台是18年的MySQL8.0.11。新版本可以作为老版本的从服务器,但反过来是不可行的。MySQL的复制具有向后兼容性,老版本可能无法解析新版本的新特性,甚至复制的文件格式都差异太大。

在这里插入图片描述

1.1 二进制文件的日志格式

面试官:那Binary Log日志格式知道有哪些?

MySQL提供了三种二进制日志格式用于主从复制。

  1. 基于语句的二进制文件,保存了在MySQL主库所有执行过的数据变更语句,相当于从库需要把主库执行过的SQL都执行一遍。
  2. 基于行的二进制文件,会把每条被改变的行记录都作为事件写入到二进制文件中。缺点也很明显,行记录的事件是很多的,可能会导致二进制文件大小过大。这种复制模式通常来说让带宽压力更大些。
  3. 混合模式。MySQL能够在以上两种复制模式之间动态切换,默认会使用基于语句的复制方式,如果发现无法被正确复制,就切换成基于行的复制方式。

1.2 二进制文件选择

面试官:知道哪种二进制格式比较好吗?

基于语句的二进制文件,有可能会出现数据不一致的问题。例如某条删除语句SQL要删除10000条数据中的1000条,这条删除语句没有采用order by进行排序。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。

# 没有排序的删除语句
delete from test where name = 'JavaGetOffer' limit 1000;
# 有排序的删除语句
delete from test where name = 'JavaGetOffer' order by id asc limit 1000;

混合模式的话不确定因素太多,两种复制模式的不断切换可能回导致二进制日志出现不可预测的事件。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。

一般来说选择行的复制会更加稳妥,也更加安全。虽然二进制文件过大会带来带宽压力大和复制较慢的问题,但比起数据安全性来说,显然后者更加重要。

1.3 主从模式的优点

面试官:那MySQL主从模式有什么好处?

大家如果有细看第一个面试官问题就知道上文已经有答案了,我这里再总结下。

  1. 对于读密集的应用程序,可以利用MySQL主从模式将读操作负载均衡到多个从服务器上,提高系统的抗压能力。
  2. MySQL主从还可以避免单点问题,有效减少数据库宕机的时间。同时多个数据源支持查询保证了数据库的可用性
  3. 另外如果需要对MySQL进行版本升级,可以先对备库进步版本升级,保证查询可用的同时,再慢慢升级其他全部MySQL实例。

2. 全局事务标识符

面试官:如果把二进制文件丢给从库,从库是不是复制整个文件?

能设计出MySQL的聪明人肯定不会这么傻。如果二进制文件包含了已存在的数据,就会造成数据重复了。

MySQL从库只会复制它本身缺失的最新数据,利用二进制文件里的全局事务标识符(GTID)就可以找到对应的二进制文件具体位置

主库的每一次事务提交都会被分配一个唯一的全局事务标识符,这个标识由server_uuid和一个递增的事务编号组成。

MySQL从库是根据本身当前全局事务标识符找到二进制文件对应位置才进行复制而不是复制全部。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
215 13
|
7月前
|
人工智能 Java 关系型数据库
Java的时间处理与Mysql的时间查询
本文总结了Java中时间与日历的常用操作,包括时间的转换、格式化、日期加减及比较,并介绍了MySQL中按天、周、月、季度和年进行时间范围查询的方法,适用于日常开发中的时间处理需求。
134 0
|
9月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
12月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
721 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
12月前
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
290 40
|
12月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
12月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
454 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
12月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
1347 11
|
自然语言处理 Java 关系型数据库
Java mysql根据很长的富文本如何自动获取简介
通过使用Jsoup解析富文本并提取纯文本,然后根据需要生成简介,可以有效地处理和展示长文本内容。该方法简单高效,适用于各种应用场景。希望本文对您在Java中处理富文本并生成简介的需求提供实用的指导和帮助。
241 9
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
246 1

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多