MMM (Master-Master replication manager for MySQL) 是基於 Perl 的輕量級高可用方案,通過監控端 + 代理端架構,實現雙主同步下的單寫入 VIP 漂移、多從庫讀取 VIP 負載均衡、自動故障偵測與切換。本文記錄完整部署流程、配置細節、常見坑點與生產級優化。
| 組件 | 進程 | 部署節點 | 職責 |
|---|---|---|---|
| 監控端 | mmm_mond | 專用管理節點 | 決策大腦:健康檢查、角色裁決、VIP 管理、故障切換編排 |
| 代理端 | mmm_agentd | 每個 MySQL 節點 | 執行器:探針採集、執行遠端指令(設 read_only、切換 VIP、備份鎖定) |
| 控制工具 | mmm_control | 管理節點 | CLI:查看集群狀態、手動切換、上下線節點 |
MMM 基於 Active-Passive 主主同步:同一時間僅一個節點 read_only=0 (Writer),另一個 read_only=1 (Standby)。
[mysqld]
server-id = 1 (Node1), 2 (Node2) # 唯一
log-bin = mysql-bin
binlog-format = ROW
log-slave-updates = 1
gtid-mode = ON
enforce-gtid-consistency = ON
sync_binlog = 1
auto_increment_increment = 2
auto_increment_offset = 1 (Node1), 2 (Node2) # 奇偶分離
replicate-do-db = business_db
replicate-ignore-db = mysql,information_schema,performance_schema
# Node1 → Node2
CHANGE MASTER TO MASTER_HOST='192.168.1.26', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;
START SLAVE;
# Node2 → Node1
CHANGE MASTER TO MASTER_HOST='192.168.1.25', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;
START SLAVE;
# 驗證
SHOW SLAVE STATUS\G # 兩邊 IO/SQL Running=Yes
| 角色 | 主機名 | IP | VIP 分配 |
|---|---|---|---|
| Monitor | monitor | 192.168.1.29 | 無 |
| Master1 (Writer) | db1 | 192.168.1.25 | Writer VIP: 192.168.1.31 |
| Master2 (Standby) | db2 | 192.168.1.26 | Writer VIP 備用 |
| Slave1 | db3 | 192.168.1.27 | Reader VIP: 192.168.1.32 |
| Slave2 | db4 | 192.168.1.28 | Reader VIP: 192.168.1.33 |
-- 複制帳號
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.%' IDENTIFIED BY 'replication';
-- MMM 監控帳號
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY 'monitor_pass';
-- MMM 代理帳號(需 SUPER 執行 SET GLOBAL read_only 等)
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%' IDENTIFIED BY 'agent_pass';
-- 可選:備份工具帳號
GRANT SELECT, LOCK TABLES, RELOAD ON *.* TO 'mmm_tools'@'192.168.1.%' IDENTIFIED BY 'tools_pass';
active_master_role writer
cluster_interface eth0
pid_path /var/run/mysql-mmm/mmm_agentd.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication
replication_password replication
agent_user mmm_agent
agent_password agent
ip 192.168.1.25
mode master
peer db2
ip 192.168.1.26
mode master
peer db1
ip 192.168.1.27
mode slave
ip 192.168.1.28
mode slave
hosts db1, db2
ips 192.168.1.31
mode exclusive # 同一時間僅一個 host 持有
hosts db3, db4
ips 192.168.1.32, 192.168.1.33
mode balanced # 輪詢/負載均衡分發
include mmm_common.conf
this db1 # db2 改為 this db2,db3 改為 this db3...
include mmm_common.conf
ip 127.0.0.1
pid_path /var/run/mysql-mmm/mmm_mond.pid
bin_path /usr/libexec/mysql-mmm/
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.1.25,192.168.1.26,192.168.1.27,192.168.1.28
auto_set_online 10 # 故障恢復 10 秒後自動上線
monitor_user mmm_monitor
monitor_password monitor
debug 0
# CentOS 7+ 安裝 EPEL 並安裝 MMM
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y mysql-mmm-monitor # Monitor 節點
yum install -y mysql-mmm-agent # 所有 DB 節點
# 啟動代理端 (所有 DB 節點)
systemctl enable mysql-mmm-agent
systemctl start mysql-mmm-agent
# 啟動監控端 (Monitor 節點)
systemctl enable mysql-mmm-monitor
systemctl start mysql-mmm-monitor
# 查看集群狀態
mmm_control show
| 命令 | 作用 |
|---|---|
mmm_control show | 顯示集群狀態:角色、VIP、狀態、延遲 |
mmm_control set_online db1 | 手動上線節點 |
mmm_control set_offline db1 | 手動下線節點(維護時) |
mmm_control move_role writer db2 | 手動將 Writer 角色移交 db2 |
mmm_control checks | 顯示健康檢查詳情 |
| 故障現象 | 原因 | 解決 |
|---|---|---|
| Slave_IO_Running=No, Error 1236 | Master binlog 已清理,Slave 找不到位點 | 重新同步:Master 重新備份 → Slave 重建 |
| Slave_SQL_Running=No, Can't create database | Slave 已存在同名庫,replicate-do-db 衝突 | Slave 先刪除該庫,或調整 replicate-ignore-db |
| 授權失敗 Access denied | 密碼錯誤、主機不匹配、權限不足 | 檢查 mmm_agent/mmm_monitor 授權,確保 @'192.168.1.%' |
| VIP 未漂移 | mmm_mond 未運行、網絡不通、健康檢查失敗 | systemctl status mysql-mmm-mond、ping_ips 連通性、check_mysql.sh 腳本 |
| 雙主同時寫入 (Split-brain) | 監控端單點故障、網絡分區 | 引入 Keepalived 雙機熱備監控端、或升級 Pacemaker/Corosync |
痛點:mmm_mond 掛掉 → 整個集群失去決策大腦,VIP 固化、故障不切換。
改進方案:
mmm_control show 輸出,異常觸發告警 + 自動化腳本介入。check_mysql.sh 增加同步延遲檢查(Seconds_Behind_Master < 30)、磁碟空間檢查、InnoDB 狀態檢查。notify_master.sh 發送鉤子至 CMDB、DNS、應用配置中心,實現零感知切換。mmm_backup 工具配合 mmm_tools 帳號,從 Standby/Slave 進行邏輯/物理備份,不影響 Writer。mysql-mmm-2.2.1),避免 yum update 導致配置不兼容。MMM 作為早期 MySQL 高可用方案的代表,以「輕量、易懂、基於標準復制」贏得大量中小型系統青睞。但在雲原生、容器化、自動化運維的今天,其 Perl 單線程監控、單點決策、缺乏共識協議等短板日益凸顯。理解 MMM 架構原理,有助於理解現代高可用方案(Orchestrator、MHA、InnoDB Cluster、ProxySQL)的演進邏輯與設計權衡。