MySQL MHA全稱MySQL Master High Availability。MHA是一個(gè)用于MySQL主從復(fù)制架構(gòu)下故障轉(zhuǎn)移和自動(dòng)故障恢復(fù)的工具套件,與其他一些故障轉(zhuǎn)移工具(如keepalived)相比,MHA不僅可以偵測(cè)Master故障,還可以自動(dòng)切換Slave服務(wù),滿足對(duì)主、從復(fù)制的安全性、穩(wěn)定性和可靠性要求。
MHA由MHA Manager和MHA Node兩部分組成,MHA Manager部署在管理服務(wù)器上,MHA Node部署在MySQL的主從架構(gòu)中的服務(wù)器上。當(dāng)發(fā)生Master節(jié)點(diǎn)故障時(shí),MHA Manager自動(dòng)完成Failover(故障轉(zhuǎn)移)并選舉一個(gè)最適合角色的節(jié)點(diǎn)作為新的Master節(jié)點(diǎn)。Failover過程包括檢測(cè)主庫的狀態(tài)、判斷狀態(tài)是否可切換、選擇新的Master、將Slave節(jié)點(diǎn)重定向到新的Master,同時(shí)保證數(shù)據(jù)一致性和高可用性。當(dāng)Master節(jié)點(diǎn)的故障修復(fù)后,MHA Manager自動(dòng)完成Switchover(自動(dòng)恢復(fù))過程,將原Master重新加入到復(fù)制環(huán)境中。
如下是MHA Manager實(shí)現(xiàn)Failover和Switchover的核心代碼: $result = run_check( $self->{'orig_master_ip'} ); if ( !$result ) { #故障 Master 步驟 eval { #選擇新的 Master my $newmaster = get_master( $self->{'cluster'}, $prevmaster, \@slaves ); #確保新的 Master和舊的 Master手少差異 compare_replication_between_masters( $self->{'orig_master'}, $newmaster ); #將所有 Slave 重定向到新的 Master promote_slaves( $newmaster ); #更新狀態(tài) $self->change_master_to( $newmaster, 1 ); $self->notify_email( $newmaster->{hostname}, "failover" ); }, # ... } else { #恢復(fù) Master 步驟 eval { #選擇舊的 Master my $om = $self->{'orig_master'}; #確保新的 Master和舊的 Master手少差異 compare_replication_between_masters( $om, $standby ); #從當(dāng)前Master復(fù)制并賦值 sync_from_masters( $om, $standby ); #將Standby 節(jié)點(diǎn)重復(fù)分配Master角色 $self->promote_master_relaylog( $standby ); #更新狀態(tài) $self->change_master_to( $om, 0 ); $self->notify_email( $om->{hostname}, "switchover" ); } }
MHA作為一個(gè)主從復(fù)制的高可用解決方案,能夠很好地解決單點(diǎn)故障問題,保障數(shù)據(jù)可用性。在實(shí)際生產(chǎn)環(huán)境中,MHA已得到廣泛應(yīng)用,成為一個(gè)高效穩(wěn)定的故障轉(zhuǎn)移解決方案。