MHA (Master High Availability) 是 Perl 編寫的 MySQL 主從故障自動切換方案,10-30 秒完成故障轉移,修復 Slave 差異 Relay Log,保證數據一致性,無侵入式部署,支持在線切主。本文記錄三節點環境完整部署流程。
ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.216.50 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.216.51 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.216.52 # 驗證 ssh 192.168.216.50 date
groupadd mysql; useradd -g mysql -s /bin/nologin -M mysql mkdir -p /data/mysql tar -zxvf mysql-5.6.16-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.16-linux-glibc2.5-x86_64 /usr/local/mysql cd /usr/local/mysql/scripts ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
編寫 /usr/local/mysql/my.cnf(含 InnoDB 參數、Binlog、慢查詢、錯誤日志、server-id 不同)。
GRANT ALL PRIVILEGES ON *.* TO root@'127.0.0.1' IDENTIFIED BY 'root'; GRANT ALL PRIVILEGES ON *.* TO root@'localhost' IDENTIFIED BY 'root'; GRANT ALL PRIVILEGES ON *.* TO root@'192.168.216.50' IDENTIFIED BY 'root'; GRANT REPLICATION SLAVE ON *.* TO slave@'192.168.216.50' IDENTIFIED BY 'slave'; GRANT REPLICATION SLAVE ON *.* TO slave@'192.168.216.51' IDENTIFIED BY 'slave'; GRANT REPLICATION SLAVE ON *.* TO slave@'192.168.216.52' IDENTIFIED BY 'slave';
Manager 節點 安裝完整依賴(含 perl-Log-Dispatch、perl-MIME-Lite、perl-Parallel-ForkManager 等 15+ 包),rpm -ivh 逐個安裝。
Node 節點 僅需 perl-DBD-MySQL、ncftp。若 RPM 衝突,DBD-mysql 源碼編譯:perl Makefile.PL && make && make install。
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql-x86_64.conf ldconfig
# Node tar -zxvf mha4mysql-node-0.54.tar.gz cd mha4mysql-node-0.54; perl Makefile.PL; make && make install # Manager tar -zxvf mha4mysql-manager-0.54.tar.gz cd mha4mysql-manager-0.54; perl Makefile.PL; make && make install mkdir -p /etc/masterha /masterha/app1 cp samples/conf/* /etc/masterha cp samples/scripts/* /usr/local/bin
/etc/masterha/app1.cnf[server default] manager_workdir=/masterha/app1 manager_log=/masterha/app1/manager.log user=root; password=root; ssh_user=root repl_user=slave; repl_password=slave shutdown_script="" master_ip_failover_script="/usr/local/bin/masterha_ip_failover" master_ip_online_change_script="/usr/local/bin/masterha_ip_failover" report_script="" [server1] hostname=192.168.216.50 master_binlog_dir="/data/mysql/" candidate_master=1 [server2] hostname=192.168.216.51 master_binlog_dir="/data/mysql/" candidate_master=1 [server3] hostname=192.168.216.52 master_binlog_dir="/data/mysql/" candidate_master=1
masterha_check_ssh --conf=/etc/masterha/app1.cnf masterha_check_repl --conf=/etc/masterha/app1.cnf masterha_manager --conf=/etc/masterha/app1.cnf
/usr/local/bin/masterha_ip_failoverPerl 腳本接收 command=start|stop|status、新舊 Master IP,調用 ifconfig eth0:1 192.168.216.100/24 掛載/卸載 VIP。
測試:masterha_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.216.51 ...,手動 start 掛載 VIP,故障時自動漂移。
關閉 Master MySQL,觀察 Manager 日志:檢測故障 → 選舉新 Master(優先 candidate_master=1) → 應用差異 Relay Log → 掛載 VIP → 其餘 Slave 指向新 Master。總停機時間 10-30 秒。