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

MySQL 雙向/循環復制架構設計:auto_increment_offset 解決主鍵衝突的完整配置指南

     編輯:MySQL 資料庫相關知識

架構場景

  • 雙向復制:A ↔ B,雙主雙從,任意端寫入同步到另一端
  • 循環復制:A → B → C → A,多節點環形,任意節點寫入全網同步
  • 典型應用:異地多活部署、Zen Cart 多站點數據同步、跨數據中心高可用

核心挑戰:自增主鍵衝突

多節點並發寫入時,各自產生的 AUTO_INCREMENT 值極大概率重複,導致同步報錯 1062 或數據覆蓋。

解決方案:auto_increment_increment + auto_increment_offset

MySQL 5.0+ 內置支持,通過步長和偏移量分配不重疊的 ID 空間:

  • auto_increment_increment = N:步長,允許最多 N 個節點
  • auto_increment_offset = K:偏移量(1 ≤ K ≤ N),每個節點唯一
  • 生成序列:K, K+N, K+2N, K+3N...

三節點循環復制完整配置

節點 A(美國,100.101.102.201)

[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

節點 B(中國,100.101.102.202)

[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

節點 C(本地,100.101.102.203)

[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-id10/20/30節點唯一標識全局唯一,非 0
log-binmysql-bin開啟二進制日志復制前提
log-slave-updates1將同步來的數據寫入本地 Binlog鏈式/循環復制必開
replicate-same-server-id0忽略自身 server_id 產生的事件防循環復制,必設 0
auto_increment_increment10自增步長支持最多 10 個節點
auto_increment_offset1/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 精確控制。

故障切換與運維建議

  1. 寫入分離:應用層路由寫入到單一「主寫節點」,其他節點 read_only=1,避免並發衝突
  2. 故障切換:主寫節點掛掉 → 提升某從節點為新主寫(修改應用路由 + 設置 read_only=0)
  3. 數據一致性校驗:定期使用 pt-table-checksum / pt-table-sync 校驗修復
  4. 監控指標: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,原生循環復制僅適用于簡單異地同步場景。

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