mysql主從復制是基于日志的數據同步機制,通過主庫記錄binary log、從庫讀取并重放日志實現數據一致。具體步驟為:1.主庫寫入數據生成binary log;2.從庫連接主庫請求日志更新;3.主庫發送日志內容;4.從庫寫入relay log;5.sql線程執行日志語句。配置關鍵點包括:1.主庫開啟binlog并設置唯一server-id;2.創建復制賬號并授權;3.獲取主庫binlog位置;4.配置從庫server-id和relay log;5.啟動復制線程。主從復制支持故障切換、讀寫分離和熱備恢復,但需配合mha、orchestrator等工具實現高可用。常見問題如復制中斷、數據不一致、延遲過大可通過錯誤排查、跳過事務或重新初始化解決。維護中需持續監控以確保穩定性。
在 mysql 數據庫系統中,主從復制是一種非常常見的數據同步機制。它通過將一個數據庫服務器(主庫)的數據變更操作復制到另一個或多個數據庫服務器(從庫),實現數據冗余和負載分擔。對于追求高可用、可擴展的數據庫架構來說,主從復制是基礎也是關鍵的一環。
主從復制的基本原理
MySQL 的主從復制本質上是基于日志的復制機制。主庫會把所有的寫操作記錄到二進制日志(binary log)中,從庫則通過讀取這些日志并重放(replay)其中的操作,來保持與主庫的數據一致性。
這個過程大致分為以下幾個步驟:
- 主庫寫入數據時生成 binary log
- 從庫連接主庫并請求 binary log 的更新內容
- 主庫將日志內容發送給從庫
- 從庫將接收到的日志寫入自己的 relay log
- SQL 線程讀取 relay log 并執行相應語句
這種方式保證了從庫能“追上”主庫的數據狀態,但也會因為網絡延遲、負載壓力等因素導致一定時間內的數據不一致。
配置主從復制的關鍵步驟
要完成主從復制配置,有幾個核心點需要設置清楚:
-
主庫開啟 binlog 并設置 server-id
- 修改 my.cnf 文件:
server-id=1 log-bin=mysql-bin
- 修改 my.cnf 文件:
-
創建用于復制的賬號
- 在主庫執行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
- 在主庫執行:
-
獲取主庫當前 binlog 位置
- 執行 SHOW MASTER STATUS; 記錄當前文件名和位置
-
配置從庫的 server-id 和連接信息
- 修改 my.cnf:
server-id=2 relay-log=mysql-relay-bin
- 啟動復制線程:
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE;
- 修改 my.cnf:
需要注意的是:server-id 每臺機器必須不同,否則復制會失??;另外,主從之間的網絡必須通順,防火墻也要開放相應端口。
主從復制在高可用中的應用
主從復制本身并不能直接提供高可用性,但它為高可用方案提供了基礎支持。比如:
- 故障切換(Failover):當主庫宕機時,可以快速將其中一個從庫提升為主庫,繼續對外服務。
- 讀寫分離:將讀請求分散到多個從庫上,減輕主庫壓力,提高整體性能。
- 備份恢復:從庫可以作為熱備使用,在主庫出現問題時迅速恢復數據。
但在實際部署中,還需要配合一些工具或機制來實現自動切換,例如使用 MHA(Master High Availability)、Orchestrator 或者云平臺提供的高可用組件。
此外,主從復制存在一定的延遲風險。如果業務對數據實時性要求很高,可能需要引入半同步復制(Semisynchronous Replication)或者 GTID 來減少數據丟失的可能性。
常見問題與排查建議
主從復制配置完成后,并不是一勞永逸的,日常維護中可能會遇到以下問題:
- 復制中斷:可以通過 SHOW SLAVE STATUSG 查看是否有錯誤信息,如 SQL 錯誤、連接超時等。
- 數據不一致:定期做數據校驗,比如使用 pt-table-checksum 工具檢查主從一致性。
- 延遲過大:優化從庫性能,比如增加索引、調整硬件資源,或者考慮拆分讀壓力。
遇到復制錯誤時,一般處理流程如下:
- 確認錯誤類型(SQL 報錯、IO 報錯)
- 如果是偶發性錯誤,嘗試跳過錯誤事務:
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;
- 如果數據已經出現偏差,可能需要重新初始化從庫
基本上就這些。主從復制雖然配置不算復雜,但涉及細節多,容易忽略的地方也不少。尤其是在生產環境中,不僅要配置好,還要持續監控和維護,才能真正發揮它的作用。