首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基础架构:一条SQL查询语句是如何执行的?
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
07 | 行锁功过:怎么减少行锁对性能的影响?
08 | 事务到底是隔离的还是不隔离的?
09 | 普通索引和唯一索引,应该怎么选择?
10 | MySQL为什么有时候会选错索引?
11 | 怎么给字符串字段加索引?
12 | 为什么我的MySQL会“抖”一下?
13 | 为什么表数据删掉一半,表文件大小不变?
14 | count(*)这么慢,我该怎么办?
15 | 答疑文章(一):日志和索引相关问题
16 | “order by”是怎么工作的?
17 | 如何正确地显示随机消息?
18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
19 | 为什么我只查一行的语句,也执行这么慢?
20 | 幻读是什么,幻读有什么问题?
21 | 为什么我只改一行的语句,锁这么多?
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
23 | MySQL是怎么保证数据不丢的?
24 | MySQL是怎么保证主备一致的?
25 | MySQL是怎么保证高可用的?
26 | 备库为什么会延迟好几个小时?
27 | 主库出问题了,从库怎么办?
28 | 读写分离有哪些坑?
29 | 如何判断一个数据库是不是出问题了?
30 | 答疑文章(二):用动态的观点看加锁
31 | 误删数据后除了跑路,还能怎么办?
32 | 为什么还有kill不掉的语句?
33 | 我查这么多数据,会不会把数据库内存打爆?
34 | 到底可不可以使用join?
35 | join语句怎么优化?
36 | 为什么临时表可以重名?
37 | 什么时候会使用内部临时表?
38 | 都说InnoDB好,那还要不要使用Memory引擎?
39 | 自增主键为什么不是连续的?
40 | insert语句的锁为什么这么多?
41 | 怎么最快地复制一张表?
42 | grant之后要跟着flush privileges吗?
43 | 要不要使用分区表?
44 | 答疑文章(三):说一说这些好问题
45 | 自增id用完怎么办?
当前位置:
首页>>
技术小册>>
MySQL 实战 45 讲
小册名称:MySQL 实战 45 讲
### 24 | MySQL是怎么保证主备一致的? 在MySQL的高可用架构中,主从复制(Master-Slave Replication)是一个核心组件,它不仅用于数据的读写分离以提升系统性能,还是数据备份、灾难恢复及高可用性策略的基础。然而,要确保主库(Master)与从库(Slave)之间数据的一致性,MySQL采用了一系列复杂的机制和技术。本章将深入探讨MySQL是如何通过复制过程来确保主备数据一致性的。 #### 一、MySQL复制的基本概念 MySQL的复制功能允许将数据从一个MySQL数据库服务器(主服务器)复制到一个或多个MySQL数据库服务器(从服务器)。默认情况下,复制是异步的,并且从服务器不需要持续连接到主服务器来接收数据。主服务器在其二进制日志(Binary Log)中记录所有更改数据库数据的语句(如INSERT、UPDATE、DELETE等),这些更改随后会被复制到从服务器并应用,以保持数据的一致性。 #### 二、复制的核心组件 1. **二进制日志(Binary Log)**: 主服务器上的二进制日志记录了所有修改数据的SQL语句,这些语句按照执行顺序记录,是复制过程的基础。 2. **中继日志(Relay Log)**: 从服务器上的中继日志是二进制日志的副本,用于在从服务器上重新执行这些语句。中继日志的存在允许从服务器即使与主服务器断开连接也能继续执行复制操作。 3. **复制I/O线程(IO Thread)**: 从服务器上有一个专门的线程负责从主服务器请求二进制日志的内容,并将其写入到从服务器的中继日志中。 4. **复制SQL线程(SQL Thread)**: 另一个在从服务器上运行的线程,负责读取中继日志中的事件,并在从服务器上执行这些事件,以更新数据,保持与主服务器数据的一致性。 #### 三、复制过程详解 1. **主库操作**: - 当用户对主库的数据进行修改时(如INSERT、UPDATE、DELETE),这些操作首先被应用到主库的数据库中。 - 同时,这些操作被记录到主库的二进制日志中。 - 如果配置了同步复制(虽然MySQL默认是异步的,但可以通过插件如Semi-Sync Replication实现),则等待从库确认接收到了这些日志事件后,主库的操作才算完成。 2. **复制I/O线程**: - 从库上的复制I/O线程定期连接到主库,请求二进制日志中的新事件。 - 这些新事件被从主库传输到从库,并被写入到从库的中继日志中。 - 一旦中继日志写入完成,I/O线程会通知SQL线程有新的日志可以处理。 3. **复制SQL线程**: - SQL线程从中继日志中读取事件,并按照事件的顺序在从库上执行它们。 - 这些操作会更新从库的数据,使其与主库保持一致。 - 如果执行过程中遇到错误,SQL线程会停止,直到问题被解决并手动启动。 #### 四、确保主备一致性的关键机制 1. **日志位置管理**: - 每个二进制日志和中继日志都有一个唯一的位置标识符(position),记录了日志中当前读取或写入的位置。 - 主库和从库通过交换这些位置信息来确保复制过程的同步。 2. **GTID(全局事务标识符)**: - 从MySQL 5.6开始,引入了GTID(Global Transaction Identifier)机制,为每个事务分配一个全局唯一的标识符。 - 使用GTID可以更容易地管理复制过程中的事务,即使从库在复制过程中发生故障,也可以从正确的位置恢复复制,无需担心事务的重复或遗漏。 3. **并行复制**: - MySQL 5.6及更高版本支持并行复制,即多个SQL线程可以同时执行中继日志中的不同事件,从而加快复制速度。 - 然而,并行复制的实现方式(如基于库的并行复制或基于组的并行复制)需要仔细配置,以确保数据的一致性不被破坏。 4. **错误处理和重试机制**: - 如果从库在执行中继日志中的事件时遇到错误,它会停止SQL线程,并记录错误信息。 - 管理员需要手动介入解决问题,并可以重新启动SQL线程以继续复制过程。 - 在某些情况下,如网络中断或配置错误,I/O线程也可能停止,需要手动重启。 5. **半同步复制(Semi-Sync Replication)**: - 半同步复制是MySQL提供的一种可选的复制模式,它在完全异步复制和完全同步复制之间取得平衡。 - 在这种模式下,主库等待至少一个从库确认接收到了二进制日志事件后,才认为事务提交成功。 - 这增加了主库操作的延迟,但提高了数据一致性的保障。 #### 五、总结 MySQL通过复杂的复制机制,包括二进制日志、中继日志、复制I/O线程和SQL线程等组件,确保了主库和从库之间数据的一致性。此外,通过日志位置管理、GTID、并行复制、错误处理和重试机制以及半同步复制等关键技术,MySQL提供了灵活且可靠的数据复制解决方案。然而,为了确保复制过程的稳定性和数据的一致性,管理员需要仔细配置和监控复制环境,及时解决可能出现的问题。 在构建高可用的MySQL系统时,深入理解这些复制机制及其工作原理是至关重要的。只有这样,我们才能充分利用MySQL的复制功能,实现数据的读写分离、备份恢复和高可用性,从而保障业务系统的稳定运行。
上一篇:
23 | MySQL是怎么保证数据不丢的?
下一篇:
25 | MySQL是怎么保证高可用的?
该分类下的相关小册推荐:
MySQL从入门到精通(四)
SQL零基础到熟练应用(增删改查)
细说MySQL(零基础到高级应用)
MySQL8.0入门与实践
MySQL从入门到精通(三)
MySQL必会核心问题
MySQL从入门到精通(五)
MySQL从入门到精通(二)
MySQL从入门到精通(一)