mysql 備庫延遲問題
乙個執行緒負責客戶端寫入主庫,另一線程sql_thread 執行中轉日誌(relay log)。
在官方的 5.6 版本之前,mysql 只支援單執行緒複製,由此在主庫併發高、tps 高時就會出現嚴重的主備延遲問題。
coordinator (sql_thread)在分發的時候,需要滿足以下這兩個基本要求:
1.不能造成更新覆蓋。這就要求更新同一行的兩個事務,必須被分發到同乙個 worker 中。
2.同乙個事務不能被拆開,必須放到同乙個 worker 中。
多執行緒複製的流程:
雙1,配置為logical_clock,假設有三個事務併發執行也已經執行完成(都處於prepare階段)
1.三個事務把redo log從redo log buffer寫到fs page cache中
2.把binlog_cache flush到binlog檔案中,最先進入flush佇列的為leader,
其它兩個事務為follower.把組員編號以及組的編號寫進binlog檔案中(三個事務為同一組).
3.三個事務的redo log做fsync,binlog做fsync.
4.dump執行緒從binlog檔案裡把binlog event傳送給從庫
5.i/o執行緒接收到binlog event,寫到relay log中
6.sql thread讀取relay log,判斷出這三個事務是處於同乙個組,
則把這三個事務的event打包傳送給三個空閒的worker執行緒(如果有)並執行。
配置為writeset的多執行緒複製流程:
1.三個事務把redo log從redo log buffer寫到fs page cache中
2.把binlog_cache flush到binlog檔案中,根據表名、主鍵和唯一鍵(如果有)生成hash值(writeset),儲存到hash表中
(不過乙個組的事務個數也不是無限大,由引數binlog_transaction_dependency_history_size決定組內最多事務數)
3.然後做redo log和binlog的fsync
4.dump執行緒從binlog檔案裡把binlog event傳送給從庫
5.i/o執行緒接收到binlog event,寫到relay log中
6.sql thread讀取relay log,如果是同乙個組的事務,則把事務分配到不同的worker執行緒去應用relay log.
不同組的事務,需要等到上乙個組的事務全部執行完成,才能分配worker執行緒應用relay log.
mysql資料庫從庫同步延遲的問題
在從伺服器上執行show sl e status 可以檢視到很多同步的引數,我們需要特別注意的引數如下,希望文章對各位會有所幫助。在從伺服器上執行show sl e status 可以檢視到很多同步的引數,我們需要特別注意的引數如下 master log file sl e中的i o執行緒當前正在讀...
對於one to one延遲問題 mysql
上篇中我們看到乙個矛盾,如果將constraint true配置到從表上,那麼可以儲存成功,但是不能懶載入。如果設定到主表中,能懶載入,但是不能儲存成功。這個矛盾在oracle中沒有問題。解決方案不能從配置上入手,需要改動 和資料庫表機構來解決。在從表中加入乙個唯一約束外來鍵,用來和主表做關聯。通過...
mysql主從同步延遲問題
mysql配置讀寫分離後,master負責所有的寫操作,而從伺服器負責一切的讀操作。其實在資料庫中使用的最多的操作就是讀操作,一般而言,資料庫會有較大可能成為整個系統的瓶頸。導致資料庫主從同步延遲較大的問題一般有以下幾種。1 從伺服器配置較低,只需要公升級從伺服器的配置即可 2 主庫的qps過高導致...