首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 高可用 MMM 架構部署全紀錄:雙主故障切換、VIP 漂移與運維實戰

     編輯:MySQL 綜合教學

前言:為什麼選 MMM?

**MMM (Master-Master Replication Manager for MySQL)** 是一套用 Perl 編寫的腳本工具,專為 **雙主復制** 環境設計,提供:

  • **自動故障切換**:主庫掛掉秒級提升備庫為新主,VIP 自動漂移。
  • **讀負載均衡**:多 Slave 間分發讀請求(Reader Role)。
  • **手動/自動模式**:支援運維介入與全自動運作。

⚠️ **核心限制**:同一時刻**只允許一個主寫入**(Writer Role 獨占),另一主作熱備;**不保證強一致性**,不適合金融核心業務,適合「高可用優於強一致」的互聯網業務。

架構拓撲:3 節點實驗環境

角色HostnameIPMySQL 角色MMM 角色
DB1data01192.168.52.129MasterMaster (Writer 候選)
DB2data02192.168.52.128MasterMaster (Writer 候選)
DB3oraclem1192.168.52.131SlaveSlave + Monitor Agent

**VIP 規劃**:Writer VIP 192.168.52.120,Reader VIP 池 192.168.52.129/128/131。

核心配置文件解析

1. mmm_common.conf —— 全局唯一真相源

active_master_role writer

<host default>
  cluster_interface eth0
  pid_path /var/run/mmm_agentd.pid
  bin_path /usr/lib/mysql-mmm/
  replication_user repl
  replication_password repl_1234
  agent_user mmm_agent
  agent_password mmm_agent_1234
</host>

<host db1>
  ip 192.168.52.129
  mode master
  peer db2
</host>

<host db2>
  ip 192.168.52.128
  mode master
  peer db1
</host>

<host db3>
  ip 192.168.52.131
  mode slave
</host>

<role writer>
  hosts db1, db2
  ips 192.168.52.120
  mode exclusive
</role>

<role reader>
  hosts db1, db2, db3
  ips 192.168.52.129, 192.168.52.128, 192.168.52.131
  mode balanced
</role>

關鍵點:mode exclusive 保證 Writer 單點寫入;peer 指定雙主對端;replication_user 需具備 REPLICATION SLAVE 權限。

2. mmm_agent.conf —— 各節點身份聲明

每台機器只需兩行:

include mmm_common.conf
this db1   # db2/db3 對應修改

3. mmm_mon.conf —— 監控端配置

include mmm_common.conf

<monitor>
  ip 127.0.0.1
  pid_path /var/run/mmm_mond.pid
  bin_path /usr/lib/mysql-mmm/
  status_path /var/lib/misc/mmm_mond.status
  ping_ips 192.168.52.129, 192.168.52.128, 192.168.52.131
</monitor>

<host default>
  monitor_user mmm_monitor
  monitor_password mmm_monitor_1234
</host>

debug 0

MySQL 權限準備(三節點同執行)

-- 復制賬號
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.52.%' IDENTIFIED BY 'repl_1234';
-- Monitor 賬號
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.52.%' IDENTIFIED BY 'mmm_monitor_1234';
-- Agent 賬號(需改 read_only、切換主從)
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.52.%' IDENTIFIED BY 'mmm_agent_1234';

雙主復制建立:手工搭建鏈路

  1. DB1 → DB2, DB3:在 DB1 執行 SHOW MASTER STATUS 獲取 File/Position,DB2/DB3 執行 CHANGE MASTER TO ... 指向 DB1。
  2. DB2 → DB1:同理,DB2 做 Master,DB1 做 Slave,形成雙主環。
  3. 驗證:SHOW SLAVE STATUS\G 確保 Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0。

服務啟動與上線

# 三節點啟動 Agent
/etc/init.d/mysql-mmm-agent start

# Monitor 節點啟動 Monitor
chkconfig --add /etc/rc.d/init.d/mysql-mmm-monitor
service mysql-mmm-monitor start

MMM 控制台操作

# 查看狀態
mmm_control show

# 節點上線
mmm_control set_online db1
mmm_control set_online db2
mmm_control set_online db3

# 健康檢查
mmm_control checks

# 查看日誌
tail -f /var/log/mysql-mmm/mmm_mond.log

故障切換實測:Writer VIP 秒級漂移

場景 1:DB1 掛掉,Writer 切至 DB2

  1. DB1 執行 service mysql stop。
  2. Monitor 日誌記錄:Check 'mysql' on 'db1' has failed for 10 seconds! → State changed to HARD_OFFLINE → Orphaned role 'writer' assigned to 'db2'。
  3. mmm_control show 顯示 DB2 承擔 Writer Role,VIP 192.168.52.120 已綁定 DB2 eth0。

場景 2:DB2 掛掉,Writer 切回 DB1

  1. 重啟 DB1 MySQL,mmm_control set_online db1。
  2. 停止 DB2 MySQL。
  3. 日誌顯示 Orphaned role 'writer' assigned to 'db1',VIP 漂移回 DB1。

切換核心邏輯

Agent 收到 set_active_master 後:

  1. 獲取 New Master 的 Master_Log_File/Read_Master_Log_Pos;若 Old Master 可連,再取其 SHOW MASTER STATUS 以 Old Master 為準。
  2. SELECT MASTER_POS_WAIT(...) 追趕同步位置。
  3. STOP SLAVE; CHANGE MASTER TO ...; START SLAVE; 重建復制鏈路。

運維避坑指南

  • Monitor 單點:生產環境建議雙 Monitor + Keepalived/VRRP 保證監控高可用。
  • 數據一致性風險:異步復制下切換可能丟數據;核心業務請用 MHA/Orchestrator/InnoDB Cluster。
  • auto_increment_increment/offset **必配**,避免雙主主鍵衝突。
  • 定期 mmm_control checks 巡檢,監控 rep_backlog 延遲指標。

總結

MMM 以輕量級腳本實現了 MySQL 雙主高可用的核心閉環:**健康檢查 → 故障判定 → 角色轉移 → VIP 漂移 → 復制重建**。雖不保證強一致,但在「可用性優先、數據最終一致可接受」的業務場景下,是極具性價比的選擇。

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