MySQL MHA切換過程分析

来源:https://www.cnblogs.com/xuliuzai/p/17978546
-Advertisement-
Play Games

​ 1、概念 mvcc作用在於解決併發條件下,讀寫衝突的問題。一般用於RC和RR隔離級別,解決臟讀和不可重覆讀的問題。 (1)當前讀 讀取的是記錄的最新版本,讀取時還要保證其他事務不能修改當前記錄,會對讀取的記錄進行加鎖。對於我們日常的操作,如:select ... lock in share mo ...


啟動 

MHA的啟動腳本為masterha_manager(安裝後,預設路徑--/usr/local/bin/masterha_manager)。啟動的過程中會主動檢查各節點的SSH連接和主從複製的狀態是否正常。運行期間,manager會調用masterha_master_monitor腳本(masterha_master_monitor進一步調用XXX/mha4mysql-manager-0.5?/lib/MHA/MasterMonitor.pm 和 HealthCheck.pm 等腳本),探測各節點的運行情況。探測間隔由manager配置文件中的ping_interval參數決定,探測三次主節點無反應,就判定為宕機。

 故障選主

---讀取配置文件中是否有候選主庫的參數--candidate_master=1;如果有該參數,並且check_repl_delay=0,則將該節點提升為新的主庫。

--如果沒有指定候選主節點,則自動判斷所有從庫的日誌量,將最接近主資料庫的從庫提升為新的主庫。

---按照配置文件中,節點的先後順序選主。

數據補償

---判斷主庫SSH的連通性,如果能連通,則通過“save_binary_logs”腳本將缺失的binlog發送給從庫,並恢復;

---如果主庫無法連通,則通過“apply_diff_relay_logs”腳本計算從庫的relay log的差異,並恢復到其他從庫;

角色切換

新選出的主庫,解除從庫身份,剩餘從庫與新的主庫建立主從關係。

VIP偏移

虛擬IP的綁定。

 

思考

如果在FailOver的過程中,主庫恢復了怎麼辦?

要分情況了,可能會FailOver繼續也可能要FailOver終止。下麵是FailOver終止的Log。

Sat Jan 20 09:27:28 2024 - [warning] Got timeout on MySQL Ping(SELECT) child process and killed it! at /usr/local/share/perl5/MHA/HealthCheck.pm line 431.
Sat Jan 20 09:27:28 2024 - [info] Executing SSH check script: exit 0
Sat Jan 20 09:27:32 2018 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '172.171.172.171' (4))
Sat Jan 20 09:27:32 2018 - [warning] Connection failed 2 time(s)..
Sat Jan 20 09:27:34 2024 - [warning] HealthCheck: Got timeout on checking SSH connection to 172.171.172.171! at /usr/local/share/perl5/MHA/HealthCheck.pm line 342.
Sat Jan 20 09:27:35 2024 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '172.171.172.171' (4))
Sat Jan 20 09:27:35 2024 - [warning] Connection failed 3 time(s)..
Sat Jan 20 09:27:38 2024 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '172.171.172.171' (4))
Sat Jan 20 09:27:38 2024 - [warning] Connection failed 4 time(s)..
Sat Jan 20 09:27:38 2024 - [warning] Master is not reachable from health checker!
Sat Jan 20 09:27:38 2024 - [warning] Master 172.171.172.171(172.171.172.171:3307) is not reachable!
Sat Jan 20 09:27:38 2024 - [warning] SSH is NOT reachable.
Sat Jan 20 09:27:38 2024 - [info] Connecting to a master server failed. Reading configuration file /etc/masterha_default.cnf and /data/mhacnf/qqweixinod.cnf again, and trying to connect to all servers to check server status..
Sat Jan 20 09:27:38 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Jan 20 09:27:38 2024 - [info] Reading application default configuration from /data/mhacnf/qqweixinod.cnf..
Sat Jan 20 09:27:38 2024 - [info] Reading server configuration from /data/mhacnf/qqweixinod.cnf..
Sat Jan 20 09:27:39 2024 - [info] GTID failover mode = 1
Sat Jan 20 09:27:39 2024 - [info] Dead Servers:
Sat Jan 20 09:27:39 2024 - [info] 172.171.172.171(172.171.172.171:3307)
Sat Jan 20 09:27:39 2024 - [info] Alive Servers:
Sat Jan 20 09:27:39 2024 - [info] 172.171.172.172(172.171.172.172:3307)
Sat Jan 20 09:27:39 2024 - [info] 172.171.172.173(172.171.172.173:3307)
Sat Jan 20 09:27:39 2024 - [info] Alive Slaves:
Sat Jan 20 09:27:39 2024 - [info] 172.171.172.172(172.171.172.172:3307) Version=5.7.21-log (oldest major version between slaves) log-bin:enabled
Sat Jan 20 09:27:39 2024 - [info] GTID ON
Sat Jan 20 09:27:39 2024 - [info] Replicating from 172.171.172.171(172.171.172.171:3307)
Sat Jan 20 09:27:39 2024 - [info] Primary candidate for the new Master (candidate_master is set)
Sat Jan 20 09:27:39 2024 - [info] 172.171.172.173(172.171.172.173:3307) Version=5.7.21-log (oldest major version between slaves) log-bin:enabled
Sat Jan 20 09:27:39 2024 - [info] GTID ON
Sat Jan 20 09:27:39 2024 - [info] Replicating from 172.171.172.171(172.171.172.171:3307)
Sat Jan 20 09:27:39 2024 - [info] Checking slave configurations..
Sat Jan 20 09:27:39 2024 - [info] Checking replication filtering settings..
Sat Jan 20 09:27:39 2024 - [info] Replication filtering check ok.
Sat Jan 20 09:27:39 2024 - [info] Master is down!
Sat Jan 20 09:27:39 2024 - [info] Terminating monitoring script.
Sat Jan 20 09:27:39 2024 - [info] Got exit code 20 (Master dead).
Sat Jan 20 09:27:39 2024 - [info] MHA::MasterFailover version 0.56.
Sat Jan 20 09:27:39 2024 - [info] Starting master failover.
Sat Jan 20 09:27:39 2024 - [info]
Sat Jan 20 09:27:39 2024 - [info] * Phase 1: Configuration Check Phase..
Sat Jan 20 09:27:39 2024 - [info]
Sat Jan 20 09:27:40 2024 - [info] GTID failover mode = 1
Sat Jan 20 09:27:40 2024 - [info] Dead Servers:
Sat Jan 20 09:27:40 2024 - [info] 172.171.172.171(172.171.172.171:3307)

Sat Jan 20 09:27:40 2018 - [info] Checking master reachability via MySQL(double check)...
Sat Jan 20 09:27:40 2018 - [error][/usr/local/share/perl5/MHA/MasterFailover.pm, ln218] The master 172.171.172.171(172.171.172.171:3307) is reachable via MySQL (error=1:Connection Succeeded) ! Stop failover. Sat Jan 20 09:27:40 2018 - [error][/usr/local/share/perl5/MHA/ManagerUtil.pm, ln177] Got ERROR: at /usr/local/bin/masterha_manager line 65.

註:Log中的3307是資料庫的DB埠,別奇怪. 

如果是在 Checking master reachability via MySQL(double check) 的過程中(或者check前),發現恢復了,則退出切換過程。並且MHA的進程也會被退出(KIll),masterha_manager 需要重新手動啟動。

Checking master reachability via MySQL(double check) ---MasterFailover.pm

源碼如下:

# quick check that the dead server is really dead
# not double check when ping_type is insert,
# because check_connection_fast_util can rerurn true if insert-check detects I/O failure.
  if ( $servers_config[0]->{ping_type} ne $MHA::ManagerConst::PING_TYPE_INSERT )
  {
    $log->info("Checking master reachability via MySQL(double check)...");
    if (
      my $rc = MHA::DBHelper::check_connection_fast_util(
        $dead_master->{hostname}, $dead_master->{port},
        $dead_master->{user},     $dead_master->{password}
      )
      )
    {
      $log->error(
        sprintf(
          "The master %s is reachable via MySQL (error=%s) ! Stop failover.",
          $dead_master->get_hostinfo(), $rc
        )
      );
      croak;
    }
    $log->info(" ok.");
  }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 小北說在前面: 在一線互聯網企業種,如網易、美團、位元組、如阿裡、滴滴、極兔、有贊、希音、百度、美團等大廠,資料庫的面試題,一直是核心和重點的提問點,比如前段時間有位小伙伴面試位元組,就遇到了下麵這道面試題: 索引的設計規範,你知道那些? 小伙伴雖然用過索引,但是索引的設計規範忘記得一干二凈,回答也是朦 ...
  • ELK的架構有多種,本篇分享使用的架構如圖所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生產環境一天幾千萬的日誌,記憶體占用大概 10G ...
  • 本文向大家介紹了最小二乘法以及公式推導的過程,並使用C#與Python進行實現。重點介紹了C#中是如何實現的,同時介紹了在C#中如何使用OxyPlot繪圖。希望對你有所幫助。 ...
  • 在 .NET 中,字元串是不可變的,這意味著一旦創建,字元串的內容就不能被修改。字元串在記憶體中以不同的方式存儲,具體取決於它是常量字元串還是動態創建的字元串。 常量字元串 常量字元串在編譯時就被解析,併在程式的元數據(Metadata)中存儲。多個相同的字元串常量可能會共用同一塊記憶體。 string ...
  • 字元串用於存儲文本。一個字元串變數包含由雙引號括起的字元集合 示例: // 創建一個string類型的變數並賦予一個值 string greeting = "Hello"; 如果需要,一個字元串變數可以包含多個單詞: 示例: string greeting2 = "Nice to meet you! ...
  • 提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔 @目錄前言一、docker是什麼?二、docker compose是什麼?三、安裝步驟1.Ubuntu安裝腳本2.生成腳本3.啟動和驗證四、卸載步驟1.Ubuntu卸載腳本2.保存文件後設置執行許可權3.運行文件4.驗證是否刪除成功Ce ...
  • Linux內核定義 Linux內核是Linux操作系統的核心部分,它是一個類Unix的操作系統內核,提供了必要的服務並管理系統資源。內核充當硬體和軟體層之間的介面,使操作系統能夠與底層硬體 組件進行通信和控制。以下是Linux內核的一些重要功能: 進程管理:內核管理進程的執行,分配CPU時間、記憶體和 ...
  • 鋼鐵知識庫,一個學習python爬蟲、數據分析的知識庫。人生苦短,快用python。 xshell是什麼 通俗點說就是一款強大ssh遠程軟體,可以方便運維人員對伺服器進行管理操作,功能很多朋友們自行探索,今天只聊其中一個功能點那就是隧道轉發。 隧道轉移是什麼 xshell隧道轉移到底是幹嘛的,有什麼 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...