mysql的主從複製資料延遲問題

jaryle發表於2017-06-24
  1. MySQL資料庫主從同步延遲原理。
  2. MySQL資料庫主從同步延遲是怎麼產生的。
  3. MySQL資料庫主從同步延遲解決方案。
  4. MySQL資料庫主從同步延遲產生的因素。

1.MySQL資料庫主從同步延遲原理。

答:談到MySQL資料庫主從同步延遲原理,得從mysql的資料庫主從複製原理說起,mysql的主從複製都是單執行緒的操作,主庫對所有DDL和DML產生binlog,binlog是順序寫,所以效率很高;slave的Slave_IO_Running執行緒會到主庫取日誌,效率會比較高,slave的Slave_SQL_Running執行緒將主庫的DDL和DML操作都在slave實施。DML和DDL的IO操作是隨機的,不是順序的,因此成本會很高,還可能是slave上的其他查詢產生lock爭用,由於Slave_SQL_Running也是單執行緒的,所以一個DDL卡主了,需要執行10分鐘,那麼所有之後的DDL會等待這個DDL執行完才會繼續執行,這就導致了延時。有朋友會問:“主庫上那個相同的DDL也需要執行10分,為什麼slave會延時?”,答案是master可以併發,Slave_SQL_Running執行緒卻不可以。

2.MySQL資料庫主從同步延遲是怎麼產生的。

答:當主庫的TPS併發較高時,產生的DDL數量超過slave一個sql執行緒所能承受的範圍,那麼延時就產生了,當然還有就是可能與slave的大型query語句產生了鎖等待。

3.MySQL資料庫主從同步延遲解決方案

答:最簡單的減少slave同步延時的方案就是在架構上做優化,儘量讓主庫的DDL快速執行。還有就是主庫是寫,對資料安全性較高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設定,而slave則不需要這麼高的資料安全,完全可以講sync_binlog設定為0或者關閉binlog,innodb_flushlog也可以設定為0來提高sql的執行效率。另外就是使用比主庫更好的硬體裝置作為slave。

4.MySQL資料庫主從同步延遲產生的因素。 
1. 網路延遲 
2. master負載 
3. slave負載 
一般的做法是,使用多臺slave來分攤讀請求,再從這些slave中取一臺專用的伺服器,只作為備份用,不進行其他任何操作,就能相對最大限度地達到’實時’的要求了

另外,再介紹2個可以減少延遲的引數 
–slave-net-timeout=seconds 
引數含義:當slave從主資料庫讀取log資料失敗後,等待多久重新建立連線並獲取資料 
slave_net_timeout單位為秒 預設設定為 3600秒 
| slave_net_timeout | 3600 
–master-connect-retry=seconds 
引數含義:當重新建立主從連線時,如果連線建立失敗,間隔多久後重試。 
master-connect-retry單位為秒 預設設定為 60秒 
通常配置以上2個引數可以減少網路問題導致的主從資料同步延遲


相關文章