マスターの後ろの秒数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)
CSS のFlex(彈性布局)すると、Web ページのレイアウトを柔軟に制御できます。Flex Fl...
CentOS 6.4 環境で MySQL 5.1 を 5.5.36 にアップグレードする手順を記録し...
目次Vueのレスポンシブシステムの基本原則1. Object.definePropertyの使い方を...
具体的なコードは次のとおりです。 <div id="ボックス"> &...
最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...
序文非表示要素の 3 つの属性である表示、可視性、不透明度の類似点と相違点は、フロントエンドの就職面...
インストール前の準備CUDA の主な目的はディープラーニングであり、現在主流のディープラーニングフレ...
CSSを使用してスクロールバーを変更する1.コンテンツがオーバーフローした場合のオーバーフロー設定水...
参考までに、ネイティブjsを使用して簡単な計算機(詳細なコメント付き)を実装します。具体的な内容は次...
1. IEブラウザを使用してVPNにログインする 2. リモートログイン 3. サーバーに最新のn...
方法 1: スクリプト方式を使用する:共通ヘッダー ファイル head.js または共通フッター フ...
序文一般的な方法はここには記載されていませんが、等しいかどうかを判断するための二重ループや、比較のた...
実際、これは非常に簡単です。imgにaタグを追加し、 <a href='tencent...
問題の説明: MySQL に中国語の文字を挿入する場合、または MySQL では中国語の文字が正常に...
最初にsudo suコマンドを使用して root アカウントに切り替えることをお勧めします。そうしな...