一、MySQL數據庫主從同步延遲
要了解MySQL數據庫主從同步延遲原理,我們先從MySQL的數據庫主從復制原理說起:
MySQL的主從復制都是單線程的操作,主庫對所有DDL和DML產生的日志寫進binlog,由於binlog是順序寫,所以效率很高。
Slave的IO Thread線程從主庫中bin log中讀取取日志。
Slave的SQL Thread線程將主庫的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是隨即的,不是順序的,成本高很多。
由於SQL Thread也是單線程的,如果slave上的其他查詢產生lock爭用,又或者一個DML語句(大事務、大查詢)執行了幾分鍾,那么所有之后的DML會等待這個DML執行完才會繼續執行,這就導致了延時。
二、MySQL數據庫主從同步延遲產生原因
1、Master負載
2、Slave負載
3、網絡延遲
4、機器配置(cpu、內存、硬盤)
總之,當主庫的並發較高時,產生的DML數量超過slave的SQL Thread所能處理的速度,或者當slave中有大型query語句產生了鎖等待那么延時就產生了。
三、MySQL數據庫主從同步延遲解決方案
1、salve較高的機器配置
2、Slave調整參數
我們從《MySQL數據丟失情況分析》中知道,為了保障較高的數據安全性,配置sync_binlog=1,innodb_flush_log_at_trx_commit = 1 等設置。而Slave可以關閉binlog,innodb_flush_log_at_trx_commit也可以設置為0來提高sql的執行效率
3、並行復制
MySQL5.7 的真正並行復制enhanced multi-threaded slave(MTS)是否已經完全解決了主從同步復制的延遲,還需要在實際項目中驗證。