日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MHA选择主库源码解析

發(fā)布時(shí)間:2024/1/17 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MHA选择主库源码解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

知數(shù)堂第5期MySQL實(shí)戰(zhàn)班學(xué)員,第10期MySQL優(yōu)化班學(xué)員,現(xiàn)任職助教。

MHA在選擇新的主庫(kù)之前,會(huì)先把活著的slave分為幾個(gè)數(shù)組,分別為latest(最靠前的slave數(shù)組),pref(優(yōu)先被選擇為master的數(shù)組),bad(不會(huì)被選擇成為master的slave),slaves(所有活著的slave數(shù)組)。然后進(jìn)行5次選擇,從上面的這些組當(dāng)中挑選出新的master。

選擇latest數(shù)組

foreach (@slaves) { my $a = $latest[0]{Master_Log_File}; my $b = $latest[0]{Read_Master_Log_Pos}; if ( !$find_oldest && ( ( !$a && !defined($b) ) || ( $_->{Master_Log_File} gt $latest[0]{Master_Log_File} ) || ( ( $_->{Master_Log_File} ge $latest[0]{Master_Log_File} ) && $_->{Read_Master_Log_Pos} > $latest[0]www.wanmeiyuele.cn{Read_Master_Log_Pos} ) ) ) { @latest = (); push( @latest, $_ ); } elsif ( $find_oldest && ( ( !$a && !defined($b) ) || ( $_->{Master_Log_File} lt $latest[0]{Master_Log_File} ) || ( ( $_->{Master_Log_File} le $latest[0]{Master_Log_File} ) && $_->{Read_Master_Log_Pos} < $latest[0]{Read_Master_Log_Pos} ) ) ) { @latest = (); push( @latest, $_ ); } elsif ( ( $_->{Master_Log_File} eq $latest[0]{Master_Log_File} ) && ( $_->{Read_Master_Log_Pos} == $latest[0]{Read_Master_Log_Pos} ) ) { push( @latest, $_ ); } }

上面代碼主要的結(jié)構(gòu)就是一個(gè)foreach循環(huán),一個(gè)if判斷。foreach循環(huán)處理所有的活著的slave。if判斷這里有三個(gè)判斷條件,主要根據(jù)Master_Log_File和Read_Master_Log_Pos的大小來(lái)判斷。第一個(gè)和第二個(gè)分別為了找出最靠前和最靠后的slave的。如果滿(mǎn)足條件,那么就清空l(shuí)atest數(shù)組,把符合條件的放入latest數(shù)組里面。第三個(gè)條件用于找出和latest數(shù)組里面Master_Log_File和Read_Master_Log_Pos一樣的slave,并放入latest數(shù)組。這樣所有的 最靠前的就都放入latest數(shù)組里面了。

選擇pref數(shù)組

foreach (@servers) {next if ( $_->{dead} eq '1' );if ( $_->{candidate_master} >= 1 ) {push( @ret_servers, $_ );}}

循環(huán)處理所有的配置server,已經(jīng)死了的slave跳過(guò),有參數(shù)candidate_master=1的slave放入pref數(shù)組,會(huì)被優(yōu)先推舉為新的master。

選擇bad數(shù)組

foreach (@servers) {if ($_->{no_master} >= 1|| $_->{log_bin}www.365soke.cn? eq '0'|| $_->{oldest_major_version} eq '0'|| ($latest_slave&& ( $check_replication_delay&& $self->check_slave_delay( $_, $latest_slave ) >= 1 ))){push( @ret_servers, $_ );}}

也是循環(huán)處理所有的配置的server,滿(mǎn)足下面三個(gè)條件之一就會(huì)被選擇放入bad數(shù)組,也就說(shuō)這些slave不會(huì)被推選為新的master。

  • 添加了參數(shù)no_master=1

  • 沒(méi)有開(kāi)啟binlog

  • 如果延遲太大,如何才算是復(fù)制延遲太大呢?

  • ( $latest->{Master_Log_File} gt $target->{Relay_Master_Log_File} ) || ( $latest->{Read_Master_Log_Pos} > $target->{Exec_Master_Log_Pos} + 100000000 )

    這里的latest就是上面選擇出來(lái)最靠前的第一個(gè)latest slave,不過(guò)所有的latest都是一樣的,所以選擇哪一個(gè)用于比較都是沒(méi)關(guān)系的。要么latest的master_log_file > 對(duì)比者的Relay_Master_Log_File。或者是兩者相同,但是latest的Read_Master_Log_Pos > 對(duì)比者的Exec_Master_Log_Pos+1億。如果設(shè)置了參數(shù)check_repl_delay=0,那就不會(huì)會(huì)檢查復(fù)制延遲。

    選擇slaves數(shù)組

    只要是活著的slave都會(huì)被放進(jìn)slaves數(shù)組當(dāng)中。

    這里需要說(shuō)明的是,一個(gè)slave可以放進(jìn)多個(gè)數(shù)組當(dāng)中。不是一個(gè)slave只能存放到一個(gè)數(shù)組當(dāng)中。

    第一次選擇:

    return $latest[0] if ( $#pref <www.feihuanyule.com 0 && $#bad < 0 && $latest[0]->{latest_priority} );

    如果pref和bad數(shù)組當(dāng)中slave的個(gè)數(shù)為0,則選擇latest數(shù)組當(dāng)中的第一個(gè)slave為master。

    第二次選擇:

    $log->info( " Searching from candidate_master slaves which have received the latest relay log events.." ) if ( $#pref >= 0 ); foreach my $h (@latest) { foreach my $p (@pref) { if ( $h->{id} eq $p->{id} ) { return $h if ( !$self->get\_server\_from\_by\_id( \@bad, $p->{id} ) ); } } } $log->info(" Not found.") if ( $#pref >= 0 );

    循環(huán)對(duì)比latest數(shù)組和perf數(shù)組的slave,如果存在相同的slave,并且這個(gè)slave不在bad數(shù)組當(dāng)中,該slave會(huì)被推選為新的master。

    第三次選擇:

    foreach my $s (@slaves) { foreach my $p (@pref)www.hbs90.cn/ { if ( $s->{id} eq $p->{id} ) { my $a = $self->get_server_from_by_id( \@bad, $p->{id} ); return $s unless ($a); } } }

    循環(huán)對(duì)比slaves數(shù)組pref數(shù)組當(dāng)中的slave,如果有一個(gè)slave相同并且不在bad數(shù)組當(dāng)中,該就會(huì)成為新的master。

    第四次選擇:

    foreach my $h (@latest) { my $a = $self->get_server_from_by_id( @bad, $h->{id} ); return $h unless ($a); }

    循環(huán)latest數(shù)組,如果有循環(huán)到的slave不在bad數(shù)組當(dāng)中,這個(gè)slave就會(huì)成為master。也就是說(shuō)就算添加了candidate_master=1,該slave也不一定會(huì)成為主庫(kù)。

    第五次選擇:

    foreach my $s (@slaves)www.yibaoyule1.com/ { my $a = $self->get_server_from_by_id( @bad, $s->{id} ); return $s unless (www.huayi1.cn/?$a); }

    從活著的slave當(dāng)中進(jìn)行循環(huán),如果循環(huán)到的slave不在bad數(shù)組當(dāng)中,那么這個(gè)slave就會(huì)成為主庫(kù)。 如果進(jìn)行了5次選擇都找不到主庫(kù),那么主庫(kù)選擇失敗,failover失敗。

    轉(zhuǎn)載于:https://www.cnblogs.com/qwangxiao/p/8836675.html

    總結(jié)

    以上是生活随笔為你收集整理的MHA选择主库源码解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。