主从复制
一、主从复制到底解决什么问题
先从 第一性原理想。
数据库系统有三个核心压力:
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 | master data = new |
原因常见有:
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