序文 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 マスター スレーブ同期 (レプリケーションとも呼ばれます) は、次の主な機能を備えた組み込みの高可用性および高パフォーマンスのクラスター ソリューションです。
マスタースレーブ同期は 3 つのステップに分かれています。
マスタースレーブ同期は非同期リアルタイム同期であり、リアルタイムで送信しますが、実行に遅延があります。マスターサーバーの負荷が大きい場合、遅延もそれに応じて増加します。 上の図から、合計 3 つのスレッドが必要であることがわかります。
MySQL スレッドを表示 MySQL のステータスを表示するには ホストのステータス: スタンバイマシンのステータス: ご覧のとおり、私のクラスター アーキテクチャは 1 台のホストと 4 台のスタンバイ マシンで構成されているため、ホストには 4 つの同期スレッド (すべての binlog データはスタンバイ マシンに送信され、binlog ログの更新を待機しています) と 1 つの表示コマンド スレッド (完全なプロセス リストを表示) があります。スタンバイ マシンには、表示コマンド スレッドが 1 つ、I/O スレッドが 1 つ (マスターが同期データ イベントを送信するのを待機中)、および SQL スレッドが 1 つ (すべてのリレー ログを読み取り、I/O スレッドによる更新を待機中) あります。 同期ステータスの表示 マスター スレーブ同期は非同期かつリアルタイムであるため、遅延が発生します。スタンバイ マシンの同期遅延を表示するには、show slave status; を使用します。 マスター スレーブ同期で注意する必要があるいくつかのプロパティは赤でマークされています。
show master status; コマンドを使用して、マスター サーバーの実行ステータスを表示することもできます。 通常のマスタースレーブ同期ステータス:
トラブルシューティング マスタースレーブ同期のメカニズムを理解した後、今日遭遇した問題を見てみましょう。スタンバイマシンのステータスを確認すると、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 台のエラー ログを確認しました。
Google でキーワード「Slave: received end packet from server, apparent master shut down:」を検索すると、「Confusing MySQL Replication Error Message」の記事で、原因は 2 つのスタンバイ サーバーのサーバー ID が重複していることであることがわかります。
バグ修正 問題を特定した後、重複があるかどうかを確認したところ、2 台のバックアップ マシンのフィールドが実際に同じであることがわかりました。 vim の my.cnf #レプリケーション ログ bin = mysql bin # この乱数は server-id=177230069 と同じです 同期バイナリログ=1 別の番号を変更して保存し、MySQL プロセスを再起動すると、アラームが復元されます。 要約する 結局のところ、この問題の解決方法は非常に簡単ですが、問題のトラブルシューティングを行う際には、最初は混乱していたものの、最後にはアイデアが明確になるという変化がよく見られます。この記事の主な利点は、マスター スレーブ同期のメカニズムと問題を追跡するためのアイデアを理解できるようにすることです。次回は、マスター スレーブ同期によってもたらされる問題を迅速に解決できることを願っています。 さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。 参考文献
以下もご興味があるかもしれません:
|
<<: nginxを使用してドメイン名ベースの仮想ホストを構成する
>>: Easyswoole ワンクリック インストール スクリプトとパゴダ インストール エラー
目次配列の紹介配列リテラル2次元配列要約する配列の紹介配列- Arrayもオブジェクトですこれは通常...
/usr/local/nginx/conf と入力する sudo cd /usr/local/ngi...
1. ビジネスシナリオの紹介MySQLを使用する電子商取引システムがあるとします。大量のデータを保存...
HTML ドキュメント内の要素は次々に配置され、ブロックレベル要素の前後に改行が追加されるだけで、合...
この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...
この記事では ソースコードのオンラインプレビューとダウンロード今日のチュートリアルでは、円のホバー効...
今日、私の同僚が MYSQL クエリ ステートメントの作成時に非常に奇妙な問題に遭遇しました。MyS...
インストール時間を節約するために、公式の mysql docker イメージを使用して mysql ...
1. コンポーネントをインストールする yum install epel-rpm-macros.no...
環境: 10.12 の新機能Python 3.6 MySQL 5.7.25 の場合ジャンゴ 2.2....
目次PXEはサーバーの無人バッチ展開を実装します1. PXEの概要1.1 PXEとは何か1.2 キッ...
jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...
CSS には 4 種類の配置方法があり、シナリオによって効果が異なります。ここでは、これら 4 種類...
この記事では主に、MySQL サービスの自動停止の解決策を紹介し、参考と学習のために共有します。一緒...
概要リレーショナル データベースでは、インデックスは、データベース テーブル内の 1 つ以上の列の値...