Master (192.168.1.100) ──Binlog──► Slave1 (192.168.1.101)
Slave2 (192.168.1.102)
...
/etc/my.cnf[mysqld]
server-id = 1 # 唯一,1-2^32-1
log-bin = mysql-bin # 啟用二進制日誌
binlog-format = ROW # 推薦 ROW 格式,數據一致性最好
binlog-do-db = business_db # 只同步業務庫(可選)
binlog-ignore-db = mysql,information_schema,performance_schema,sys
expire_logs_days = 7 # 自動清理舊 binlog
max_binlog_size = 100M
sync_binlog = 1 # 每次提交刷盤,最安全
innodb_flush_log_at_trx_commit = 1
重啟:systemctl restart mysqld
CREATE USER 'repl_user'@'192.168.1.%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK; -- 短暫鎖表
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 154 | business_db | ... |
+------------------+----------+--------------+------------------+
UNLOCK TABLES;
記下 File 和 Position。
/etc/my.cnf[mysqld]
server-id = 2 # 唯一,不同於 Master
relay-log = mysql-relay-bin
log-slave-updates = 1 # 從庫也寫 binlog,支援鏈式複寫
read-only = 1 # 防止誤寫入
replicate-do-db = business_db # 只同步業務庫
replicate-ignore-db = mysql,information_schema,performance_schema,sys
重啟 Slave。
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl_user',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
關鍵指標:
Slave_IO_Running: Yes — IO 執行緒連接 Master 正常Slave_SQL_Running: Yes — SQL 執行緒重放正常Seconds_Behind_Master: 0 — 無延遲# Master 熱備份(不鎖表)
mysqldump --single-transaction --master-data=2 --default-character-set=utf8mb4 \
-uroot -p business_db > /backup/business_db.sql
# 複製到 Slave 導入
mysql -uroot -p business_db < /backup/business_db.sql
# --master-data=2 會在檔案註解中記錄 binlog 位置,導入後自動定位
# 秒數超過 30 秒告警
Seconds_Behind_Master > 30
原因:大事務、DDL、從庫硬體較弱、長查詢阻塞 SQL 執行緒。
問題:Master 寫入 → 返回成功 → Slave 尚未同步 → 讀請求打到 Slave 讀不到新資料。
解決:
rpl_semi_sync_master=ON 降低延遲風險# Master 1
auto_increment_offset = 1
auto_increment_increment = 2
# Master 2
auto_increment_offset = 2
auto_increment_increment = 2
pt-online-schema-change)SET GLOBAL sql_slave_skip_counter = 1;(慎用)[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
log-slave-updates = 1
# 啟動複寫簡化為
CHANGE MASTER TO MASTER_HOST='...', MASTER_USER='...', MASTER_PASSWORD='...', MASTER_AUTO_POSITION=1;
優點:自動定位、故障切換簡單、支援多源複寫。
pt-table-checksum