溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL 中主從復制的原理是什么

發布時間:2021-07-13 14:52:16 來源:億速云 閱讀:186 作者:Leah 欄目:大數據
# 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';

2. 復制線程模型

從庫通過三個核心線程實現同步:

線程類型 職責
I/O Thread 連接主庫,請求新的二進制日志事件,寫入本地中繼日志(Relay Log)
SQL Thread 讀取中繼日志并執行其中的SQL事件
Worker Thread (并行復制時)多個線程并發重放不同事務,提升同步效率

3. 復制流程詳解

  1. 主庫記錄變更
    事務提交時,主庫將變更寫入二進制日志(mysql-bin.000001
  2. 從庫拉取日志
    從庫I/O線程通過binlog dump協議請求主庫發送新事件
  3. 中繼日志存儲
    從庫將接收到的事件暫存到中繼日志(relay-bin.000001
  4. 數據重放
    從庫SQL線程按事務順序執行中繼日志中的事件
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線程執行事件

四、復制的關鍵配置項

1. 主庫配置(my.cnf)

[mysqld]
server-id = 1                # 唯一服務器ID
log_bin = mysql-bin          # 啟用二進制日志
binlog_format = ROW          # 推薦使用ROW格式
sync_binlog = 1              # 每次事務提交刷盤

2. 從庫配置(my.cnf)

[mysqld]
server-id = 2                # 不同于主庫的ID
relay_log = relay-bin        # 中繼日志路徑
read_only = ON               # 從庫只讀(超級用戶除外)

3. 建立復制鏈路

-- 主庫創建復制賬號
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;

五、復制拓撲的演進

1. 傳統異步復制

  • 特點:主庫提交事務后立即響應客戶端,不等待從庫確認
  • 缺點:存在數據丟失風險(主庫崩潰時)

2. 半同步復制

  • 改進:至少一個從庫接收并確認日志后,主庫才提交事務
  • 配置
    
    -- 主庫安裝插件
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    

3. 組復制(Group Replication)

  • MySQL 5.7+引入的集群方案
  • 基于Paxos協議實現多主一致性

六、常見問題與解決方案

1. 復制延遲

現象:從庫落后主庫數分鐘甚至數小時
優化方案: - 啟用并行復制(slave_parallel_workers) - 從庫使用SSD磁盤 - 避免大事務(拆分為小事務)

2. 數據不一致

檢測工具

pt-table-checksum --replicate=test.checksums
pt-table-sync --replicate=test.checksums h=master u=user --execute

3. 主從切換

手動切換流程: 1. 主庫設置read_only=ON 2. 從庫執行STOP SLAVE并提升為新主庫 3. 其他從庫指向新主庫


七、主從復制的應用場景

1. 讀寫分離

-- 應用層路由示例
if (is_write_query) {
    route_to_master();
} else {
    route_to_slave();
}

2. 數據備份

從庫可周期性執行mysqldump而不影響主庫性能

3. 灰度發布

在從庫測試新SQL語句,驗證無誤后再在主庫執行


八、總結

MySQL主從復制通過二進制日志傳遞+事件重放的機制,實現了數據的準實時同步。理解其底層原理有助于: - 合理設計高可用架構 - 快速排查復制故障 - 優化數據庫性能

隨著技術演進,MySQL 8.0已引入克隆插件組復制等更先進的方案,但主從復制仍是大多數生產環境的基石。

延伸閱讀
- MySQL官方復制文檔
- 《高性能MySQL》第10章:復制 “`

注:本文實際約1800字,可根據需要調整細節部分擴展至1850字。內容已涵蓋原理、配置、優化等核心知識點,并包含代碼塊、流程圖等增強可讀性。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女