MySQL 高可用基石 - 復制監控與常見 HA 方案
MySQL 復制核心原理
MySQL 復制允許數據從一個 MySQL 數據庫服務器(稱為主庫 - Primary,舊稱 Master)復制到一個或多個其他的 MySQL 服務器(稱為從庫 - Replica,舊稱 Slave)。
復制的主要目的:
- 高可用性 (High Availability):當主庫發生故障時,可以將一個從庫提升為新的主庫,從而快速恢復服務。
- 讀擴展 (Read Scalability):可以將讀密集型的查詢分發到從庫上執行,減輕主庫的壓力,提高整體讀取性能。
- 備份 (Backups):可以在從庫上執行備份操作,避免對主庫產生額外的負載和鎖競爭。
- 地理分布 (Geographic Distribution):可以將從庫部署在不同地理位置,讓用戶就近訪問數據,或作為異地災備。
基本架構 (主從復制):
- 主庫 (Primary/Master):
- 接收所有寫操作(INSERT, UPDATE, DELETE)。
- 將所有數據變更事件記錄到其二進制日志 (Binary Log,
binlog
) 中。
- 從庫 (Replica/Slave):
- 連接到主庫。
- 擁有一個 I/O 線程 (I/O Thread):該線程從主庫請求并讀取
binlog
事件,然后將這些事件寫入到從庫本地的中繼日志 (Relay Log,relay-log
)。 - 擁有一個 SQL 線程 (SQL Thread):該線程讀取中繼日志中的事件,并在從庫上重放 (replay) 這些事件,從而使從庫的數據與主庫保持一致。
二進制日志格式 (Binlog Formats):
binlog_format
參數的設置對復制的可靠性和行為有重要影響:
- STATEMENT (SBR - 基于語句的復制):(已不推薦用于生產) 直接記錄執行的 SQL 語句。對于某些非確定性函數(如
UUID()
,NOW()
依賴于執行時間)或包含用戶定義函數的語句,可能導致主從數據不一致。 - ROW (RBR - 基于行的復制):強烈推薦使用。記錄實際發生變更的數據行(通常是變更前后的行鏡像,或僅變更后的鏡像)。更安全,更能保證數據一致性,對絕大多數場景都適用。這是 MySQL 5.7.7 及之后版本的默認格式。
- MIXED (混合格式):My