mysql同步(複製)延遲的緣由及解決方案

同步延遲的本質

當從庫跟不上主庫的更新進度時就會出現同步(複製)延遲,這時在從庫裏,未同步的修改在relay_log裏出現堆積,數據的版本也會漸漸跟主庫差異愈來愈大。mysql

同步延遲的緣由

爲了肯定延遲的緣由,咱們須要肯定是哪一個複製線程出現問題了。在mysql中,一對主從同步的鏈接依賴三個不一樣的線程,其中兩個由從庫建立,一個由主庫建立。sql

  • 從庫的I/o線程:當你在從庫經過Start Slave命令配置了主庫同步信息後,這個線程就會被從庫建立。用來請求主庫binlog日誌的備份
  • 主庫的Bin log Dump線程: 當從庫連上主庫後,這個線程就會被建立,而後會將其binlog發送給從庫。
  • 從庫Slave SQL 線程: 從庫建立這個線程,而後從獲取的binlog裏讀取內容並應用。

同步延遲的解決方案

當I/O線程或SQL線程沒法處理對其提出的要求時,會致使複製延遲。網絡

I/O線程可能出現的問題

  1. 網絡較慢
  2. 傳輸數據量較大
  3. 一個主從對中,binlog的讀是串行的,而寫是並行的

I/O線程可能出現的問題解決方案

  1. 針對1.2.開啓slave_compressed_protocol選項進行數據壓縮
  2. 針對3.庫級別並行讀

SQL線程可能出現的問題

  1. 語句沒有優化或者不合適形成從庫同步很慢,若有不少長時事務或太多IO活動
  2. 使用Row/Mixed格式時,從庫的表沒有primary key也會有問題。

SQL線程可能出現的問題解決方案

  1. 減小長時事務或IO
  2. 檢查主、從庫是否都有primary key

如何查看哪一個線程出現了問題

binlog文件名和位置的同步方式

此種同步方式下使用Show master statusshow slave statue命令能夠查看你須要的信息,好比: Show master status命令看到的:oracle

  • 經過postion-Read_Master_Log_Pos得到你的IO線程落後主庫日誌的字節數
  • 經過postion-Exec_Master_Log_Pos得到你的SQL線程落後主庫日誌的字節數
  • 經過Read_Master_Log_Pos-Exec_Master_Log_Pos得到你的SQL線程落後IO的字節數 Show slave status命令看到的:
  • seconds_behind_master能夠參考落後主庫的秒數,不過不要過分依賴它,由於它的統計方式不是很準確

GTIDs同步方式

診斷所用指標(show slave status)

  • Executed GTIDs: 主從庫上都能看到,返回執行的事務的id。也能夠經過查詢全局變量gtid_executed來獲取最近執行的事務id
  • Retrieved GTIDs:只有從庫上能夠看到,用來返回IO線程獲取的事務id
  • Purged GTIDs:顯示從binlog清除了哪些已經執行完的事務。通常你只會對從庫中的這個日誌感興趣

得到GTID後,你能夠使用GTID_SUBTRACT()函數計算從庫與主庫的差別。例如,如下對從庫查詢顯示從二進制日誌中讀取的還沒有應用的GTID(SQL線程延遲):ide

slave> SELECT GTID_SUBTRACT('96985d6f-2ebc-11e7-84df-08002715584a:5-133', 
        '96985d6f-2ebc-11e7-84df-08002715584a:26-132') AS MissingGTIDs;
+-----------------------------------------------+
| MissingGTIDs                                  |
+-----------------------------------------------+
| 96985d6f-2ebc-11e7-84df-08002715584a:5-25:133 |
+-----------------------------------------------+
1 row in set (0.00 sec)
複製代碼

GIIDs方式簡介

經過GTIDs【global transaction identifiers】,能夠標識每個事務,而且能夠在其一旦提交追蹤並應用於任何一個Slave上;這樣 就不須要像BinaryLog複製依賴Log file 和位置。GTIDs徹底基於事務,只要在Master提交的全部事務都在Slave上進行了Commit,那麼就能保證Master和Slave之間的數據 一致性。你能夠使用基於SBR或RBR的GTIDs來實現。推薦使用RBR【Row-based replication】.函數

參考

What Causes Replication Lag?post

相關文章
相關標籤/搜索