MHA (Master High Availability) 是成熟的 MySQL 主從自動故障切換方案,0-30 秒完成切換,最大程度保證數據一致性。本文記錄基于 CentOS 6、MySQL 5.6、三節點(1主2從)的完整部署實錄。
| 角色 | 主機名 | IP | Server_ID | 說明 |
|---|---|---|---|---|
| Master | yaolansvr | 192.168.0.3 | 16803 | 寫入節點 |
| Candidate Master / Manager | yaolansvr_slave | 192.168.0.4 | 16804 | 備選主 + MHA Manager |
| Slave | yaolansvr_slave01 | 192.168.0.5 | 16805 | 只讀從庫 |
VIP:192.168.0.10/24(eth0:1),由 master_ip_failover 腳本管理。
setenforce 0、iptables -Fyum -y install perl-DBD-MySQL perl-CPAN perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes[mysqld] server-id=16803 log-bin=/data/mysql/data/mysql-bin.log binlog_format=mixed gtid_mode=ON enforce_gtid_consistency=ON relay_log_purge=0 read_only=0 # Slave 運行時 set global read_only=1 skip-name-resolve innodb_flush_log_at_trx_commit=2 # 半同步建議 1,性能妥協 2 sync_binlog=1
mysqldump -A --flush-privileges --lock-all-tables --events --routines --triggers --master-data=2 > /backup/full_$(date +%F).sql
CHANGE MASTER TO ...,START SLAVE。User repl1 does not exist or does not have REPLICATION SLAVE privilege!。SET GLOBAL read_only=1;(不寫入 my.cnf,便於切主後開寫)。auto.cnf UUID 衝突:備份恢復後 rm -f /data/mysql/data/auto.cnf 重啟 MySQL 重新生成 UUID。# 需 EPEL 源解決 perl-Log-Dispatch 依賴 rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum -y install perl-Log-Dispatch perl-Parallel-ForkManager tar xvf mha4mysql-manager-0.54.tar.gz cd mha4mysql-manager-0.54 perl Makefile.PL && make && make install # 安裝路徑:/usr/local/bin/masterha_manager, masterha_check_ssh, masterha_check_repl, masterha_master_switch...
/etc/mha/app1/app1.cnf
#!/usr/bin/perl
my $vip = '192.168.0.10/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
my ($command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port,
$new_master_host, $new_master_ip, $new_master_port) = @ARGV;
if ($command eq "stop") {
system("$ssh_stop_vip");
} elsif ($command eq "start") {
system("$ssh_start_vip");
} elsif ($command eq "status") {
# 檢查 VIP 狀態
}
exit 0;
chmod +x /etc/mha/app1/master_ip_failover,並在配置文件取消註釋 master_ip_failover_script。
# Master 節點 kill -9 $(pidof mysqld) # 觀察 Manager 日志 /var/log/manager.log # 關鍵階段: # 1. 偵測 Master 掛掉 (PING 失敗 + SSH 可達 + Secondary Check 確認) # 2. Phase 1: Configuration Check # 3. Phase 2: Dead Master Shutdown (執行 stop VIP 腳本) # 4. Phase 3: Master Recovery # - 選擇 Candidate Master (192.168.0.4) # - save_binary_logs 保存 Master Binlog # - apply_diff_relay_logs 衝突 Relay Log # - 執行 start VIP 腳本 # - SET GLOBAL read_only=0 ON NEW MASTER # 5. Phase 4: Slaves Recovery (192.168.0.5 重新 CHANGE MASTER TO 新主) # 6. Phase 5: New Master Cleanup (RESET SLAVE) # 完成:Master failover to 192.168.0.4 completed successfully.
CHANGE MASTER TO MASTER_HOST='192.168.0.4', MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=120 ...。CHANGE MASTER TO ...,START SLAVE。SET GLOBAL read_only=1;,SET GLOBAL relay_log_purge=0;。masterha_check_repl 驗證拓撲,重啟 Manager 監控。masterha_manager 連續兩次切換間隔 < 8 小時會報錯 Current time is too early to do failover again → 手動 rm /etc/mha/app1/app1.failover.complete(但應排查為何頻繁切換)。relay_log_purge=0 未設置 → Relay Log 被自動清理導致無法恢復。rpl_semi_sync_master=ON + rpl_semi_sync_slave=ON 最大程度保證零數據丟失。MHA 部署看似繁瑣,實則每一步都是為了「數據不丟、服務不停」的工程承諾。