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

MHA 故障切換與在線切換核心流程代碼級解析:Phase 1-5 完整調用鏈路

     編輯:Java 綜合教學

MHA 故障切換與在線切換核心流程代碼級解析

基於 MySQL 5.5(非 GTID)環境,深度剖析 MHA Manager 兩大核心流程:masterha_master_failover(故障切換)與 masterha_master_switch(在線切換)的完整階段劃分與關鍵調用鏈路。

一、故障切換流程

Phase 1: Configuration Check

  • check_settings:版本檢查、全節點連通性、死活雙重確認
  • start_sql_threads_if:確保所有 Slave SQL 線程運行

Phase 2: Dead Master Shutdown

  • stop_io_thread:所有 Slave 停止 IO 線程(含已掛掉的 Master)
  • master_ip_failover_script:VIP 漂移
  • shutdown_script:自定義關機腳本

Phase 3: Master Recovery(核心)

  1. 3.1 Getting Latest Slaves:read_slave_status 獲取 Master_Log_File/Read_Master_Log_Pos,identify_latest_slaves 比較 Binlog 位置找最新/最舊 Slave
  2. 3.2 Saving Dead Master's Binlog:
      • SSH 可達:save_binary_logs --command=save 拷貝未同步 Binlog 到 Manager
      • SSH 不可達:Master 未同步事務丟失
      • generate_diff_binary_log / concat_all_binlogs_from / dump_binlog 生成差分
  3. 3.3 Determining New Master:
      • 優先 candidate_master=1 且位置最新的節點
      • 排除:死節點、no_master、log_bin=OFF、版本不最舊、延遲 > 1億位置
      • 降級策略:候選→所有最新→所有 Slave
  4. 3.4 New Master Diff Log Generation:
      • 新 Master ≠ Latest Slave:apply_diff_relay_logs --command=find 生成 Relay 差分
      • 發送 Dead Master Binlog 差分到新 Master
  5. 3.5 Master Log Apply:
      • wait_until_relay_log_applied 等待 Relay 執行完
      • 三段式恢復:exec_diff (Exec/Read 差異) + read_diff (Relay 差異) + binlog_diff (Master 差異)
      • 實際調用 mysqlbinlog 重放
      • VIP 漂移到新 Master

Phase 4: Slaves Recovery

  • 4.1 並行生成各 Slave 與新 Master 的差分日志
  • 4.2 並行恢復:同 Phase 3.5 邏輯
  • change_master_and_start_slave:CHANGE MASTER TO 指向新 Master + START SLAVE

Phase 5: New Master Cleanup

  • reset_slave_on_new_master:RESET SLAVE 清理舊 Slave 信息,完成角色轉換

二、在線切換流程

Phase 1: Configuration Check

  • identify_orig_master:SHOW SLAVE STATUS 為空者為 Master
  • connect_check、validate_current_master、check_repl_priv
  • 獲取雙重 Advisory Lock:
      • MHA_Master_High_Availability_Monitor 防衝突 Monitor
      • MHA_Master_High_Availability_Failover 防衝突 Failover
  • check_replication_health:IO/SQL 線程、Seconds_Behind_Master < 1s
  • get_running_update_threads:SHOW PROCESSLIST 檢查寫入線程,有則中止
  • identify_new_master:選主邏輯同 Failover

Phase 2: Rejecting Updates

  • master_ip_online_change_script --command=stop:禁寫(VIP 切換前)
  • FLUSH TABLES WITH READ LOCK:全局讀鎖,停止 Binlog 寫入
  • check_binlog_stop:連續兩次 SHOW MASTER STATUS 位置不變確認停寫

Phase 3: Switching Master

  • master_pos_wait:等待所有 Slave 同步到 Master 當前位置
  • get_new_master_binlog_position:SHOW MASTER STATUS 獲取新坐標
  • master_ip_online_change_script --command=start:VIP 指向新 Master
  • SET GLOBAL read_only=0:新 Master 開啟寫入
  • switch_slaves:CHANGE MASTER TO + START SLAVE
  • UNLOCK TABLES:原 Master 釋放鎖

Phase 4/5: Cleanup

  • reset_slave_on_new_master、釋放 Advisory Lock

關鍵差異總結

維度故障切換在線切換
前提Master 掛掉Master 正常運行
數據一致性盡力挽救未同步 Binlog全局鎖保證零丟失
業務影響寫入中斷直到切換完成短暫只讀窗口(秒級)
核心難點Binlog 拼湊與重放鎖等待與協調
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved