MHA故障切换和在线手工切换原理
一、故障切換的過程
當master_manager監控到主庫mysqld服務停止后,首先對主庫進行SSH登錄檢查(save_binary_logs -command=test),然后對mysqld服務進行健康檢查(PING(SELECT)每個3秒檢查一次,持續3次),最后作出Master is down!的判斷,master failover開始
?
第1步:先根據配置文件檢測當前的復制環境中有哪些服務器,MHA也會校驗諸如復制異常以及是否存在一些從庫有不同的主庫,啟動failover(排除上次failover失敗或者failover時間間隔太短)
?
第2步:隔離master server,把故障主庫的VIP停掉(前提是你需要指定相關的腳本,比如:如果有master_ip_failover_script則會調用腳本停掉VIP、如果有shutdown_script腳本則調用腳本關閉master避免腦裂,在安裝包的samples/scriptes目錄下)
?
第3步:選舉新主庫并盡量補全新主庫的數據。
3.1?獲取同步位置最靠前的從庫:對比所有從庫的master_log_file和read_master_log_pos位置找出執行位置最新和最舊的從庫對應的故障主庫的binlog位置。
3.2保存dead master的binlog:在故障主庫上執行save_binary_logs命令獲得lastest slave同步位置與master間的binlog差異(使用3.1步驟找到的同步最靠前的從庫binlog位置,如果故障主庫系統沒掛的情況下)并scp到monitor server上。
3.3?確定新的主庫:先使用命令apply_diff_relay_logs --command=find把前面3.1步驟中找出的同步位置最靠前和最靠后的對應主庫的binlog位置作為參數,在同步位置最靠前的從庫上執行這個命令在其中繼日志中找出兩個binlog位置之間的relay log并生成文件用于恢復其他從庫(這里就是檢查同步最靠前的從庫是否有從最老的位置開始的中繼日志,這也是為什么MHA環境中執行過的中繼日志不能刪除的原因,否則這個對比就比較麻煩)。
接著尋找及決定新的主庫,根據配置選擇如何提升新主庫(檢查是否有設置candidate_master=1和no_master=1,如果有設置候選主庫,那么候選主庫中標,但候選庫不一定就是有最新數據的slave,所以需要跟其他從庫進行比較,當然如果候選主庫恰好是同步位置最靠前的從庫,就不需要跟其他從庫進行relay log比較了;如果沒有設置候選主庫,那么同步位置最靠前的從庫中標)。monitor server也會將之前復制的差異binlog復制到新主庫上。
3.4?新的主庫應用日志(如果有任何錯誤從這個階段會發生,需要手動恢復):新的主庫首選需要對比master_log_file=relay_master_log_file,read_master_log_pos=exec_master_log_pos確認自己已經執行完成復制,如果新的主庫不是同步位置最靠前的從庫,那么需要使用apply_diff_relay_logs --command=generate_and_send命令比較自己和同步位置最靠前的從庫之間的relay log是否存在差異,如果存在則需要生成一個差異relay log(如果新主庫就是同步位置最靠前的從庫,那么只需要執行monitor server發過來的差異日志即可),然后使用這兩個差異日志進行恢復數據(apply_diff_relay_logs --command=apply命令)。恢復完成后獲取binlog位置并生成change master語句準備用于其他從庫change master到新的主庫上,并設置read_only=0。然后把VIP綁定到新的主庫上。到這步驟新的主庫切換完成。
?
第4步:其他從庫恢復:將其他從庫數據盡量補全(所有從庫并行執行)。
4.1?并行使用apply_diff_relay_logs --command=generate_and_send命令判斷各個從庫的relay log位置和同步位置最靠前的從庫之間的relay log差異,并把差異文件從同步位置最靠前的從庫上發送到對應的各個從庫上。
4.2?并行使用兩個差異日志進行恢復:將monitor server上的binlog差異拷貝到各個從庫上,然后各個從庫通過master_log_file=relay_master_log_file,read_master_log_pos=exec_master_log_pos先確認自己已經執行完成復制,再應用兩個差異日志恢復數據。最后,執行reset slave,并重新CHANG MASTER到新主庫上。
第5步:新主庫執行reset slave操作清除之前slave信息,到這里故障主庫切換到新主庫完成。
?
注意:如果中途有意外發生會終止failover操作,并產生mha_manager.failover.error的文件,下一次必須要刪除該文件才能正常failover,New Master延時超過30s或者binglog差100M時不會Auto Failover。
?
?
二、在線手動切換過程
第1步:配置檢測:根據配置文件檢測主從關系以及確定有哪些存活的服務器,然后在master上執行FLUSH NO_WRITE_TO_BINLOG TABLES命令關閉打開的表。再檢查從庫到主庫的復制是否正常。并根據配置決定新的主庫。
?
第2步:執行FLUSH TABLES WITH READ LOCK鎖住所有的表阻塞主庫的寫操作。等待其他從庫復制追趕上主庫。這里建議部署master_ip_online_change_script?腳本,該腳本會自動阻塞以及kill原master session,置原master為只讀,停掉VIP(獲取舊主庫的binlog位置,使用master_log_wait()函數追趕主庫)。同步完成之后,獲取新主庫的binlog位置,生成change master語句準備用于其他從庫切換到新主庫。
?
第3步:所有其他從庫并行切換主庫到新主庫。使用第二步驟獲取的舊主庫的binlog位置,所有其他從庫使用master_log_wait()函數追趕主庫。然后使用change master切換到新的主庫上。
?
第4步:舊主庫unlock tables,并change master到新的主庫上。
?
第5步:新的主庫reset slave,綁定VIP在新的主庫上。
?
注:本文為根據MHA切換輸出日志整理,個人理解如有錯誤,還望指正!
?
?
作者:xiaoboluo
出處:xiaoboluo的博客 http://www.cnblogs.com/xiaoboluo768/
感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。
轉載于:https://blog.51cto.com/arthur376/1812358
總結
以上是生活随笔為你收集整理的MHA故障切换和在线手工切换原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pInvokeStackImbalanc
- 下一篇: Redis 字符串(String)