MySQL並行複製延時時間不準確
在MySQL中開啟並行複製後,觀察到延時不會是0,並且也沒有什麼大事務。很多文章已經有總結了,這裡記錄下。
並行以及非並行下的複製延時的計算方式都是下面的程式碼
{ long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp) - mi->clock_diff_with_master); protocol->store((longlong)(mi->rli->last_master_timestamp ? max(0L, time_diff) : 0));}
不同的就是last_master_timestamp 設定,在非並行或並行情況下 last_master_timestamp==0的情況下,( last_master_timestamp==0的情況出現在gaq佇列為空的場景)
這個值的設定如下,在執行relay_log_event的時候設定
rli->last_master_timestamp= ev->common_header->when.tv_sec + (time_t) ev->exec_time;
是binlog log_event_header 的時間 + event執行的時間
那在並行複製的情況下 last_master_timestamp 值的設定是在函式mts_checkpoint_routine中設定,這個函式是執行checkpoint,處理gaq頭任務,獲取lwm
/* Update the rli->last_master_timestamp for reporting correct Seconds_behind_master. If GAQ is empty, set it to zero. Else, update it with the timestamp of the first job of the Slave_job_queue which was assigned in the Log_event::get_slave_worker() function. */ ts= rli->gaq->empty() ? 0 : reinterpret_cast<Slave_job_group*>(rli->gaq->head_queue())->ts; rli->reset_notified_checkpoint(cnt, ts, need_data_lock, true); /* end-of "Coordinator::"commit_positions" */
在gaq空的情況下設定成0 ,否則設定成Slave_job_queue 第一個job的時間
函式 mts_checkpoint_routine 是在next_event中呼叫,根據checkpoint_group 和mts_checkpoint_period引數判斷是否執行 mts_checkpoint_routine
bool force= (rli->checkpoint_seqno > (rli->checkpoint_group - 1)); if (rli->is_parallel_exec() && (opt_mts_checkpoint_period != 0 || force)) { ulonglong period= static_cast<ulonglong>(opt_mts_checkpoint_period * 1000000ULL); mysql_mutex_unlock(&rli->data_lock); /* At this point the coordinator has is delegating jobs to workers and the checkpoint routine must be periodically invoked. */ (void) mts_checkpoint_routine(rli, period, force, true/*need_data_lock=true*/); // TODO: ALFRANIO ERROR DBUG_ASSERT(!force || (force && (rli->checkpoint_seqno <= (rli->checkpoint_group - 1))) || sql_slave_killed(thd, rli)); mysql_mutex_lock(&rli->data_lock); }
如果間隔小,就不執行checkpoint,不更新 last_master_timestamp
if (!force && diff < period) { /* We do not need to execute the checkpoint now because the time elapsed is not enough. */ DBUG_RETURN(FALSE); }
如果checkpoint沒有做,延誤了,導致event沒有及時處理,那麼這個last_master_timestamp就會相對舊,導致出現延時的情況。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2927386/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.7 並行複製MySql並行
- mysql 並行複製原理MySql並行
- MySQL 5.7並行複製MySql並行
- MySQL8.0的一個bug導致複製延時MySql
- [Mysql]Mysql5.7並行複製MySql並行
- Win10系統時間不準確的解決方法 Win10系統時間不準怎麼辦?Win10
- MySQL 8 複製(三)——延遲複製與部分複製MySql
- Ubuntu 時間不準,怎麼設定NTP時間同步?Ubuntu
- 高頻面試:如何解決MySQL主從複製延時問題面試MySql
- mysql主從延遲複製MySql
- win10時間不準怎樣自動校準時間_win10自動校準時間的步驟Win10
- MySQL並行複製(MTS)原理(完整版)MySql並行
- MySQL並行複製-原始碼理解記錄MySql並行原始碼
- MySQL Case-MySQL8.0真正的並行複製writesetMySql並行
- MySQL Case-MySQL5.7無效的並行複製MySql並行
- 在MDK用使用精確延時和在IAR中使用精確延時的不同
- sleep 時間段不佔指令碼執行時間指令碼
- MySQL時間戳、時間MySql時間戳
- PostgreSQL官方並行更新時間表SQL並行
- win10 如何校準系統時間_win10時間不準怎麼調整Win10
- win10時間老是不準怎麼辦 win10時間不對的解決教程Win10
- MySQL之 從複製延遲問題排查MySql
- MySQL主從複製延遲解決方案MySql
- 第48問:為什麼 MySQL 執行時, 不鼓勵調整系統時間MySql
- 從 MySQL 到 ClickHouse 實時複製與實現MySql
- mysql複製中臨時表的運用技巧MySql
- MySQL 並行複製方案演進歷史及原理分析MySql並行
- mysql時間操作(時間差和時間戳和時間字串的互轉)MySql時間戳字串
- 時間軸、流程類時間軸繪製
- 精確並自動化地獲取頁面首屏時間
- MySQL 主從複製之多執行緒複製MySql執行緒
- mysql之 誤用SECONDS_BEHIND_MASTER衡量MYSQL主備的延遲時間MySqlAST
- MySQL案例-並行複製亂序提交引起的同步異常MySql並行
- 透過延時從庫+binlog複製,恢復誤運算元據
- win10電腦時間不對怎麼解決_win10如何校準時間Win10
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度
- 多從庫時半同步複製不工作的BUG分析
- Swift 的坑:static var 的初始化時機並不確定Swift