首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MHA (Master High Availability) 架構部署與故障切換實戰:四節點集群、SSH 互信、複製驗證、腦裂防護全流程

     編輯:MySQL 綜合教學

架構拓撲

角色IP說明
Manager10.10.54.154MHA 管理節點,不存數據
Master10.10.54.156當前主庫
Slave1 (Candidate)10.10.54.155備選主庫,優先級最高
Slave210.10.54.157普通從庫,不參選主

核心組件

  • mha4mysql-node:所有 MySQL 節點安裝,提供 SSH 命令執行、Binlog 解析、日志應用
  • mha4mysql-manager:Manager 節點安裝,監控 Master 健康、協調故障切換

部署關鍵步驟

1. SSH 互信(四節點全互聯)

# 在每個節點
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

2. 安裝軟件包

# 所有節點安裝 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

3. 建立主從複製

# 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';

4. MHA 配置文件 /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

5. 驗證與啟動

# 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

故障切換實戰記錄

第一次切換(Master 156 掛掉 → Slave1 155 升主)

遇到 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.

第二次切換(新 Master 155 掛掉 → 156 回主)

報錯: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 定位
  • 監控告警:Manager 日誌接入 ELK/Promtail,關鍵字 failover、error 觸發 PagerDuty
  • 網絡分區:Manager 與 MySQL 節點部署在同一 VPC/可用區,避免跨區網絡抖動誤判
  • 定期演練:月度故障注入測試,驗證 RTO < 30s

MHA 雖非強一致(異步複製可能丟失極少量事務),但秒級自動故障切換、Binlog 补全補償、輕量無外部依賴 使其成為中小規模 MySQL 高可用首選。大規模/強一致場景請評估 MGR (InnoDB Cluster) 或 Orchestrator + ProxySQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved