| 角色 | IP | 說明 |
|---|---|---|
| Manager | 10.10.54.154 | MHA 管理節點,不存數據 |
| Master | 10.10.54.156 | 當前主庫 |
| Slave1 (Candidate) | 10.10.54.155 | 備選主庫,優先級最高 |
| Slave2 | 10.10.54.157 | 普通從庫,不參選主 |
mha4mysql-node:所有 MySQL 節點安裝,提供 SSH 命令執行、Binlog 解析、日志應用mha4mysql-manager:Manager 節點安裝,監控 Master 健康、協調故障切換# 在每個節點
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa
# 分發公鑰到所有節點(含自己)
ssh-copy-id root@10.10.54.154
ssh-copy-id root@10.10.54.155
ssh-copy-id root@10.10.54.156
ssh-copy-id root@10.10.54.157
# 所有節點安裝 node
yum -y install perl-DBD-MySQL ncftp
rpm -ivh mha4mysql-node-0.53-0.noarch.rpm
# Manager 額外安裝 manager
yum -y install perl cpan
# 解決 Perl 依賴(EPEL/CentOS 源)
rpm -ivh perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes ...
rpm -ivh mha4mysql-manager-0.53-0.el6.noarch.rpm
# Master 156
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=mixed
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.10.54.%' IDENTIFIED BY 'rep123';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- 記錄 File, Position
# Slave 155/157
CHANGE MASTER TO
MASTER_HOST='10.10.54.156', MASTER_PORT=3306,
MASTER_USER='repl', MASTER_PASSWORD='rep123',
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=112;
START SLAVE;
SHOW SLAVE STATUS\G
# Slave1 也授權 repl,因其可能升主
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.10.54.%' IDENTIFIED BY 'rep123';
/etc/masterha/app1.cnf[server default]
user=mha_rep
password=123456
manager_workdir=/masterha/app1
manager_log=/masterha/app1/manager.log
remote_workdir=/masterha/app1
ssh_user=root
repl_user=rep
repl_password=rep123
ping_interval=1
[server1]
hostname=10.10.54.155
master_binlog_dir=/data/ndb
candidate_master=1
[server2]
hostname=10.10.54.156
master_binlog_dir=/data/ndb
candidate_master=1
[server3]
hostname=10.10.54.157
master_binlog_dir=/data/ndb
no_master=1
# SSH 驗證
masterha_check_ssh --conf=/etc/masterha/app1.cnf
# 複製驗證
masterha_check_repl --conf=/etc/masterha/app1.cnf
# 後台啟動 Manager
nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &
tail -f /masterha/app1/manager.log
遇到 Perl 模塊 ManagerConst.pm 第 90 行 chomp $msg 報 uninitialized value,臨時修補:
$msg = "" unless($msg); # 插在 chomp 前
切換成功日誌關鍵字:
Failover Report
app1: MySQL Master failover 10.10.54.156 to 10.10.54.155 succeeded
Selected 10.10.54.155 as a new master.
10.10.54.155: OK: Applying all logs succeeded.
10.10.54.157: OK: Applying all logs succeeded. Slave started, replicating from 10.10.54.155.
Master failover to 10.10.54.155 completed successfully.
報錯:Last failover was done at ... Current time is too early to do failover again
原因:/masterha/app1/app1.failover.complete 存在,防止頻繁切換腦裂。
rm /masterha/app1/app1.failover.complete
# 重啟 manager 後再次切換成功,156 重新成為 Master
# 舊主 156 執行
RESET MASTER;
CHANGE MASTER TO MASTER_HOST='10.10.54.155', MASTER_PORT=3306,
MASTER_USER='rep', MASTER_PASSWORD='rep123',
MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=112;
START SLAVE;
# Manager 節點發起手動切換
masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.cnf
binlog_format=ROW 或 MIXED,避免 Statement 格式導致備庫數據不一致GTID 模式:MySQL 5.6+ 建議啟用 gtid_mode=ON,MHA 5.7+ 版本原生支持,簡化 Binlog 定位failover、error 觸發 PagerDutyMHA 雖非強一致(異步複製可能丟失極少量事務),但秒級自動故障切換、Binlog 补全補償、輕量無外部依賴 使其成為中小規模 MySQL 高可用首選。大規模/強一致場景請評估 MGR (InnoDB Cluster) 或 Orchestrator + ProxySQL。