MySQL主從復制實現指南
一、主從復制原理
主從復制工作流程:
- 主庫將數據變更寫入二進制日志
- 從庫的IO線程連接主庫請求日志數據
- 主庫的Binlog Dump線程發送日志到從庫
- 從庫IO線程將日志寫入中繼日志
- 從庫SQL線程讀取中繼日志并重放SQL
二、環境準備
服務器配置要求
角色 | IP地址 | MySQL版本 | 系統要求 |
---|---|---|---|
主庫 | 192.168.1.100 | 8.0+ | 4核8G |
從庫 | 192.168.1.101 | 8.0+ | 4核8G |
網絡要求
- 主從服務器網絡互通
- 開放3306端口通信
- 服務器時間同步(使用NTP)
三、主庫配置步驟
1. 修改MySQL配置文件
# /etc/my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = mydb # 需要復制的數據庫
expire_logs_days = 7
max_binlog_size = 100M
2. 重啟MySQL服務
systemctl restart mysqld
3. 創建復制用戶
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
FLUSH PRIVILEGES;
4. 查看主庫狀態
SHOW MASTER STATUS;
記錄輸出結果:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 785 | mydb | | |
+------------------+----------+--------------+------------------+-------------------+
四、從庫配置步驟
1. 修改MySQL配置文件
# /etc/my.cnf
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read-only = ON
replicate-do-db = mydb # 需要復制的數據庫
2. 重啟MySQL服務
systemctl restart mysqld
3. 配置復制鏈路
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=785;
4. 啟動復制進程
START SLAVE;
5. 檢查復制狀態
SHOW SLAVE STATUS\G
關鍵指標檢查:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
五、主從復制模式對比
復制模式 | 特點 | 適用場景 |
---|---|---|
異步復制 | 主庫提交事務后立即返回,不保證從庫接收 | 對性能要求高的場景 |
半同步復制 | 主庫提交事務時至少一個從庫確認收到日志 | 數據一致性要求高的場景 |
全同步復制 | 主庫提交事務時所有從庫確認執行完畢 | 金融級高一致性場景 |
GTID復制 | 使用全局事務ID,自動定位復制位置,簡化故障轉移 | 高可用集群環境 |
六、半同步復制配置
1. 主庫安裝插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000; # 1秒超時
2. 從庫安裝插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
3. 重啟從庫IO線程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
七、常見問題排查
1. 復制中斷處理
-- 查看錯誤原因
SHOW SLAVE STATUS\G-- 跳過單個錯誤
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;-- 重新配置復制
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO ...; -- 重新配置
START SLAVE;
2. 主從數據一致性校驗
# 使用pt-table-checksum工具
pt-table-checksum \
--host=192.168.1.100 \
--user=root --password=YourPassword \
--databases=mydb \
--replicate=test.checksums
3. 延遲問題優化
- 檢查網絡延遲:
ping 192.168.1.100
- 增加從庫并行復制線程:
STOP SLAVE; SET GLOBAL slave_parallel_workers = 4; START SLAVE;
- 優化慢查詢
八、主從切換步驟
1. 提升從庫為主庫
STOP SLAVE;
RESET SLAVE ALL;
SET GLOBAL read_only = OFF;
2. 原主庫切換為從庫
RESET MASTER;
CHANGE MASTER TO MASTER_HOST='192.168.1.101', ...;
START SLAVE;
九、監控與維護
關鍵監控指標
常用維護命令
-- 主庫操作
SHOW MASTER STATUS;
SHOW BINARY LOGS;
PURGE BINARY LOGS BEFORE '2023-06-01 00:00:00';-- 從庫操作
SHOW SLAVE STATUS;
STOP SLAVE;
START SLAVE;
SHOW RELAYLOG EVENTS;
十、最佳實踐建議
- 一致性要求高的場景:使用半同步復制+GTID
- 讀寫分離架構:應用層區分讀寫操作
- 定期校驗:每周進行主從數據一致性檢查
- 監控告警:設置復制延遲和狀態告警
- 備份策略:主庫物理備份,從庫邏輯備份
- 版本管理:保持主從MySQL版本一致
- 故障演練:每季度進行主從切換演練
注意:生產環境建議至少配置兩個從庫,避免單點故障
通過以上配置和管理,我們可以構建穩定可靠的MySQL主從復制架構,實現數據的實時同步和高可用性。