マスターの後ろの秒数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つの状況があります:
最終マスタータイムスタンプ意味: マスター データベース 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);を選択します。 専念;
並列レプリケーション: 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 は非並列レプリケーションと並列レプリケーションで異なります。 マスターとのクロック差意味:
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 回だけ計算されます。 他の実行時間意味:
構造体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の他の関連記事もご覧ください。 以下もご興味があるかもしれません:
|
<<: JVM 上の高性能データ形式ライブラリ パッケージである Apache Arrow の紹介とアーキテクチャ (Gkatziouras)
>>: ウェブサイトのユーザーエクスペリエンスデザイン(UE)
MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...
目次チュートリアルシリーズ1. MySQL の紹介2. MySQLの開発履歴3. MariaDBの基...
みなさんこんにちは。私と同じように混乱している方はいらっしゃいませんか。CSS は簡単に始められます...
最近、顔コレクションに関するプロジェクトに取り組んでいましたが、フロントエンドモジュールを書いている...
主キーを作成するには 2 つの方法があります。 テーブルテーブル名を作成( フィールド名タイプ、 フ...
私は新年を迎える前からプロジェクトに取り組んでいましたが、ここ数日で、新しいサーバー用に新しく増設し...
プロジェクトディレクトリを作成する php ディレクトリをコピーする次のプロジェクト構造を作成します...
目次変数意味があり発音しやすい変数名を使用する同じ型の変数には同じ語彙を使用する検索可能な名前を使用...
この例では、Linux への Python 3.8 のインストールを例に挙げます。 1. 依存パッケ...
前回の記事では、MySQL データ保存手順パラメータの詳細な例を紹介しました。今日は、JSON デー...
個々のウェブマスターにとって、自分のウェブサイトをいかにユニークで個性あふれるものにするかは、常に絶...
最近、インターネットのベテランと「広告」について議論したのですが、彼から非常に興味深い意見を聞きまし...
目次1. 問題の説明2. 問題分析3. 問題解決1. Dockerのディスク使用量を確認する2. 再...
目次1. はじめに2. 方法の紹介3. 使用例要約する1. はじめに配列フィルターは、フロントエンド...
指令とは何ですか? Angular と Vue はどちらもディレクティブの概念を持っており、これは通...