Sekunden_hinter_MasterFür MySQL Master-Slave-Instanzen ist seconds_behind_master ein wichtiger Parameter zum Messen der Verzögerung zwischen Master und Slave. Der Wert von seconds_behind_master kann durch Ausführen von „show slave status;“ auf dem Slave abgerufen werden. Ursprüngliche ImplementierungDefinition: Die Anzahl der Sekunden, die der Slave-SQL-Thread bei der Verarbeitung des Master-Binärprotokolls im Rückstand ist. Typ: time_t (long) Die Berechnung erfolgt wie folgt: rpl_slave.cc::show_slave_status_send_data() wenn ((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()))) { wenn (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT) Protokoll->Speichern(0LL); anders Protokoll->store_null(); } anders { langer Zeitunterschied = ((lang)(Zeit(0) - mi->rli->letzter_Masterzeitstempel) - mi->Uhr_Differenz_mit_Master); Protokoll->Speichern( (langlang)(mi->rli->letzter_Masterzeitstempel ? max(0L, Zeitdifferenz) : 0)); } Es gibt hauptsächlich zwei Situationen:
letzter_MasterzeitstempelDefinition: Der Zeitpunkt des Ereignisses im Binärprotokoll der Masterdatenbank. Typ: time_t (lang) Berechnungsmethode: Der last_master_timestamp wird unterschiedlich berechnet, je nachdem, ob der Standby-Server parallel repliziert wird. Nicht-parallele Replikation: rpl_slave.cc:exec_relay_log_event() wenn ((!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 + (Zeit_t) ev->Ausführungszeit; DBUG_ASSERT(rli->last_master_timestamp >= 0); } In diesem Modus gibt last_master_timestamp die Endzeit jedes Ereignisses an, when.tv_sec die Startzeit des Ereignisses und exec_time die Ausführungszeit der Transaktion. Dieser Wert wird vor dem Apply_Event berechnet, sodass der Last_Master_Timestamp vor der Ausführung des Ereignisses aktualisiert wurde. Da exec_time nur im Query_log_event vorhanden ist, ändert sich last_master_timestamp in verschiedenen Ereignisphasen der Anwendung einer Transaktion. Nehmen wir als Beispiel eine Transaktion, die zwei Einfügeanweisungen enthält. Wenn dieser Codeabschnitt aufgerufen wird, werden Ereignistyp, Zeitstempel und Ausführungszeit ausgedruckt. Erstellen Sie Tabelle t1 (a int PRIMARY KEY AUTO_INCREMENT, b longblob) engine=innodb; beginnen; in t1(b) einfügen, auswählen, wiederholen('a',104857600); in t1(b) einfügen, auswählen, wiederholen('a',104857600); begehen;
Parallele Replikation: rpl_slave.cc mts_checkpoint_routine ts = rli->gaq->leer() ? 0 : neu interpretieren_cast<Slave_job_group *>(rli->gaq->head_queue())->ts; rli->reset_notified_checkpoint(cnt, ts, true); /* Ende von "Koordinator::"commit_positions" */ In diesem Modus gibt es auf dem Standby-Rechner eine Verteilungswarteschlange gaq. Wenn gaq leer ist, wird last_commit_timestamp auf 0 gesetzt; wenn gaq nicht leer ist, wird zu diesem Zeitpunkt ein Prüfpunkt lwm beibehalten und alle Transaktionen vor lwm werden auf dem Standby-Rechner abgeschlossen. Zu diesem Zeitpunkt wird last_commit_timestamp auf den Zeitpunkt nach Abschluss der Transaktion aktualisiert, in der sich lwm befindet. Der Zeittyp ist vom Typ time_t. ptr_group->ts = common_header->when.tv_sec + (time_t)exec_time; // Seconds_behind_master bezogen rli->rli_checkpoint_seqno++; wenn (Zeitstempel aktualisieren) { mysql_mutex_lock(&data_lock); letzter_Masterzeitstempel = neuer_Zeitstempel; mysql_mutex_unlock(&data_lock); } Bei der parallelen Replikation wird last_master_timestamp erst aktualisiert, nachdem die Ereignisausführung abgeschlossen ist. Daher unterscheidet sich seconds_behind_master zwischen nicht paralleler Replikation und paralleler Replikation. Uhr_Differenz_mit_MasterDefinition:
rpl_slave.cc::get_master_version_and_clock() wenn (!mysql_real_query(mysql, STRING_WITH_LEN("SELECT UNIX_TIMESTAMP()")) && (master_res = mysql_store_result(mysql)) && (Masterzeile = mysql_fetch_row(Masterres))) { mysql_mutex_lock(&mi->data_lock); mi->clock_diff_with_master= (lang) (Zeit((Zeit_t*) 0) - strtoul(Masterzeile[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); } Diese Differenz wird nur einmal berechnet, wenn Master und Slave Kontakt aufnehmen. andereAusführungszeitDefinition:
Struktur timeval end_time; ulonglong micro_end_time = meine_micro_zeit(); meine_Mikro_Zeit_bis_Zeitwert(Mikro_Endzeit, &Endzeit); exec_time = end_time.tv_sec - thd_arg->query_start_in_secs(); Zeitfunktion(1) time_t time(time_t timer) time_t ist vom Typ „long“ und der zurückgegebene Wert ist nur auf Sekunden genau. (2) int gettimeofday (struct timeval *tv, struct timezone *tz) kann die aktuelle Zeit in Mikrosekunden ermitteln; (3) Zeitwertstruktur #include <zeit.h> Struktur timeval { time_t tv_sec; /*Sekunden*/ suseconds_t tv_usec; /*Mikrosekunden*/ } ZusammenfassenDie Verwendung von seconds_behind_master zur Messung der Master-Slave-Verzögerung kann nur auf Sekundenebene genau sein. In einigen Szenarien kann seconds_behind_master die Verzögerung zwischen Master und Slave nicht genau wiedergeben. Wenn beim Master und Standby Störungen auftreten, können Sie den Seconds_behind_Master-Quellcode für eine spezifische Analyse kombinieren. Oben finden Sie eine ausführliche Erklärung zu MySQL Seconds_Behind_Master. Weitere Informationen zu MySQL Seconds_Behind_Master finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Implementierung des gemeinsamen Grid-Layouts
>>: Website User Experience Design (UE)
Inhaltsverzeichnis 1. Standortobjekt 1. URL 2. Ei...
Dieser Artikel beschreibt, wie man mit Docker Zoo...
Frontend css3.filter kann nicht nur den Graueffek...
Das <script>-Tag In HTML5 hat Skript die fo...
Einführung in den Linux-Top-Befehl Der Befehl top...
1. Voraussetzungen 1. Das Projekt wurde bereitges...
Vorwort In diesem Artikel wird ein Problem beschr...
Wie wir alle wissen, gibt es in Computern zwei Art...
Die Ladegeschwindigkeit einer Webseite ist ein wic...
Schöner Code ist die Grundlage einer schönen Websi...
Vorwort Die Datenbank war schon immer meine Schwa...
Vue - Implementierung der Shuttle-Box-Funktion. D...
Inhaltsverzeichnis Vorwort Szenarioanalyse Zusamm...
Inhaltsverzeichnis Kurze Umfrage Langfristige Abf...
Inhaltsverzeichnis Vorwort Bedarfsanalyse Mysql-B...