MySQLマスタースレーブ遅延現象と原理の詳細な分析

MySQLマスタースレーブ遅延現象と原理の詳細な分析

1. 現象

早朝、オンライン テーブルにインデックスが追加されました。テーブル内のデータ量が大きすぎたため (1 億件以上のデータ、50G 以上のデータ)、マスターとスレーブの間で数時間の遅延が発生しました。スレーブ データベースに依存するシステムはデータを照会できず、最終的には業務に影響を及ぼしました。

それでは、マスタースレーブ遅延の原​​理を整理してみましょう。

2. 原則

MySQL の公式ドキュメント「MySQL Replication Implementation Details」の説明によると、MySQL マスター スレーブ レプリケーションは、 master用のスレッド 1 つ ( Binlog dump thread ) とslaveスレッド 2 つ ( I/O threadSQL thread ) の 3 つのスレッドに依存します。マスタースレーブレプリケーションのプロセスは次のとおりです。

マスター サーバーとスレーブ サーバーが接続されたら、 Binlog dump threadを作成して、 bin logデータを送信します。

  • 1 つのBinlog dump thread 1 つのスレーブ サーバーに対応します。
  • Binlog dump thread bin logからデータを取得するときにデータをロックし、データ取得後すぐにロックを解除します。

スレーブ サーバーは START_SLAVE コマンドを受信すると、 I/O threadSQL threadを作成します。

  • I/O threadマスターからプル方式でイベントを読み取り、スレーブ サーバーのrelay logに保存します。
  • SQL thread relay logからイベントを読み取り、実行します。
  • slave独自のペースでデータを読み取り、更新することができ、またレプリケーション プロセス (開始と停止) を自由に操作することもできます。

注意: START_SLAVEコマンドがスレッドを正常に開始した後、後続のI/O threadまたはSQL threadが何らかの理由で停止しても、警告は表示されず、ビジネス パーティはそれに気付きません。スレーブのエラー ログを表示するか、SHOW SLAVE STATUS コマンドを使用してスレーブ上のスレッド ステータスを表示できます。

SHOW PROCESSLIST を通じてスレッドのステータスを表示できます。

Binlog ダンプ スレッド:

mysql> SHOW PROCESSLIST\G
************************** 1. 行 ****************************
  識別子: 2
 ユーザー: root
 ホスト: localhost:32931
  デシベル: NULL
コマンド: Binlog ダンプ
 時間: 94
 状態: すべてのバイナリログをスレーブに送信しました。バイナリログがスレーブに送信されるまで待機しています。
   更新される
 情報: NULL

I/O スレッドと SQL スレッド:

mysql> SHOW PROCESSLIST\G
************************** 1. 行 ****************************
  識別子: 10
 ユーザー: システムユーザー
 ホスト:
  デシベル: NULL
コマンド: 接続
 時間: 11
 状態: マスターがイベントを送信するのを待機中
 情報: NULL
 ************************** 2. 行 ****************************
  識別子: 11
 ユーザー: システムユーザー
 ホスト:
  デシベル: NULL
コマンド: 接続
 時間: 11
 状態: すべてのリレーログを読み取りました。スレーブI/Oを待機しています。
   スレッドを更新
 情報: NULL

分析

上記の原則によれば、 slave単一のスレッド( I/O thread )でデータを読み取り、単一のスレッド( SQL thread )でデータを更新し、 master複数のスレッドでデータを書き込むため、 master書き込み頻度がslave読み取りおよび更新頻度よりも高い限り、次のようなマスター スレーブ間遅延が発生する可能性があります。

  1. masterの書き込みtps slave更新速度よりも高くなります。
  2. slave 、ロックの保持などの特定のステートメントの実行に長い時間がかかります。
  3. master特定のDDLステートメントを実行すると、実行時間が長くなり、 slaveも同じ時間でそれを実行します。

ここでインデックスが作成されます。DBA に相談したところ、生成されたbin logファイルが 100 GB を超えていることがわかりました。データ量が大きすぎるため、スレーブ ライブラリのI/O thread DDL操作によって生成されたbin logイベントを読み取り続け、通常のビジネスDMLイベントの更新に影響し、マスターとスレーブの同期が遅れることになります。

4. 解決策

マスタースレーブ遅延の原​​因の観点から、解決は次の方向から始めることができます。

  1. ビジネスの選択: スレーブ データベースの遅延を許容できないアーキテクチャの場合、分散アーキテクチャを選択してスレーブ データベースの遅延の問題を回避できます。
  2. 実行時間: 大きなテーブルに対するオンラインDDL操作の場合は、業務量が少ない早朝の時間帯を選択するようにしてください。
  3. ハードウェア構成、SSDなどのスレーブハードウェア構成をアップグレードする
  4. リクエストを減らし、キャッシュ層を増やし、読み取りリクエストのドロップを減らす

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの遅延の原因と解決策
  • MySQL 5.6 から 5.7 にアップグレードする際のマスター スレーブ遅延問題のトラブルシューティング
  • MySQL マスタースレーブ同期遅延の原因と解決策
  • MYSQL マスタースレーブ非同期遅延原理の分析と解決
  • MySQLマスタースレーブデータ同期遅延の削減の詳細な説明
  • MySQL マスタースレーブレプリケーション遅延問題の詳細な説明
  • MySQL マスタースレーブ遅延問題の解決方法

<<:  JavaScript でロジック判定コードを最適化する方法

>>:  Ubuntu は scrcpy をインストールして、携帯電話の画面投影と制御を完了します (Ubuntu で QQ WeChat を使用する別の方法)

推薦する

Linux システムで複数のバージョンの PHP を共存させるソリューション (超シンプル)

PHP7が出たので、最新バージョンのファンとしては、早速アップグレードして体験してみました。しかし...

Linux で MySQL パスワードを忘れた場合の解決策

問題は次のとおりです。mysql -uroot -p コマンドを入力しましたが、パスワードを忘れてし...

MYSQLデータベーステーブル構造の最適化方法の詳細な説明

この記事では、例を使用して、MYSQL データベース テーブル構造を最適化する方法を説明します。ご参...

コンテンツ領域の周囲を回転する CSS 動的グラデーション ボーダーの効果 (サンプル コード)

レンダリング ネットで関連情報を調べたところ、現在のダイナミックグラデーションボーダーの実装方法のほ...

PXEを使用してCentOS7.6を自動的にインストールする方法の詳細なチュートリアル

1. 需要ベースには 300 台の新しいサーバーがあり、CentOS7.6 オペレーティング システ...

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...

マークアップ言語 - リスト再び

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

Centos6にMysql5.7をインストールする方法

環境セントロス6.6 MySQL 5.7インストールシステムがインストールされている場合は、まずアン...

JS配列の組み込みトラバーサルメソッドとその違いについての簡単な説明

目次forEach() (ES6) メソッドmap() (ES6) メソッドflatMap() メソ...

MySQL学習記録: KEYパーティションが引き起こした血なまぐさい事件

需要背景ビジネス テーブル tb_image のデータの一部は次のとおりです。id は一意ですが、i...

HTML インライン要素と HTML ブロックレベル要素の概要と違い

ブロックレベル要素の機能: • 常に新しい行から始まり、それ自体で 1 行を占め、後続の要素も新しい...

Linux での mysql および mysql.sock のインストールに関する問題

最近、Linux に Aphace、mysql、php をインストールするときに多くの問題に遭遇しま...

Linux デスクトップ用に Openbox を設定する方法 (推奨)

この記事は、「24 Days of Linux Desktop」の特別シリーズの一部です。 Open...

Linux コマンドを素早く習得する 4 つの方法

Linux マスターになりたいなら、いくつかの Linux コマンドを習得することが不可欠です。 L...

Docker で ElasticSearch と Kibana をインストールするためのサンプル コード

1. はじめにElasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを...