一、简单介绍读写分离和主从架构
主库负责写,从库负责读;一主多从,读写分离,用多个从库分担读压力。
二、原理
MySQL 主从复制的核心是二进制日志 binlog。binlog 记录数据库中的所有变更操作,主要包含 DDL(数据定义语言)和 DML(数据操控语言)。
① 主库在事务提交时,通过两阶段提交把数据变更记录到 binlog 中;
② 从库的 IO 线程连接主库,主库的 dump 线程将 binlog 发送给从库,从库将其写入本地的中继日志 Relay Log;
③ 从库的 SQL 线程读取 Relay Log,重放其中的事件,将变更应用到从库数据,最终与主库保持一致。
这里介绍一下两阶段提交(2PC)
2PC 就是事务提交时分 prepare 和 commit 两阶段
事务提交时:
┌─────────────────────────────────────────┐
│ 阶段一:prepare(准备阶段) │
│ ① 写 redo log,状态标记为 prepare │
│ ② InnoDB 告诉 Server 层:"我准备好了" │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 阶段二:commit(提交阶段) │
│ ③ 写 binlog │
│ ④ 把 redo log 状态改为 commit │
│ ⑤ 事务提交完成 │
└─────────────────────────────────────────┘