主从复制

一、主从复制到底解决什么问题

先从 第一性原理想。

数据库系统有三个核心压力:

1 写压力
2 读压力
3 高可用

单机数据库:

write
read

全部在一台机器上。

很快会遇到:

CPU瓶颈
IO瓶颈
连接数瓶颈

于是最自然的架构就是:

     write  

client ——-> master
|
|
v
slave1
slave2
slave3

核心思想:

master 负责写
slave 负责读

于是得到:

读写分离 (Read Write Split)


二、Replication核心架构

MySQL replication 有三个关键组件:

master
binlog
slave

但真实结构其实是:

master
└── binlog

slave
├── IO thread
├── relay log
└── SQL thread

这个图你要在脑子里非常清楚:

    MASTER  
  +--------+  

write | |
—–>| |
| |
+——–+
|
| binlog
v
network
|
v
SLAVE
+—————-+
| IO thread |
| ↓ |
| Relay Log |
| ↓ |
| SQL thread |
+—————-+


三、binlog到底是什么

你老师说:

binlog记录DDL和DML

这句话 只说了表层

真正理解要知道三件事。


1 binlog是Server层日志

MySQL架构:

Server Layer
|
Storage Engine
|
InnoDB

日志系统:

redo log -> InnoDB层
binlog -> Server层

区别:

日志 作用
redo log crash recovery
binlog replication

2 binlog是逻辑日志

redo log记录:

page change

binlog记录:

SQL or row change

例如:

update user set age=20 where id=1

binlog记录:

这个update操作


3 binlog在事务提交时写入

事务提交流程:

1 写redo log prepare
2 写binlog
3 commit redo log

这个叫:

两阶段提交 (2PC)

解决:

binlog 与 redo log 一致性

这个面试很爱问。


四、主从复制真实流程

老师讲三步:

1 master写binlog
2 slave读binlog
3 slave执行

但真实过程其实是:

五步。


Step1 事务提交写binlog

master执行:

insert
update
delete

事务提交时:

写入:

binlog file

例如:

mysql-bin.000001


Step2 slave发起复制请求

slave执行:

CHANGE MASTER TO

建立连接。

slave会记录:

binlog file
position

例如:

mysql-bin.000001
pos 120


Step3 master创建dump thread

master为每个slave创建:

binlog dump thread

作用:

推送binlog


Step4 slave IO thread

slave IO线程:

读取binlog

写入:

relay log

结构:

master binlog

IO thread

relay log


Step5 SQL thread执行

slave SQL线程:

读取relay log

执行:

INSERT
UPDATE
DELETE

最终:

slave数据 = master数据


五、binlog三种格式

这个 100%面试必问

binlog有三种格式。


1 STATEMENT

记录:

SQL语句

例如:

UPDATE user SET age=20 WHERE id=1

优点:

日志小

缺点:

可能不一致

例如:

update user set create_time = now()

不同机器时间不同。


2 ROW

记录:

行变化

例如:

id=1 age=18 -> age=20

优点:

绝对一致

缺点:

日志很大


3 MIXED

自动选择:

statement + row

MySQL默认:

ROW


六、复制延迟 (Replication Lag)

这是 production 常见问题。

延迟产生原因:

master 写入很快
slave 执行慢

于是:

1
2
master data = new
slave data = old

原因常见有:

1 slave CPU弱
2 大事务
3 SQL执行慢
4 IO慢


查看延迟

命令:

show slave status

关键字段:

Seconds_Behind_Master


七、复制并行

早期MySQL:

单SQL thread

执行:

串行

性能很差。

后来引入:

parallel replication

例如:

按库并行
按事务组并行

配置:

slave_parallel_workers


八、主从复制的关键配置

这些是你必须认识的参数。


master

开启binlog:

log_bin

server id:

server-id=1


slave

配置主库:

CHANGE MASTER TO

启动复制:

START SLAVE

查看状态:

SHOW SLAVE STATUS


九、主从复制不是强一致

这是非常重要的认知。

MySQL replication 是:

异步复制

意味着:

master commit
slave 可能还没同步

所以:

读到旧数据

这是:

最终一致性


十、你必须记住的核心知识点(面试)

如果面试问:

MySQL主从复制原理?

你必须说出 这六个关键词:

binlog
IO thread
SQL thread
relay log
binlog dump thread
position

结构图必须在脑子里:

master
|
binlog
|
dump thread
|
network
|
slave IO thread
|
relay log
|
slave SQL thread