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

MySQL 主從複製架構實戰:配置詳解、故障處理與最佳實踐

     編輯:MySQL 資料庫相關知識

架構概覽

基於 RHEL 5.4 + MySQL 5.0.77,雙節點異步複製:

  • Master (192.168.1.243): 寫入節點,開啟 Binlog
  • Slave (192.168.1.244): 讀取節點,回放 Relay Log

Master 端配置詳解 (/etc/my.cnf)


[mysqld]
server-id=1                           # 全局唯一,Slave 設 2、3...
log-bin=mysql-bin                     # 啟用 Binlog,文件名前綴
binlog-do-db=test                     # 只同步指定庫 (多行可配多庫)
binlog-do-db=wo
binlog-do-db=wo_icmdp
# binlog-ignore-db=mysql              # 互斥:二選一,建議用 do-db 白名單
skip-locking                          # 5.0 舊參數,5.5+ 建議 skip-external-locking
key_buffer=16M                        # MyISAM 索引緩存
max_allowed_packet=1M
table_cache=64
sort_buffer_size=512K
read_buffer_size=256K
read_rnd_buffer_size=512K
myisam_sort_buffer_size=8M
default-character-set=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1              # 表名不區分大小寫 (Windows 兼容)
datadir=/opt/MySQL_M/
socket=/opt/mysql_M/mysql.sock
log=/opt/mysql_M/logs/mysql.log
long_query_time=2
log-slow-queries=/opt/mysql_M/logs/slowquery.log

[client]
port=3306
socket=/opt/mysql_M/mysql.sock

Slave 端配置詳解 (/etc/my.cnf)


[mysqld]
server-id=2
master-host=192.168.1.243             # Master IP (5.1+ 建議用 CHANGE MASTER TO)
master-user=slave                     # 複製賬號
master-password=123456                # 明文風險,5.6+ 支持 master_info_repository=TABLE
master-port=3306
master-connect-retry=60               # 重試間隔
replicate-do-db=test                  # 只同步指定庫
# replicate-do-db=wo
# replicate-do-db=wo_icmdp
# replicate-ignore-db=mysql
log-bin=mysql-bin                     # Slave 也開 Binlog 便於級聯/備份
log=/opt/mysql_S/logs/mysql.log
long_query_time=2
log-slow-queries=/opt/mysql_S/logs/slowquery.log
# 其他緩存參數同 Master

[client]
port=3306
socket=/opt/mysql_S/mysql.sock

核心參數對照表

參數MasterSlave說明
server-id12集群內全局唯一,極其重要
log-bin✅ 必開建議開Binlog 是複製數據源
binlog-do-db白名單—Master 端過濾,減少網傳
replicate-do-db—白名單Slave 端過濾,靈活但多傳數據
sync_binlog1 (推薦)—每提交刷盤,最安全,性能略損
innodb_flush_log_at_trx_commit11雙 1 配置,保證不丟事務

部署標準化流程

  1. 準備數據目錄: mkdir -p /opt/MySQL_M /opt/MySQL_S && chown -R mysql:mysql /opt/MySQL_*
  2. Master 創建複製賬號:
    GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'slave'@'192.168.1.%' IDENTIFIED BY 'StrongPass#2024';
    FLUSH PRIVILEGES;
  3. Master 完全備份 (含 Binlog 位點):
    # 1. 加全局讀鎖
    FLUSH TABLES WITH READ LOCK;
    # 2. 記錄位點
    SHOW MASTER STATUS;  -- 記下 File、Position
    # 3. 物理備份 (或 mysqldump --master-data=2)
    tar czf /tmp/master_data.tar.gz /opt/MySQL_M
    # 4. 解鎖
    UNLOCK TABLES;
  4. Slave 導入數據並配置: 解壓備份 → 修改 server-id=2 → 啟動 MySQL → 執行 CHANGE MASTER TO ... (5.1+ 推薦動態配置,不寫死 my.cnf)
  5. 啟動複製並驗證:
    START SLAVE;
    SHOW SLAVE STATUS\G;
    -- 關鍵指標:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: 0

關鍵狀態指標深度解讀 (SHOW SLAVE STATUS)

  • Slave_IO_Running: IO 線程狀態。Connecting to master = 網絡/賬號/防火牆問題;Waiting for master to send event = 正常等待
  • Slave_SQL_Running: SQL 線程狀態。No 通常因重複鍵、外鍵失敗、表結構不一致
  • Seconds_Behind_Master: 延遲秒數。NULL 表示 SQL 線程停止;大值表示 Slaves 慢/網絡延遲/大事務回放
  • Last_IO_Error / Last_SQL_Error: 具體錯誤信息,排查首選
  • Relay_Log_Space: Relay Log 總大小,受 relay_log_space_limit 控制

常見故障與處理方案

故障現象根因解決方案
Duplicate entry for key PRIMARY主鍵衝突、雙主寫入、手動操作STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; (謹慎用,可能數據不一致)
Slave_IO_Running: No網絡不通、賬號錯誤、Binlog 丟失檢查防火牆、CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...; 重新指定位點
Seconds_Behind_Master 持續增大大事務、Slave 硬件弱、長鎖表優化大事務拆分、升級 Slave 配置、slave_parallel_workers>0 (5.6+ 並行複製)
Binlog 文件過多佔磁盤未設置過期清理expire_logs_days=7 或 PURGE BINARY LOGS BEFORE '2024-01-01';

高可用進階演進

  1. GTID 複制 (5.6+): 全局事務 ID,自動定位位點,故障切換無需手動 CHANGE MASTER
  2. 半同步複製: rpl_semi_sync_master=ON,Master 等至少 1 個 Slave 收到 Binlog 才提交,極大降低數據丟失風險
  3. MGR (MySQL Group Replication, 5.7+): 組複製,多主 Paxos 協議,自動故障切換,強一致性
  4. 監控體系: Prometheus + mysqld_exporter 采集 Seconds_Behind_Master、Slave_*_Running、Relay_Log_Space,配置告警

總結

MySQL 主從複製是讀寫分離、災備、高可用的基石。核心在於:server-id 唯一、Binlog 完整、位點精準、權限最小、監控全覆蓋。5.0 時代配置寫死 my.cnf,現代版本全面轉向 CHANGE MASTER TO 動態管理 + GTID。生產環境務必配合 sync_binlog=1、innodb_flush_log_at_trx_commit=1「雙 1」配置,並建立定期 pt-table-checksum 數據一致性校驗機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved