目次
MHA フェイルオーバーとオンライン スイッチングのコード分析
少し前に、私の同僚の Shen Longxing が MHA フェイルオーバーとオンライン スイッチングのコード フローをコンパイルしました。彼の同意を得て、ここに転送します。以下本文です
フェイルオーバー処理プロセスについて説明します
ホームページ バックエンド開発 PHPチュートリアル MHA フェイルオーバーとオンライン切り替えのコード分析_PHP チュートリアル

MHA フェイルオーバーとオンライン切り替えのコード分析_PHP チュートリアル

Jul 12, 2016 am 08:54 AM
android

MHA フェイルオーバーとオンライン スイッチングのコード分析


少し前に、私の同僚の Shen Longxing が MHA フェイルオーバーとオンライン スイッチングのコード フローをコンパイルしました。彼の同意を得て、ここに転送します。以下本文です

この記事はMySQL5.5をベースにしているため、GTID関連の内容は含みません。 MHA のマスター/スレーブ切り替えプロセスは、フェイルオーバーとローテーションの 2 つのタイプに分かれており、前者は元のマスターがダウンしているときに適用され、後者はオンラインに切り替えるときに使用されます。以下に、



フェイルオーバー処理プロセスについて説明します


  1. MHA::MasterFailover::main()
  2. ->do_master_failover
  3. フェーズ 1: 構成チェックフェーズ
  4. ->check_settings:
  5. check_node_version: MHA バージョン情報の表示
  6. connect_ all _and_read_server_status: それぞれを確認ノードの MySQL インスタンスに接続できるかどうか
  7. get_dead_servers/get_alive_servers/get_alive_slaves: 各ノードの生存状態と停止状態を再確認します
  8. start_sql_threads_if: Slave_SQL_Running が Yes であるかどうかを確認し、そうでない場合は SQL スレッドを開始します

  9. フェーズ 2: デッド マスター シャットダウン フェーズ: 私たちにとって、唯一の機能は IO スレッドを停止することです
  10. -> Force_shutdown($dead_master):
  11. stop_io_thread: すべてのスレーブ IO スレッドが停止します (マスターが停止します)
  12. force_shutdown_internal (実際には、設定ファイル内の master_ip_failover_script/shutdown_script を実行することですが、そうでない場合は実行されません):
  13. master_ip_failover_script: VIP が設定されている場合は、最初に VIP を切り替えます
  14. shutdown_script: シャットダウン スクリプトが設定されている場合、

  15. を実行します
  16. フェーズ3:マスターリカバリフェーズ
  17. ->フェーズ3.1:最新のスレーブの取得フェーズ(最新のスレーブを取得)
  18. read_slave_status:各スレーブのバイナリログファイル/位置を取得します
  19. check_slave_status : 「SHOW SLAVE STATUS」を呼び出して、スレーブの次の情報を取得します:
  20. Slave_IO_State、Master_Host、
  21. Master_Port、Master_User、
  22. Slave_IO_Running、Slave_SQL_Running、
  23. Master_Log_File、 Pos、
  24. Relay_Master_Log_File、Last_Errno、
  25. Last_Error、Exec_Master_Log_Pos、
  26. Relay_Log_File、Relay_Log_Pos、
  27. Seconds_Behind_Master、Retrieved_Gtid_Set、
  28. Executed_Gtid_Set、Auto_Position
  29. Replicate_Do_DB、Replicate_Ignore_DB、Replicate_Do_Table、
  30. Replicate_Ignore_Table、Replicate_Wild_Do_Table、
  31. Replicate_Wild_Ignore_Table
  32. identify_latest_slaves :
  33. 各スレーブのMaster_Log_File/Read_Master_Log_Posを比較して最新のスレーブを見つけます
  34. identify_oldest_slaves:
  35. 各スレーブのMaster_Log_File/Read_Master_Log_Posを比較して最も古いスレーブを見つけます

  36. -> フェーズ 3 2: デッド マスターのビンログの保存フェーズ :
  37. save_master_binlog:
  38. デッド マスターが ssh 経由で接続できる場合は、次のブランチに移動します:
  39. save_master_binlog_internal: (ノード ノードの save_binary_logs スクリプトを使用してコピーを作成します)デッドマスター上)
  40. save_binary_logs --command=save - -start_file=mysql-bin.000281 --start_pos=107 --binlog_dir=/opt/mysql/data/binlog --output_file=/opt/mha/log /saved_master_binlog_from_10.27.177.245_3306_20160108211857.binlog --handle_raw_binlog=1 -- disable_log_bin=0 --manager_version=0.55
  41. generate_diff_binary_log:
  42. concat_all_binlogs_from :
  43. dump_binlog: binmodeを使用して、binlogファイルをターゲットファイルにダンプするだけですread
  44. dump_binlog_header_fde : 0からposition-1まで読み取ります
  45. dump_binlog_from_pos: 位置から開始して、binlogファイルをターゲットファイルにダンプします
  46. file_copy:
  47. ファイルコピーは、上記で生成されたbinlogファイルをmanager_workdirディレクトリにコピーすることです管理ノードの
  48. デッドマスターが ssh 経由でログインできない場合、スレーブと同期していないマスター上の txn が失われます

  49. -> フェーズ 3.3: 新しいマスターフェーズを決定する
  50. find_latest_base_slave:
  51. find_latest_base_slave_internal:
  52. pos_cmp( $old est_mlf, $oldest_mlp, $latest_mlf, $latest_mlp )
  53. 最新/最も古いスレーブのバイナリの位置が同じかどうかを判断します。同じです、そこにリレーログを同期する必要はありません
  54. apply_diff_relay_logs --command=find --latest
  55. 最新のスレーブに最も古いリレーログが欠落しているかどうかを確認し、欠落している場合は続行します。そうでない場合は、フェイルオーバーが失敗します。これは非常に簡単で、ファイル/位置が見つかるまで逆の順序で最新のスレーブのリレー ログ ファイルを読み取ることです。 Select_new_master: 新しいマスターを選択します。新しいマスターになります
  56. 最新のサーバーがあまりにも遅れている場合(つまり、オンラインバックアップのSQLスレッドを停止する場合)、
  57. それを新しいマスターとして使用すべきではなく、リレーログを取得する必要があります
  58. 。マスターは設定されていますが、大幅に遅れている場合はマスターになりません。
  59. get_candidate_masters:
  60. は設定ファイル内でcandidate_master>0で設定されたノードです
    ​​
  61. get_bad_candidate_masters:
  62. # 次のサーバーは設定できませんmaster:
  63. # - デッドサーバー
  64. # - conf ファイル (つまり、DR サーバー) に no_master を設定します
  65. # - log_bin が無効になります
  66. # - メジャー バージョンが最も古くありません
  67. # - レプリケーションの遅延が大きすぎます (スレーブとマスター間のビンログ位置のギャップが 100000000 を超えています)
  68. 最新のリレー ログ イベントを受信した候補マスター スレーブから検索します
  69. 見つからない場合:
  70. すべてのcandidate_masterスレーブから検索
  71. 見つからない場合:
  72. 最新のリレーログイベントを受信したすべてのスレーブから検索
  73. 見つからない場合:
  74. すべてのスレーブから検索

  75. -> フェーズ 3.4: 新しいマスター差分ログ生成フェーズ
  76. recover_relay_logs:
  77. 新しいマスターが最新のスレーブであるかどうかを確認します。そうでない場合は、apply_diff_relay_logs -- コマンドを使用して差分ログを生成します。
  78. そしてそれを新しい新しいマスターに送信します

  79. recover_master_internal:

  80. 3.2で生成されたdaedマスターのバイナリログを新しいマスターに送信します


  81. ->フェーズ3.5:マスターログ適用フェーズ

  82. Recovery_slave:

  83. apply_diff :

  84. 0. wait_until_relay_log_applied、新しいマスターがリレーログの実行を完了するまで待ちます

  85. 1. Exec_Master_Log_Pos == Read_Master_Log_Pos,

  86. を決定します。等しくない場合は、save_ を使用します。 binary_logs --command=保存先差分ログを生成します

  87. 2. apply_diff_relay _logs コマンドを呼び出し、新しいマスターがリカバリを実行します:

  88. 2.1 リカバリログは 3 つの部分に分かれています:

  89. exec_diff: Exec_Master_Log_Pos と Read_Master_Log_Pos の差分

  90. read_diff: 新しいマスターと最後のスレーブのリレー ログの差分

  91. binlog_diff: daed マスターとの最新のスレーブ ビンログの差分

  92. 実際、apply_diff_relay_logs は、回復するために mysqlbinlog コマンドを呼び出すことです

  93. //If vip が設定されている場合、vip のフェイルオーバーを実行するには master_ip_failover_script を呼び出す必要があります


  94. フェーズ 4: スレーブ回復フェーズ

  95. ->フェーズ 4.1: 並列スレーブ差分ログ生成フェーズの開始

  96. スレーブ間の差分ログを生成しますおよび新しいスレーブを選択し、ログを各スレーブの作業ディレクトリにコピーします。


  97. -> フェーズ4.2: 並列スレーブログ適用フェーズの開始

  98. recover_slave:

  99. フェーズ3.5と同じように各スレーブを回復します

  100. change_master_and_start_slave:

  101. CHANGE MASTER TO コマンドでこれらを変更しますスレーブは新しい新しいマスターを指し、最終的にレプリケーションを開始します (スレーブの開始)


  102. フェーズ 5: 新しいマスターのクリーンアップ フェーズ

  103. reset_slave_on_new_master

  104. 新しいマスターのクリーンアップは実際にはスレーブ情報をリセットします。元のスレーブ情報をキャンセルします。この時点で、マスターフェールオーバープロセス全体が完了します


rotate処理


    mha:: masterrotate :: main()
  1. -> do_master_online_switch:
    フェーズ1:fase
    - >識別_orig_master
    connect_alle_and_read_server_status :
    connect_check: まず接続チェックを実行して、各サーバーの MySQL サービスが正常であることを確認します
    connect_and_get_status: MySQL インスタンスのserver_id/mysql_version/log_bin.. およびその他の情報を取得します
    このステップにも重要な役割があります。現在のマスターノードを取得します。 show smile status を実行すると、
    出力が空の場合、現在のノードがマスター ノードであることを意味します。
    validate_current_master: マスターノードの情報を取得し、構成が正しいかどうかを判断します
    サーバーが停止しているかどうかを確認し、停止している場合はローテーションを終了します
    マスターが生きているかどうかを確認し、停止している場合はローテーションを終了します
    check_repl_priv:
    サーバーがダウンしているかどうかを確認しますユーザーはレプリケーション権限を持っています
    monitor_advisory_lock を取得して、現在マスター上で他の監視プロセスが実行されていないことを確認します
    実行: SELECT GET_LOCK('MHA_Master_High_Availability_Monitor', ?) AS Value
    failover_advisory_lock を取得して、現在スレーブ上で他のフェイルオーバー プロセスが実行されていないことを確認します
    実行: SELECT GET_LOCK('MHA_Master_High_Availability_Failover', ?) AS Value
    check_replication_health:
    実行: SHOW SLAVE STATUS のステータスを確認します: current_slave_position/has_replication_problem
    その中で、has_replication_problem は具体的に次の内容をチェックします: IO スレッド/SQL スレッド/Seconds_Behin d_マスター(1s)
    get_running_ update_threads:
    show processlist を使用して、現在更新を実行しているスレッドがあるかどうかを確認し、存在する場合は switch を終了します
    ->identify_new_master
    set_latest_slaves: 現在のスレーブ ノードはすべて最新のスレーブです
    select_new_master: 新しいマスター ノードを選択します。
    優先ノードが指定されている場合、アクティブな優先ノードの 1 つが新しいマスターになります。
    最新のサーバーが遅れすぎる場合 (オンライン バックアップの SQL スレッドを停止するなど)、
    新しいマスターとして使用すべきではなく、リレーをフェッチする必要があります。そこにログを記録することをお勧めします
    マスターは設定されていますが、大幅に遅れている場合はマスターになりません。
    get_candidate_masters:
    就是配置文件中配置了candidate_master>0の节点
    get_bad_candidate_masters:
    # 次のサーバーはマスターになれません:
    # - デッドサーバー
    # - conf ファイル (つまり、DR サーバー) で no_master を設定します
    # - log_bin が無効です
    # - メジャー バージョンが最も古くありません
    # - レプリケーションの遅延が大きすぎます (スレーブとマスターの binlog 位置の差距離大≧ 100000000)
    候補マスターのスレーブから検索しています最新のリレー ログ イベントを受信しました
    見つからない場合:
    すべての Candidate_master スレーブから検索します
    見つからない場合:
    最新のリレー ログ イベントを受信したすべてのスレーブから検索します
    見つからない場合:
    すべてのスレーブから検索します

    フェーズ 2 : 更新の拒否フェーズ
    拒否_update:ロックテーブル、書き込みビンログを拒否します
    MHAの構成ファイルに「master_ip_online_change_script」パラメータが設定されている場合、通常は現在のマスターへの書き込みを無効にします
    この脚本はvipを使用しているときに最適な設定が必要です
    reconnect: 現在のマスターとの正常な接続を確保します
    lock_all_tables: READ LOCK でテーブルをフラッシュし、テーブルをロックします
    check_binlog_stop: マスターのステータスを再度表示し、書き込みbinlog がすでに停止しているかどうかを判断します
    read_slave_status:
    get_alive_slaves:
    check_slave_status: 「SHOW SLAVE STATUS」を使用してスレーブの次のような情報を取得します:
    Slave_IO_State、Master_Host、
    Master_Port、Master_User、
    Slave_IO_Running、Slave_SQL_Running、
    Master_Log_File、Read_Master_Log_Pos、
    Relay_Master_Log_File、Last_Errno、
    Last _Error、Exec_Master_Log_Pos、
    Relay_Log_File、Relay_Log_Pos、
    Seconds_Behind_Master 、Retrieved_Gtid_Set、
    Executed_Gtid_Set、Auto_Position
    Replicate_Do_DB、Replicate_Ignore_DB、Replicate_Do_Table、
    Replicate_Ignore_Table、Replicate_Wild_Do_Table、
    Replicate_Wild_Ignore_Table
    switch_master:
    switch_master_ external:
    master_pos_wait:调用select master_pos_wait関数数,等待機主从同步完了
    get_new_master_binlog_position:执行'マスターステータスを表示'
    新しいマスターへの書き込みアクセスを許可します:
    调用master_ip_online_change_script --command=start ...,vip指向新しいマスター
    disable_read_only:
    新マスター上での実行:SET GLOBAL read_only=0
    switch_slaves:
    switch_slaves_internal:
    change_master_and_start_slave
    change_master :
    start_slave:
    unlock_tables:元のマスター上でロック解除テーブルを実行
    フェーズ 5: 新しいマスターのクリーンアップ フェーズ
    replace_slave_on_new_master
    release_failover_advisory_lock

http://www.bkjia.com/PHPjc/1119676.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1119676.html技術記事 MHA 障害切り替えとオンライン切り替えのコード解析前段階で、私は次の MHA 障害切り替えとオンライン切り替えのコード フローを整理し、同意した後、ここに送信します。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:23 PM

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Sep 11, 2024 am 06:37 AM

OnLeaks は、X (旧 Twitter) のフォロワーから 4,000 ドル以上を集めようとして失敗した数日後、Android Headlines と提携して Galaxy S25 Ultra のファーストルックを提供しました。コンテキストとして、h の下に埋め込まれたレンダリング イメージ

IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します Sep 07, 2024 am 06:35 AM

TCLは、2つの新しいスマートフォンの発表に加えて、NXTPAPER 14と呼ばれる新しいAndroidタブレットも発表しました。その巨大な画面サイズはセールスポイントの1つです。 NXTPAPER 14 は、TCL の代表的なブランドであるマット LCD パネルのバージョン 3.0 を搭載しています。

Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Sep 07, 2024 am 06:39 AM

Vivo Y300 Pro は完全に公開されたばかりで、大容量バッテリーを備えた最もスリムなミッドレンジ Android スマートフォンの 1 つです。正確に言うと、このスマートフォンの厚さはわずか 7.69 mm ですが、6,500 mAh のバッテリーを搭載しています。これは最近発売されたものと同じ容量です

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:22 PM

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Sep 12, 2024 pm 09:21 PM

サムスンは、ファンエディション(FE)スマートフォンシリーズをいつアップデートするかについて、まだ何のヒントも提供していない。現時点では、Galaxy S23 FE は 2023 年 10 月初めに発表された同社の最新版のままです。

Motorola Razr 50s は初期リークで新たな予算を折り畳める可能性があることを示す Motorola Razr 50s は初期リークで新たな予算を折り畳める可能性があることを示す Sep 07, 2024 am 09:35 AM

Motorola は今年数え切れないほどのデバイスをリリースしましたが、そのうち折りたたみ式デバイスは 2 つだけです。ちなみに、世界の大部分ではこのペアが Razr 50 および Razr 50 Ultra として受け入れられていますが、Motorola は北米では Razr 2024 および Razr 2 として提供しています。

Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Sep 27, 2024 am 06:23 AM

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

See all articles