一. “主从架构、读写分离” 的意义
对于一个上线的项目,我们通常会为其搭建MySQL的主从架构,实现读写分离,解决 读写压力不均衡的问题,有效提升运行的效率。多个Slave同时分担访问压力,可以帮助实现数据库层面的负载均衡。
为了保证MySQL主库和从库的数据一致,必须要有主从同步(主从复制)的环节。下面我们来介绍MySQL中实现主从同步的原理。
❗ 注意区分概念:
我们所说的【主从分离】指得是MySQL数据库服务器的主从分离,而不是单个数据库的主从分离。
MySQL的主服务器只有一个,我们称之为Master,主服务器里面的各个数据库也都叫 “主库” ;而MySQL的从服务器可以有多个,Slave1、Slave2…,它们所负责管理的都叫 “从库” 。
Master会把它的DDL和DML都存入binlog日志,但是请注意:在进行主从同步的时候,Slave只会接收并执行DML语句(且剔除select),即数据变化相关的【事务】,而会自动跳过DDL语句。也就是说,在最初搭建主从分离架构时,Slave上面的数据库需要我们 手动创建;涉及到数据库结构变更,Slave也无法从binlog日志中自动执行。
二. 原理核心:binlog日志
binlog日志,又称 “二进制日志” ,是MySQL的三大日志文件之一。
binlog日志的主要作用是:记录所有的DDL(数据定义语言,create、alter、drop)语句 和 DML(数据操作语言,insert、update、delete)语句,但不包括数据查询(select、show)语句。
主从同步原理:
- Master主库 在 事务提交 时,会把数据变更(增删改)记录在二进制日志文件 binlog 中;
- 从库Slave 读取主库的二进制日志文件binlog,写入到从库的中继日志 relay log。
- Slave 重做 relay log 中的事件,将改变反映在自己的库中数据上。
三. 拓展:MySQL三大日志
经过对事务与主从同步两个MySQL知识点的学习,我们对三大日志都有了初步了解,现在进行总结。
1. binlog
Binlog 属于 MySQL服务器层 产生的一种日志,记录了对数据库进行的逻辑操作,包括对数据的增、删、改操作,以及对数据库结构的变更(如创建表、修改表结构等),即 DDL + DML(除去select、show);
Binlog 主要用于实现 数据库 的 复制和恢复。在主从复制和点播复制中,主服务器会将 Binlog 发送给从服务器,从而实现数据的复制和同步。此外,Binlog 还可以用于数据库恢复 和 数据备份等场景。
2. redo log
Redo Log 是 InnoDB引擎特有的 一种日志,它记录了对数据库进行的物理修改,即 DML + 其他数据页修改操作(除去select等)。
在事务提交时,Redo Log 记录了事务对数据的修改操作,即使在数据库崩溃后,MySQL 可以通过 Redo Log 来重放事务中的修改操作,确保数据的持久性,即数据库能够在崩溃后恢复到事务提交之后的状态。Redo Log 是为了提高数据库的性能而设计的,它采用了顺序写的方式,可以降低磁盘 I/O 的开销,因此对于高性能的事务处理至关重要。
3. undo log
Undo Log 也是 InnoDB引擎特有的 一种日志,当事务执行 DML 语句(如 INSERT、UPDATE、DELETE)时,Undo Log 会记录对数据的修改操作的逆操作,即 DML的逆操作(除去select)。
如果事务执行过程中 发生错误,或者用户 显式地执行了 ROLLBACK 操作,MySQL 可以使用 Undo Log 来撤销事务对数据的修改操作,回滚事务。Undo Log 记录了事务所做的修改操作的逆操作,使得数据库能够恢复到事务开始之前的状态,保持数据库的一致性以及事务的原子性。此外,MySQL 使用 Undo Log 来实现多版本并发控制(MVCC),允许不同的事务同时访问同一数据的不同版本。