# MySQL主從復制的底層原理是什么
## 一、主從復制概述
MySQL主從復制(Replication)是指將一個MySQL數據庫服務器(主庫/Master)的數據復制到一個或多個MySQL數據庫服務器(從庫/Slave)的過程。這種架構設計主要服務于以下場景:
1. **讀寫分離**:主庫寫,從庫讀
2. **數據備份**:實時熱備份方案
3. **高可用基礎**:故障轉移的基礎架構
4. **橫向擴展**:分散查詢壓力
## 二、核心架構組件
### 1. 主庫組件
- **Binary Log(二進制日志)**:
記錄所有修改數據的SQL語句(DDL和DML),以事件形式存儲
- **Dump Thread(轉儲線程)**:
主庫上負責發送binlog到從庫的專用線程
### 2. 從庫組件
- **I/O Thread**:
連接主庫,請求新的binlog事件并寫入relay log
- **SQL Thread**:
讀取relay log中的事件并執行
- **Relay Log(中繼日志)**:
存儲從主庫接收的binlog事件副本
## 三、復制工作原理詳解
### 1. 二進制日志記錄階段
當主庫執行事務時:
```sql
-- 示例事務
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET amount = amount + 100 WHERE id = 2;
COMMIT;
主庫的存儲引擎處理完成后:
1. 將事務寫入binlog(默認ROW格式記錄行變更)
2. 提交事務到存儲引擎
3. 通過sync_binlog參數控制刷盤策略
從庫I/O線程的工作流程:
1. 向主庫發送COM_BINLOG_DUMP命令
2. 主庫dump線程讀取binlog事件
3. 通過TCP連接發送到從庫
4. 從庫接收后寫入relay log
5. 更新master.info文件記錄復制位置
SQL線程執行流程:
1. 讀取relay log中的事件
2. 解析事件內容(區分不同格式的binlog)
3. 在從庫上執行對應的SQL語句
4. 更新relay-log.info文件記錄執行位置
MySQL提供三種binlog格式:
| 格式類型 | 特點 | 適用場景 |
|---|---|---|
| STATEMENT | 記錄原始SQL語句 | 日志量小,但不安全 |
| ROW | 記錄行數據變化(默認) | 數據安全,日志量大 |
| MIXED | 混合模式,智能切換 | 平衡安全性與性能 |
ROW格式示例:
# UPDATE users SET name='張三' WHERE id=1
BINLOG '
...
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='李四' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### SET
### @2='張三' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
...
'
server-id = 1 # 必須唯一
log_bin = mysql-bin # 啟用binlog
binlog_format = ROW # 推薦ROW格式
sync_binlog = 1 # 事務提交同步刷盤
binlog_group_commit_sync_delay = 100 # 組提交優化
server-id = 2 # 區別于主庫
relay_log = mysql-relay # 中繼日志路徑
log_slave_updates = ON # 級聯復制時需要
read_only = ON # 確保從庫只讀
slave_parallel_workers = 4 # 并行復制線程數
傳統單線程復制:
基于組的并行復制(5.7+):
graph LR
Coordinator-->Worker1
Coordinator-->Worker2
Coordinator-->Worker3
slave_parallel_type=LOGICAL_CLOCK啟用基于WRITESET的復制(8.0+):
binlog_transaction_dependency_tracking = WRITESET
transaction_write_set_extraction = XXHASH64
sequenceDiagram
Master->>Slave: 發送事務事件
Slave-->>Master: ACK確認
Master->>Client: 返回成功
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 10000; # 10秒超時
-- 主庫生成校驗和
SELECT * FROM performance_schema.replication_group_member_checksums;
-- 從庫驗證
SELECT * FROM performance_schema.replication_group_member_checksums;
復制延遲:
數據不一致:
故障切換: “`sql – 傳統方式 STOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO…
– 使用GTID(推薦)
SET GLOBAL gtid_purged=’
## 九、技術演進方向
1. **原子復制**(8.0+):
- 保證DDL操作的原子性應用
- 解決長期存在的復制中斷問題
2. **Clone Plugin**:
```sql
-- 從庫快速重建
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
CLONE INSTANCE FROM 'user'@'host':3306 IDENTIFIED BY 'password';
通過深入理解MySQL復制機制,可以構建更健壯的數據庫架構,為業務系統提供可靠的數據服務基礎。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。