MySQL マスタースレーブ同期メカニズムと同期遅延問題追跡プロセス

MySQL マスタースレーブ同期メカニズムと同期遅延問題追跡プロセス

序文

DBA として、仕事中に MySQL マスターとスレーブの同期遅延の問題に遭遇することがよくあります。これらの同期遅延の問題には、実際には多くの原因があり、マスターとスレーブ間のネットワークの問題、ネットワーク帯域幅の問題、大規模なトランザクション、またはシングルスレッドのレプリケーションによる遅延が原因である可能性があります。

今日、問題が発生しました。Mysql がエラーを報告し続け、マスターとスレーブの同期の遅延が大きすぎたり間違っていたりしました。そこでこの記事では、マスター/スレーブ同期のメカニズム原理とトラブルシューティングのアイデアを紹介します。

障害の顕在化

最も直感的なパフォーマンスは次のとおりです。

mysql> スレーブステータスを表示します\G;
 // 状態 1 Seconds_Behind_Master: NULL
 // 状態 2 Seconds_Behind_Master: 0
 // 状態 3 Seconds_Behind_Master: 79

継続的なクエリでは、属性値はほとんどの場合 0 ですが、Null や 79 などの遅延値が表示されることもあります。これにより、マスター スレーブ同期遅延の監視が継続して警告されます。

原因と解決策

複数のバックアップ サーバーのサーバー ID が同じであるため、ホストは長時間バックアップ サーバーに接続できず、正常に同期できません。

サーバー ID を変更した後、データベースを再起動して回復します。

マスタースレーブ同期メカニズム

MySQL マスター スレーブ同期 (レプリケーションとも呼ばれます) は、次の主な機能を備えた組み込みの高可用性および高パフォーマンスのクラスター ソリューションです。

  • データ分散: 同期には大きな帯域幅は必要なく、複数のデータセンターにデータを複製できます。
  • 読み取り負荷分散: サーバー クラスターを通じて、DNS ポーリングや Linux LVS などの GSLB (グローバル負荷分散) 方式を使用して、メイン サーバーの読み取り負荷を軽減できます。
  • データベースのバックアップ: レプリケーションはバックアップの一部ですが、バックアップの代わりになるものではありません。スナップショットと組み合わせる必要もあります。
  • 高可用性とフェイルオーバー: スレーブ サーバーはマスター サーバーにすばやく切り替えることができるため、ダウンタイムと回復時間が短縮されます。

マスタースレーブ同期は 3 つのステップに分かれています。

  1. マスター サーバー (master) は、データの変更をバイナリ ログ (binlog) に記録します。
  2. スレーブ サーバーは、マスター サーバーのバイナリ ログを自身のリレー ログにコピーします。
  3. サーバーからのリレー ログのログをやり直し、変更を独自のデータベースに適用して、データの一貫性を実現します。

マスタースレーブ同期は非同期リアルタイム同期であり、リアルタイムで送信しますが、実行に遅延があります。マスターサーバーの負荷が大きい場合、遅延もそれに応じて増加します。

上の図から、合計 3 つのスレッドが必要であることがわかります。

  1. プライマリサーバーのログ転送スレッド: バイナリログの増分をスタンバイサーバーに転送する役割を担う
  2. スレーブサーバーのI/Oスレッド: マスターサーバーのバイナリログを読み取り、リレーログとして保存する役割を担う
  3. スレーブサーバーのSQLスレッドはリレーログの実行を担当します。

MySQL スレッドを表示

MySQL のステータスを表示するにはshow full processlist;コマンドを使用できます。

ホストのステータス:

スタンバイマシンのステータス:

ご覧のとおり、私のクラスター アーキテクチャは 1 台のホストと 4 台のスタンバイ マシンで構成されているため、ホストには 4 つの同期スレッド (すべての binlog データはスタンバイ マシンに送信され、binlog ログの更新を待機しています) と 1 つの表示コマンド スレッド (完全なプロセス リストを表示) があります。スタンバイ マシンには、表示コマンド スレッドが 1 つ、I/O スレッドが 1 つ (マスターが同期データ イベントを送信するのを待機中)、および SQL スレッドが 1 つ (すべてのリレー ログを読み取り、I/O スレッドによる更新を待機中) あります。

同期ステータスの表示

マスター スレーブ同期は非同期かつリアルタイムであるため、遅延が発生します。スタンバイ マシンの同期遅延を表示するには、show slave status; を使用します。

マスター スレーブ同期で注意する必要があるいくつかのプロパティは赤でマークされています。

  • Slave_IO_State: 現在のI/Oスレッドの状態
  • Master_Log_File: 現在同期されているマスターサーバーのバイナリファイル
  • Read_Master_Log_Pos: 現在同期されているマスターサーバーのバイナリファイルのオフセット(バイト単位)。図に示すように、12.9M(13630580/1024/1024)が同期されています。
  • Relay_Master_Log_File: 現在のリレーログ同期のバイナリファイル
  • Slave_IO_Running: スレーブ サーバー内の I/O スレッドの実行ステータス。YES は正常に実行されていることを意味します。
  • Slave_SQL_Running: スレーブ サーバー内の SQL スレッドの実行ステータス。YES は正常に実行されていることを意味します。
  • Exec_Master_Log_Pos: 同期が完了したマスターサーバーのバイナリログオフセットを示します。
  • Seconds_Behind_Master: スレーブサーバーのデータがマスターサーバーより遅れている期間を示します。

show master status; コマンドを使用して、マスター サーバーの実行ステータスを表示することもできます。

通常のマスタースレーブ同期ステータス:

スレーブIO実行中: はい
スレーブSQL実行中: はい
マスターより遅れている秒数: 0

トラブルシューティング

マスタースレーブ同期のメカニズムを理解した後、今日遭遇した問題を見てみましょう。スタンバイマシンのステータスを確認すると、3 つの状態でいくつかの重要な属性値が観察されます。

mysql> スレーブステータスを表示します\G;
#状態1:
 Slave_IO_State: マスターイベントの読み取りに失敗した後に再接続中
 スレーブIO実行中: いいえ
 スレーブSQL実行中: はい
 マスターより遅れている秒数: NULL
#状態2:
 Slave_IO_State: マスターがイベントを送信するのを待機中
 スレーブIO実行中: はい
 スレーブSQL実行中: はい
 マスターより遅れている秒数: 0
#状態3:
 Slave_IO_State: マスターイベントをリレーログにキューイング
 スレーブIO実行中: はい
 スレーブSQL実行中: はい
 マスターとの差: 636

MySQL マスター スレーブ レプリケーション スレッドの状態遷移を通じて、3 つの状態の異なる意味を確認できます。

# 状態 1# スレッドはマスター サーバーに再接続しようとしています。接続が再確立されると、状態はマスターがイベントを送信するのを待機中に変わります。
マスターイベントの読み取りに失敗した後の再接続
# 状態 2# スレッドはプライマリ サーバーに接続し、バイナリ ログ イベントが到着するのを待機しています。プライマリ サーバーがアイドル状態の場合は、さらに長く続く可能性があります。待機が slave_read_timeout 秒続くと、タイムアウトが発生します。この時点で、スレッドは接続が切断されたと見なし、再接続を試みます。
マスターがイベントを送信するのを待っています

# 状態 3 # スレッドはイベントを読み取り、SQL スレッドが処理できるようにリレー ログにコピーしています。
マスターイベントをリレーログにキューイングする

ここでは、何らかの理由でスレーブ サーバーがマスター サーバーから切断され、再接続を試行し続け、再接続が成功した後に再び切断されていると推測できます。

ホストの動作を見てみましょう。

問題は 10.144.63.* と 10.144.68.* の 2 台のマシンで発生していることがわかりました。そのうちの 1 台のエラー ログを確認しました。

190214 11:33:20 [注記] スレーブ: サーバーから終了パケットを受信しました。マスターがシャットダウンしたようです。
190214 11:33:20 [注記] スレーブ I/O スレッド: ログ イベントの読み取りに失敗しました。再試行のために再接続しています。位置 13628070 のログ 'mysql-bin.005682'

Google でキーワード「Slave: received end packet from server, apparent master shut down:」を検索すると、「Confusing MySQL Replication Error Message」の記事で、原因は 2 つのスタンバイ サーバーのサーバー ID が重複していることであることがわかります。

ある日、私にもそれが起こり、それを知るのにほぼ 1 時間かかりました。
今後は、常にベースの my.cnf を使用して他のサーバーにコピーし、最初にサーバー ID を増やします。
MySQL では数値の代わりにサーバー名を使用できますか?

バグ修正

問題を特定した後、重複があるかどうかを確認したところ、2 台のバックアップ マシンのフィールドが実際に同じであることがわかりました。

vim の my.cnf

#レプリケーション
ログ bin = mysql bin
# この乱数は server-id=177230069 と同じです
同期バイナリログ=1

別の番号を変更して保存し、MySQL プロセスを再起動すると、アラームが復元されます。

要約する

結局のところ、この問題の解決方法は非常に簡単ですが、問題のトラブルシューティングを行う際には、最初は混乱していたものの、最後にはアイデアが明確になるという変化がよく見られます。この記事の主な利点は、マスター スレーブ同期のメカニズムと問題を追跡するためのアイデアを理解できるようにすることです。次回は、マスター スレーブ同期によってもたらされる問題を迅速に解決できることを願っています。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

参考文献

  • 「MySQL の基礎: InnoDB ストレージ エンジン 第 2 版」P8.7 コピー
  • MySQL マスタースレーブレプリケーションスレッドの状態変更
  • わかりにくい MySQL レプリケーション エラー メッセージ
以下もご興味があるかもしれません:
  • MySQL マスタースレーブ同期の原理と応用
  • Mysql データベースのマスタースレーブ同期構成
  • この記事では、MySQLのマスタースレーブ同期の原理を説明します。
  • Mysqlマスタースレーブ同期の実装原理
  • Mysql マスタースレーブ同期構成の実践の詳細な説明
  • MYSQLデータベースでマスタースレーブ同期を設定する方法

<<:  nginxを使用してドメイン名ベースの仮想ホストを構成する

>>:  Easyswoole ワンクリック インストール スクリプトとパゴダ インストール エラー

推薦する

JS 面接の質問: forEach はループから抜け出すことができますか?

この質問をされたとき、私は無知で頭が真っ白になりました。もちろん、正しく答えられませんでした。私はず...

Vue 2つのフィールドの共同検証によりパスワード変更機能を実現

目次1. はじめに2. ソリューションの実装2.1 実装コード2.2 コードの説明2.3 検証結果1...

HTML でのアンカータグの使用例の共有

アンカータグの使用法:同じドキュメント内の特定の場所にリンクすることをアンカー リンクと呼びます。ア...

最も単純な ErrorBoundary コンポーネントをカプセル化して、React 例外を処理する

序文React 16から、子コンポーネントで発生したエラーを捕捉し、エラーログを記録し、ダウングレー...

よくある CSS のヒントと経験談 11 選

1. 画像の下にある数ピクセルの空白を削除するにはどうすればよいですか?コードをコピーコードは次のと...

Linux で同じ内容のファイルを識別する方法の詳細な説明

序文ファイルのコピーによってハードドライブのスペースが大量に浪費され、ファイルを更新するときに混乱が...

CSS における @ の使用法の概要 (例と説明付き)

@ ルールは、CSS の実行または動作に関する指示を提供する宣言です。各宣言は @ で始まり、その...

MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明

大量のデータを扱うシステムの中には、クエリ効率の低さやデータの保存時間の長さといったデータベースの問...

Dockerボリュームマウントの実装方法

最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...

MySQL 5.7 に組み込まれているストレス テストの mysqlslap コマンドと構文の詳細な説明

序文mysqlslap は、MySQL サーバーへのクライアント負荷をシミュレートし、各ステージの時...

JavaScript コードを省略する一般的な方法の概要

目次序文矢印関数一般的な配列操作をマスターするスプレッド演算子オブジェクトの省略形構造化割り当てデー...

Vue+Element UI でサマリーポップアップウィンドウを実装するプロセス全体

シナリオ: 検査文書には n 個の検査詳細があり、検査詳細には n 個の検査項目があります。実装効果...

アルバムと写真をアルバムに保存するためのWeChatアプレット

私は現在、Xiao Nian Gao に似たビデオおよびツール アプリを開発しています。ユーザーが作...

CSS で複数の境界線を実装するためのヒント

1. 複数の国境[1]背景: ボックスシャドウ、アウトライン使用シナリオの多様性を考慮すると、複数の...

MysqlチューニングExplainツールの詳細な説明と実践的な演習(推奨)

MySQL チューニング ツールの詳細な説明と実践的な演習の説明 ツールの紹介の説明 分析例の説明...