# MySQL 中主從復制的原理是什么
## 一、引言
在現代數據庫架構中,**主從復制(Master-Slave Replication)** 是 MySQL 最核心的高可用方案之一。它通過將主庫(Master)的數據變更同步到一個或多個從庫(Slave),實現數據冗余、讀寫分離、負載均衡等關鍵功能。本文將深入剖析 MySQL 主從復制的工作原理、核心組件及典型應用場景。
---
## 二、主從復制的基本架構
### 1. 核心角色
- **主庫(Master)**
接收所有寫操作,并將變更記錄到二進制日志(Binary Log)。
- **從庫(Slave)**
通過拉取主庫的二進制日志,重放(Replay)數據變更以實現同步。
### 2. 數據流向
應用寫入 → 主庫 → 二進制日志 → 從庫I/O線程 → 中繼日志 → 從庫SQL線程 → 數據落地
---
## 三、主從復制的核心原理
### 1. 二進制日志(Binary Log)
主庫通過二進制日志記錄所有**數據變更事件**(DDL/DML),這是復制的數據源。
**關鍵特性:**
- 三種日志格式:STATEMENT(語句)、ROW(行數據)、MIXED(混合模式)
- ROW模式是主流選擇,可避免函數/觸發器導致的復制不一致
```sql
-- 查看二進制日志格式
SHOW VARIABLES LIKE 'binlog_format';
從庫通過三個核心線程實現同步:
線程類型 | 職責 |
---|---|
I/O Thread | 連接主庫,請求新的二進制日志事件,寫入本地中繼日志(Relay Log) |
SQL Thread | 讀取中繼日志并執行其中的SQL事件 |
Worker Thread | (并行復制時)多個線程并發重放不同事務,提升同步效率 |
mysql-bin.000001
)binlog dump
協議請求主庫發送新事件relay-bin.000001
)sequenceDiagram
participant Master
participant Slave
Master->>Slave: 1. 事務提交寫入binlog
Slave->>Master: 2. I/O線程請求新事件
Master->>Slave: 3. 發送binlog事件
Slave->>Slave: 4. 寫入relay log
Slave->>Slave: 5. SQL線程執行事件
[mysqld]
server-id = 1 # 唯一服務器ID
log_bin = mysql-bin # 啟用二進制日志
binlog_format = ROW # 推薦使用ROW格式
sync_binlog = 1 # 每次事務提交刷盤
[mysqld]
server-id = 2 # 不同于主庫的ID
relay_log = relay-bin # 中繼日志路徑
read_only = ON # 從庫只讀(超級用戶除外)
-- 主庫創建復制賬號
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 從庫配置主庫信息
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
-- 啟動復制
START SLAVE;
-- 主庫安裝插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
現象:從庫落后主庫數分鐘甚至數小時
優化方案:
- 啟用并行復制(slave_parallel_workers
)
- 從庫使用SSD磁盤
- 避免大事務(拆分為小事務)
檢測工具:
pt-table-checksum --replicate=test.checksums
pt-table-sync --replicate=test.checksums h=master u=user --execute
手動切換流程:
1. 主庫設置read_only=ON
2. 從庫執行STOP SLAVE
并提升為新主庫
3. 其他從庫指向新主庫
-- 應用層路由示例
if (is_write_query) {
route_to_master();
} else {
route_to_slave();
}
從庫可周期性執行mysqldump
而不影響主庫性能
在從庫測試新SQL語句,驗證無誤后再在主庫執行
MySQL主從復制通過二進制日志傳遞+事件重放的機制,實現了數據的準實時同步。理解其底層原理有助于: - 合理設計高可用架構 - 快速排查復制故障 - 優化數據庫性能
隨著技術演進,MySQL 8.0已引入克隆插件和組復制等更先進的方案,但主從復制仍是大多數生產環境的基石。
延伸閱讀:
- MySQL官方復制文檔
- 《高性能MySQL》第10章:復制 “`
注:本文實際約1800字,可根據需要調整細節部分擴展至1850字。內容已涵蓋原理、配置、優化等核心知識點,并包含代碼塊、流程圖等增強可讀性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。