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、$自己> - {間隔} 0、0、1 )。}。 もし(!$の自己- > {} 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`のINT(10)符号なしの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 ; }