MySQLのSeconds_Behind_Masterの詳細な説明

MySQLのSeconds_Behind_Masterの詳細な説明

マスターの後ろの秒数

MySQL マスター/スレーブ インスタンスの場合、seconds_behind_master はマスターとスレーブ間の遅延を測定するための重要なパラメーターです。 seconds_behind_master の値は、スレーブ上で「show slave status;」を実行することで取得できます。

オリジナルの実装

定義: スレーブ SQL スレッドがマスター バイナリ ログの処理に遅れている秒数。

タイプ: time_t (long)

計算は次のようになります。

rpl_slave.cc::show_slave_status_send_data()
if ((mi->get_master_log_pos() == mi->rli->get_group_master_log_pos()) &&
       (!strcmp(mi->get_master_log_name(),
                mi->rli->get_group_master_log_name()))) {
     mi->slave_running == MYSQL_SLAVE_RUN_CONNECT の場合
       プロトコル->store(0LL);
     それ以外
       プロトコル->store_null();
   } それ以外 {
     長いtime_diff = ((long)(time(0) - mi->rli->last_master_timestamp) -
                       mi->clock_diff_with_master);
     プロトコル->ストア(
         (longlong)(mi->rli->last_master_timestamp ? max(0L, time_diff) : 0));
   }

主に2つの状況があります:

  • SQL スレッドは、IO スレッドがホスト binlog を取得するのを待機します。このとき、seconds_behind_master は 0 であり、スタンバイ マシンとマスター マシンの間に遅延がないことを示しています。
  • SQLスレッドはリレーログを処理します。このとき、seconds_behind_masterは(long)(time(0) – mi->rli->last_master_timestamp) – mi->clock_diff_with_masterで計算されます。

最終マスタータイムスタンプ

意味:

マスター データベース binlog 内のイベントの時刻。

型: time_t (long)

計算方法:

last_master_timestamp は、スタンバイ サーバーが並列にレプリケートされるかどうかに応じて計算方法が異なります。

非並列レプリケーション:

rpl_slave.cc:exec_relay_log_event()
if ((!rli->is_parallel_exec() || rli->last_master_timestamp == 0) &&
    !(ev->is_artificial_event() || ev->is_relay_log_event() ||
     (ev->common_header->when.tv_sec == 0) ||
     ev->get_type_code() == binary_log::FORMAT_DESCRIPTION_EVENT ||
     ev->server_id == 0))
{
 rli->last_master_timestamp = ev->common_header->when.tv_sec +
                             (time_t)ev->exec_time;
 DBUG_ASSERT(rli->last_master_timestamp >= 0);
}

このモードでは、last_master_timestamp は各イベントの終了時刻を示し、when.tv_sec はイベントの開始時刻を示し、exec_time はトランザクションの実行時刻を示します。この値は apply_event の前に計算されるため、イベントが実行される前に last_master_timestamp が更新されます。 exec_time は Query_log_event にのみ存在するため、last_master_timestamp はトランザクションを適用するさまざまなイベント段階で変化します。 2 つの挿入ステートメントを含むトランザクションを例に挙げます。このコード セグメントが呼び出されると、イベント タイプ、タイムスタンプ、実行時間が出力されます。

テーブル t1(a int PRIMARY KEY AUTO_INCREMENT 、b longblob) を作成します。engine=innodb;
始める;
t1(b)に挿入し、repeat('a',104857600);を選択します。
t1(b)に挿入し、repeat('a',104857600);を選択します。
専念;

10T06:41:32.628554Z 11 [注記] [MY-000000] [Repl] event_type: 33 GTID_LOG_EVENT

2020-02-10T06:41:32.628601Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316890

2020-02-10T06:41:32.628614Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 0

2020-02-10T06:41:32.628692Z 11 [メモ] [MY-000000] [Repl] event_type: 2 QUERY_EVENT

2020-02-10T06:41:32.628704Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316823

2020-02-10T06:41:32.628713Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 35

2020-02-10T06:41:32.629037Z 11 [メモ] [MY-000000] [Repl] event_type: 19 TABLE_MAP_EVENT

2020-02-10T06:41:32.629057Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316823

2020-02-10T06:41:32.629063Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 0

2020-02-10T06:41:33.644111Z 11 [メモ] [MY-000000] [Repl] event_type: 30 WRITE_ROWS_EVENT

2020-02-10T06:41:33.644149Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316823

2020-02-10T06:41:33.644156Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 0

2020-02-10T06:41:43.520272Z 0 [注記] [MY-011953] [InnoDB] ページクリーナーは 3 ページのフラッシュと 0 ページの削除に 9185 ミリ秒かかりました

2020-02-10T06:42:05.982458Z 11 [メモ] [MY-000000] [Repl] event_type: 19 TABLE_MAP_EVENT

2020-02-10T06:42:05.982488Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316858

2020-02-10T06:42:05.982495Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 0

2020-02-10T06:42:06.569345Z 11 [メモ] [MY-000000] [Repl] event_type: 30 WRITE_ROWS_EVENT

2020-02-10T06:42:06.569376Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316858

2020-02-10T06:42:06.569384Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 0

2020-02-10T06:42:16.506176Z 0 [注記] [MY-011953] [InnoDB] ページクリーナーは 8 ページのフラッシュと 0 ページの削除に 9352 ミリ秒かかりました

2020-02-10T06:42:37.202507Z 11 [メモ] [MY-000000] [Repl] event_type: 16 XID_EVENT

2020-02-10T06:42:37.202539Z 11 [メモ] [MY-000000] [Repl] event_time: 1581316890

2020-02-10T06:42:37.202546Z 11 [メモ] [MY-000000] [Repl] event_exec_time: 0

並列レプリケーション:

rpl_slave.cc mts_checkpoint_routine
ts = rli->gaq->空()
          ? 0
          : reinterpret_cast<Slave_job_group *>(rli->gaq->head_queue())->ts;
 rli->reset_notified_checkpoint(cnt, ts, true);
 /* "Coordinator::"commit_positions" の終了 */

このモードでは、スタンバイマシン上に分散キュー gaq が存在します。gaq が空の場合、last_commit_timestamp は 0 に設定されます。gaq が空でない場合、この時点でチェックポイントポイント lwm が維持され、lwm より前のトランザクションはすべてスタンバイマシン上で完了します。このとき、last_commit_timestamp は lwm が配置されているトランザクションが完了した後の時間に更新されます。時間型はtime_t型です。

ptr_group->ts = common_header->when.tv_sec +
                   (time_t)exec_time; // Seconds_behind_master 関連
rli->rli_checkpoint_seqno++;
if (update_timestamp) {
 mysql_mutex_lock(&data_lock);
 last_master_timestamp = new_ts;
 mysql_mutex_unlock(&data_lock);
}

並列レプリケーションでは、last_master_timestamp はイベント実行が完了した後にのみ更新されるため、seconds_behind_master は非並列レプリケーションと並列レプリケーションで異なります。

マスターとのクロック差

意味:

  • マスターのクロックとスレーブのクロックの差 (秒 - 1 秒)。<0 または >0 になる可能性があるため、符号を付ける必要があります。clock_diff_with_master は、I/O スレッドの開始時に計算されます。このため、I/O スレッドはマスターで SELECT UNIX_TIMESTAMP() を実行します。
  • タイプ: ロング
rpl_slave.cc::get_master_version_and_clock()
if (!mysql_real_query(mysql, STRING_WITH_LEN("SELECT UNIX_TIMESTAMP()")) &&
     (master_res = mysql_store_result(mysql)) &&
     (master_row = mysql_fetch_row(master_res)))
 {
   mysql_mutex_lock(&mi->data_lock);
   mi->クロックの差_with_master=
     (long) (time((time_t*) 0) - strtoul(master_row[0], 0, 10));
   DBUG_EXECUTE_IF("dbug.mts.force_clock_diff_eq_0",
     mi->clock_diff_with_master = 0;);
   mysql_mutex_unlock(&mi->data_lock);
 }

この差は、マスターとスレーブが接続を確立したときに 1 回だけ計算されます。

他の

実行時間

意味:

  • ステートメントの元の開始タイムスタンプと実行が完了した時刻との差。
  • 型: 符号なしlong
構造体timeval終了時間;
ulonglong micro_end_time = my_micro_time();
my_micro_time_to_timeval(micro_end_time、&end_time);
exec_time = end_time.tv_sec - thd_arg->query_start_in_secs();

時間関数

(1) time_t time(time_t timer) time_tはlong型であり、返される値は秒単位の精度のみです。

(2)int gettimeofday(struct timeval *tv, struct timezone *tz)はマイクロ秒単位で現在の時刻を取得できる。

(3)タイムバル構造

#include <time.h>
構造体timeval {
   time_t tv_sec; /*秒*/
   suseconds_t tv_usec; ​​/*マイクロ秒*/
}

要約する

seconds_behind_master を使用してマスターとスレーブ間の遅延を測定すると、秒単位までしか正確ではありません。シナリオによっては、seconds_behind_master ではマスターとスレーブ間の遅延を正確に反映できない場合があります。マスターとスタンバイに異常がある場合は、seconds_behind_master ソース コードを組み合わせて具体的な分析を行うことができます。

以上がMySQL Seconds_Behind_Masterの詳しい説明です。MySQL Seconds_Behind_Masterの詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • MySQL 同期遅延が発生したときに Seconds_Behind_Master が 0 のままになる理由
  • Python3 ファイルコピーと遅延ファイルコピータスクの実装方法
  • Docker で MySQL マスター スレーブ レプリケーションを実装するためのサンプル コード
  • MySQL データベース データのロード 複数の用途
  • MySQL データベース シェル import_table データ インポート
  • Mysql データベースのマスタースレーブ同期構成
  • MySQL でシンプルな検索エンジンを実装するためのサンプルコード
  • MySQLコマンドが中国語で入力できない問題の解決方法
  • 面接官がmysqlのcharとvarcharの違いを尋ねたとき
  • MySQL スレーブ ライブラリ Seconds_Behind_Master 遅延の概要

<<:  JVM 上の高性能データ形式ライブラリ パッケージである Apache Arrow の紹介とアーキテクチャ (Gkatziouras)

>>:  ウェブサイトのユーザーエクスペリエンスデザイン(UE)

推薦する

Linux システムで crontab を使用して MySQL データベースを定期的にバックアップする方法

システムの crontab を使用して定期的にバックアップ ファイルを実行し、バックアップ結果を日付...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

CSS でデフォルトのスタイルをクリアし、共通のスタイルを設定する方法

CSS デフォルトスタイルをクリア通常の明確なデフォルト スタイル: *{ マージン:0; パディン...

CentOS に Nginx をインストールする方法

公式ドキュメント: https://nginx.org/en/linux_packages.html...

CSS でよく使用されるフォントサイズ、フォント単位、行の高さの詳細な説明

px(ピクセル)ピクセルという言葉は皆さんもよくご存知だと思います。次に、この単位に関するちょっとし...

CSS3 グラデーション背景の互換性の問題

グラデーションの背景色を作成するときは、 linear-gradient() 関数を使用して線形グラ...

CSS3 のエラスティック レイアウトでの em の使用の概要: 1em は何ピクセルですか?

私は長い間 CSS を使用してきましたが、Web 要素の関連属性を設定するために常に「px」を使用し...

Webフロントエンドの一般的な操作(JS/HTML/CSSなどの知識を含む)

ul liの前のアイコン1をキャンセルしますクリア値1値を1に設定ラベル中央値1をクリアラベルの中央...

Vue2.0は適応解像度を実装する

この記事では、適応解像度を実現するためのVue2.0の具体的なコードを参考までに紹介します。具体的な...

Vue プロジェクトはファイルダウンロードの進行状況バー機能を実装します

日常業務でファイルをダウンロードする一般的な方法は 2 つあります。 1 つ目は、サーバーのファイル...

MySQLでグローバル変数とセッション変数を設定する2つの方法の詳細な説明

1. MySQL でグローバル変数を変更するには 2 つの方法があります。方法 1: my.ini ...

JavaScript DOM オブジェクト操作

目次1. コア1. Domノードを取得する2. ノードの更新2.1 実践演習3. Domノードを削除...

3つのDocker Nginxログの処理の詳細な説明

社内の同僚は Nginx ログの標準出力、つまりコンソール経由の処理を必要としているため、まずログを...

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

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

単語のグループ化シーケンスと複数フィールドのグループ化のための MySQL グループ方法

ここで商品テーブルを作成しました。その中のデータを見てみましょう。 mysql> 商品から *...