首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 雙機熱備架構部署全紀錄:主從複寫配置、資料同步與故障切換考量

     編輯:MySQL 資料庫相關知識

架構前提

  • MySQL 版本 ≥ 3.23(建議 5.5+)。
  • Slave 版本 ≥ Master 版本(向上相容)。
  • 基於二進制日誌(Binlog)的非同步複寫。

Master 配置關鍵點

[mysqld]
server-id = 1
log-bin = mysql-bin
# 只同步指定資料庫(可選)
binlog-do-db = db1,db2
binlog-ignore-db = test,tmp
# 行基複寫(推薦,避免非確定性函數問題)
binlog_format = ROW
# 增加耐用性
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

建立複寫帳號

-- MySQL 4.0.2+ 使用 REPLICATION SLAVE
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

-- 4.0.2 之前舊版相容
GRANT FILE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

初始資料同步(關鍵步驟)

  1. Master:FLUSH TABLES WITH READ LOCK; 鎖定全庫唯讀。
  2. 記錄 Binlog 位置:SHOW MASTER STATUS; 記下 File、Position。
  3. 備份資料:
    • 物理備份(快):直接打包 datadir 目錄(tar czf /backup/master_data.tar.gz /var/lib/mysql)。
    • 邏輯備份(慢):mysqldump --master-data=1 --single-transaction --all-databases > full.sql。
  4. Master:UNLOCK TABLES; 解鎖恢復寫入。
  5. 將備份傳輸到 Slave 並還原。

Slave 配置

[mysqld]
server-id = 2
relay-log = relay-bin
relay-log-index = relay-bin.index
# 只同步指定資料庫(可選)
replicate-do-db = db1,db2
replicate-ignore-db = test,tmp
# 從庫唯讀(防止誤寫入)
read_only = 1

啟動複寫

CHANGE MASTER TO
  MASTER_HOST='master_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='slavepass',
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=73;

START SLAVE;

SHOW SLAVE STATUS\G
-- 確認:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0

常見問題與排查

現象可能原因處理
IO Thread 掛掉網路不通、帳號密碼錯、防火牆、MASTER_LOG_FILE/POS 錯檢查連線、CHANGE MASTER TO 重設位置
SQL Thread 掛掉重複鍵衝突、外鍵失敗、資料型別不符、觸發器錯誤SHOW SLAVE STATUS 看 Last_SQL_Error,修正資料後 START SLAVE
Seconds_Behind_Master 偏大Slave 機能不足、大交易、長鎖、單執行緒複寫瓶頸升級硬體、啟用多執行緒複寫(5.6+ slave_parallel_workers)、優化慢查詢
主從資料不一致Slave 直接寫入、非確定性函數、Binlog 格式問題pt-table-checksum 驗證、pt-table-sync 修復、強制 ROW 格式

故障切換(Failover)考量

  • 非同步複寫不保證零資料遺失(Master 崩潰時 Binlog 可能未傳至 Slave)。
  • 半同步複寫(rpl_semi_sync_master=1)可降低風險,至少一 Slave 收到 Binlog 才提交。
  • 生產環境建議引入 MHA、Orchestrator、GTID + 自動故障轉移工具,勿手動切換。
  • 切換前必須確認 Slave Seconds_Behind_Master = 0。

監控指標清單

  1. Slave_IO_Running、Slave_SQL_Running = Yes。
  2. Seconds_Behind_Master 接近 0。
  3. Relay_Log_Space 不持續增長。
  4. Master Binlog_Dump 執行緒正常。
  5. 磁碟空間、InnoDB Buffer Pool 命中率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved