MySQLのMHA--メインライブラリ障害検出

MHAメインライブラリのチェックパラメータ

0.53バージョンからのMHAは、マスターの可用性をチェックする方法を設定するにはping_typeパラメータをサポートするために始めた:
ping_type =選択:既存のいずれかを選択し実行するための接続をマスターするために、1つに基づいて、接続が再利用され、選択のチェックはすぐに結果を返しますが、あまりにも単純で確認することができますより多くの欠陥を見つけます。
ping_type =接続:1つの動作を選択し、各実行の前と後の作成と切り離し、より厳しいとTCPコネクションレベルの障害のより迅速な発見。
ping_type =挿入:接続に基づいて、挿入文の実行がすでにマスタに存在して、接続が再利用、故障によるディスク容量やディスクIOリソースの枯渇のうち、データベースを検出しやすくなり。これは、バージョン0.56で導入されました。

MHAは、4つの連続pingが失敗した後、マスターノードに障害が発生したと判断され、間隔ping_interval主MHAマネージャライブラリ障害検出、3秒のデフォルト間隔を設定するために使用されます。

 

スクリプトをチェックMHAメインライブラリー

ping_selectコード(/lib/MHA/HealthCheck.pm)

サブping_select($){ 
  私の$自己= シフト; 
  私の$ ログ  = $自己- > {ロガー}; 
  私の$ DBH   = $自己- > {DBH}; 
  私の($クエリは、$ sthは、$のHREF)。
  評価{ 
    $ DBH - > {RAISEERROR} =  1 
    $ STH = $ DBH - > 準備( " SELECT  1  として値")。
    $のSTH - > 実行(); 
    $ HREF = $のSTH - > fetchrow_hashref。
    もし(!)($ HREFを定義
       ||定義($ HREF!- > {値})
       || $ HREF - > {値} =! 1 
    { 
      死にます。
    } 
  }。
  もし($ @){ 
    私の$ MSGは= "ガット・エラー MySQLの選択のping:"; 
    undefを$ @; 
    $のMSG。= $ DBI ::誤る場合($ DBI :: ERR)。
    $のMSG。= "($ DBI :: errstrは)" もし($ DBI :: errstrは)。
    $のログ- >警告($のMSG)であれば($ログ);
    リターン 1 ; 
  } 
  戻り 0 
}

 

ping_connectコード(/lib/MHA/HealthCheck.pm)

サブping_connect($){ 
  私の$自己= シフト; 
  私の$ ログ  = $自己- > {ロガー}; 
  私の$ DBH。
  私の$ RC           =  1 ; 
  私の$ MAX_RETRIES =  2 ; 
  evalの{ 
    私の$ ping_start =  [ gettimeofdayの] ながら(!$自己- > {DBH} && $ MAX_RETRIES - ){ 
      評価{$ RC = $自己- >(接続1、$自己> - {間隔} 001 )。}。
      もし(!$の自己- > {} DBH && $ @){ 
        @ $を死ぬかの(!$ MAX_RETRIES)。
      } 
    } 
    $ RC = $自己- > ping_select(); 
する諮問ロックを保持するための いくつかの期間時間
    $自己> - sleep_until($のping_start、$自己- > {間隔} -  1.5 )。
    $自己- > disconnect_if(); 
  }。
  もし($ @){
    私の$ MSG =「ガット・エラーMySQLはpingを接続します。$ @を」。
    undefを$ @; 
    $のMSG。= $ DBI ::誤る場合($ DBI :: ERR)。
    $のMSG。= "($ DBI :: errstrは)" もし($ DBI :: errstrは)。
    $ ログ- >警告($のMSG)場合($のログ)。
    $ RC =  1 ; 
  } 
  戻り 2  であれば($自己- > {_already_monitored})。
  返す$ RC。
}

 

ping_insertコード(/lib/MHA/HealthCheck.pm)

サブping_insert($){ 
  私の$自己= シフト; 
  私の$ ログ  = $自己- > {ロガー}; 
  私の$ DBH   = $自己- > {DBH}; 
  私の($クエリは、$ sthは、$のHREF)。
  評価{ 
    $ DBH - > {RAISEERROR} =  1 
    $ DBH - >行う( " CREATE  DATABASEを IF  NOTは EXISTS 以下に"); 
    $ DBH - > 行う(CREATE  TABLEを IF  NOTは EXISTS infra.chk_masterha( ` キーを `TINYINT  NOT  NULL   キー、 `val`のINT10)符号なしのNOT  NULL  DEFAULT  ' 0 ')エンジン= MyISAMテーブル" 
    ); 
    $をDBH - > ん(
" INSERT  INTO infra.chk_masterhaの1)、UNIX_TIMESTAMP()ON DUPLICATE KEY  UPDATEのval = UNIX_TIMESTAMP() " 
    ); 
  }; 
  場合($ @を){ 
    私の$ MSG = "ガットエラーMySQLの挿入のping: "; 
    undefを$ @; 
    。$のMSG = $ DBI ::誤る場合($ DBI :: ERR); 
    $のMSG。= "($ DBI :: errstrは)」もし($ DBI :: errstrは)。
    $のログ- >警告($のMSG)場合($のログを返す 1 ; 
  } 
  戻り 0 ; 
}

 

連続する4つの主リザーバは、チェックに失敗した失敗したと判断されます

もし($ ERROR_COUNT > =  4 ){ 
  $ ssh_reachable = $自己- > is_ssh_reachable(); 
  $ master_is_down =  1  の場合($の自己- > is_secondary_down()); 
  最後の場合($ master_is_down)。
  $ ERROR_COUNT =  0 ; 
}

 

おすすめ

転載: www.cnblogs.com/gaogao67/p/11359667.html