MHA (Master High Availability Manager and Tools for MySQL) 由日本 MySQL 專家用 Perl 編寫,專為傳統一主多從異步/半同步複制環境設計,提供:
| IP | MHA 角色 | MySQL 角色 |
|---|---|---|
| 192.168.52.129 | Node | Master |
| 192.168.52.130 | Node | Slave |
| 192.168.52.131 | Manager + Node | Slave |
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa。cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys。authorized_keys,再 scp 分發給 129、130。ssh hostname 免密登錄成功。/etc/hosts 映射主機名:192.168.52.129 data01 等。
-- 所有節點執行
GRANT SUPER,RELOAD,REPLICATION CLIENT,SELECT ON *.* TO 'manager'@'192.168.52.%' IDENTIFIED BY 'manager_1234';
GRANT CREATE,INSERT,UPDATE,DELETE,DROP ON *.* TO 'manager'@'192.168.52.%';
GRANT RELOAD, SUPER, REPLICATION SLAVE ON *.* TO 'repl'@'192.168.52.%' IDENTIFIED BY 'repl_1234';
yum -y install perl-DBD-MySQL
tar -zxvf mha4mysql-node-0.56.tar.gz
cd mha4mysql-node-0.56
perl Makefile.PL && make && make install
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles
# 缺包可用 rpm 或 cpan 安裝
tar -zxvf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.PL && make && make install
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
ssh_user=root
repl_user=repl
repl_password=repl_1234
ping_interval=1
[server1]
hostname=192.168.52.129
candidate_master=1
master_binlog_dir=/home/data/mysql/binlog/
[server2]
hostname=192.168.52.130
master_binlog_dir=/home/data/mysql/binlog/
[server3]
hostname=192.168.52.131
master_binlog_dir=/home/data/mysql/binlog/
masterha_check_ssh --conf=/etc/masterha/app1.cnf
masterha_check_repl --conf=/etc/masterha/app1.cnf
均顯示 All SSH connection tests passed successfully. 和 MySQL Replication Health is OK. 方可啟動。
nohup masterha_manager --conf=/etc/masterha/app1.cnf < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
查狀態:masterha_check_status --conf=/etc/masterha/app1.cnf
在 Master (129) 執行 echo c > /proc/sysrq-trigger 觸發內核崩潰。Manager 檢測到後自動完成:保存 Binlog → 選最新 Slave (130) → 應用差異 Relay Log → 提升為新 Master → 其它 Slave 重新指向。全程無人工干預。
# 1. 停止 Manager
masterha_stop --conf=/etc/masterha/app1.cnf
# 2. 標記舊 Master 為 dead(若真掛掉可省略)
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=dead --dead_master_host=192.168.52.129
# 3. 提升新 Master
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.52.130
過程中會提示確認 FLUSH NO_WRITE_TO_BINLOG TABLES、鎖表、切換 Binlog 位點、解鎖,最後顯示 Switching master to ... completed successfully.
手動切換後需生成新配置 app2.cnf(將 server1/server2 IP 互換),後續 masterha_check_repl 使用新配置。
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| Getting relay log directory failed | 從庫未配置 relay-log | my.cnf 添加 relay-log=/path/mysql-relay-bin,重啟並 RESET SLAVE/CHANGE MASTER |
| Multi-master config but two writable masters | 雙主雙寫或未設置 read_only | 從庫 SET GLOBAL read_only=1; |
| Can't exec "mysqlbinlog" | PATH 缺少 mysqlbinlog | ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/ |
| sh: mysql: command not found | PATH 缺少 mysql | ln -s /usr/local/mysql/bin/mysql /usr/bin/ |
| CREATE command denied to user 'manager' | manager 缺 CREATE 權限 | GRANT CREATE,INSERT,UPDATE,DELETE,DROP ON *.* TO 'manager'@'%'; |