多節點並發寫入時,各自產生的 AUTO_INCREMENT 值極大概率重複,導致同步報錯 1062 或數據覆蓋。
MySQL 5.0+ 內置支持,通過步長和偏移量分配不重疊的 ID 空間:
auto_increment_increment = N:步長,允許最多 N 個節點auto_increment_offset = K:偏移量(1 ≤ K ≤ N),每個節點唯一K, K+N, K+2N, K+3N...[mysqld]
server-id = 10
log-bin = mysql-bin
log-slave-updates = 1
replicate-same-server-id = 0
auto_increment_increment = 10
auto_increment_offset = 1
master-host = 100.101.102.203
master-user = repl_user
master-password = repl_password
report-host = 100.101.102.201
[mysqld]
server-id = 20
log-bin = mysql-bin
log-slave-updates = 1
replicate-same-server-id = 0
auto_increment_increment = 10
auto_increment_offset = 2
master-host = 100.101.102.201
master-user = repl_user
master-password = repl_password
report-host = 100.101.102.202
[mysqld]
server-id = 30
log-bin = mysql-bin
log-slave-updates = 1
replicate-same-server-id = 0
auto_increment_increment = 10
auto_increment_offset = 3
master-host = 100.101.102.202
master-user = repl_user
master-password = repl_password
report-host = 100.101.102.203
| 參數 | 值 | 作用 | 注意 |
|---|---|---|---|
| server-id | 10/20/30 | 節點唯一標識 | 全局唯一,非 0 |
| log-bin | mysql-bin | 開啟二進制日志 | 復制前提 |
| log-slave-updates | 1 | 將同步來的數據寫入本地 Binlog | 鏈式/循環復制必開 |
| replicate-same-server-id | 0 | 忽略自身 server_id 產生的事件 | 防循環復制,必設 0 |
| auto_increment_increment | 10 | 自增步長 | 支持最多 10 個節點 |
| auto_increment_offset | 1/2/3 | 自增起始偏移 | 每節點唯一,1~increment |
| master-host/user/password | 上游節點信息 | 指定同步源 | 循環指向前一節點 |
| report-host | 本節點 IP | 向主庫註冊自身 IP | 解決主庫無法識別從庫 IP 問題 |
replicate-do-db = db_name1
replicate-do-db = db_name2
replicate-do-db = db_name3
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
注意:replicate-do-db 基於「當前默認庫」判斷,跨庫操作(如 USE db1; INSERT INTO db2.t...)可能不生效,建議結合 replicate-wild-do-table 精確控制。
read_only=1,避免並發衝突read_only=0)pt-table-checksum / pt-table-sync 校驗修復Seconds_Behind_Master、Slave_IO/SQL_Running、Binlog 位點差異❌ 不要在循環復制中雙向寫入:極易引發衝突、死鎖、數據分叉
❌ 不要混用 Statement/Row 混合 Binlog 格式:統一設置binlog_format=ROW
❌ 不要忽略 replicate-same-server-id=0:否則事件在環中無限循環
✅ 新增節點:選擇未用的 offset,修改所有節點 increment ≥ 新節點數,滾動重啟生效
MySQL 循環復制通過 auto_increment_increment/offset 分配 ID 空間、log-slave-updates 傳遞 Binlog、replicate-same-server-id=0 打破環路 實現多主同步。
核心原則:架構上單主寫、參數上防衝突、運維上強校驗。生產環境建議優先考慮 MGR (MySQL Group Replication) 或 Galera Cluster,原生循環復制僅適用于簡單異地同步場景。