天天看點

mysql延遲解決方案

一. 如何檢測主從延遲

      可以通過監控 show slave status\G 指令輸出的 Seconds_Behind_Master 參數值來判斷,是否存在主從延時。

      NULL- 表示io_thread或sql_thread發生故障,也就是該線程的Running狀态是No。(有故障)

0- 該值為零,是我們極為渴望看到的情況,表示主從複制良好,可以認為lag不存在。(無延遲)

正值- 表示主從已經出現延時,數字越大表示從庫落後主庫越多。(有延遲)

負值- 幾乎很少見,隻是聽一些資深的DBA說見過,其實這是一個BUG值,該參數是不支援負值的,也就是不應該出現。

二. 主從庫延遲産生的原因

mysql延遲解決方案

      在分析延遲産生原因之前,我們先來熟悉一下主從同步的工作原理和步驟:

      步驟1:所有資料更新都會被主庫記錄到主庫的二進制日志。

      步驟2:與此同時從庫的IO線程會從主庫上讀取二進制日志,寫入到從庫的中繼日志上。

      步驟3:從庫的SQL線程讀取中繼日志上的内容來更新從庫。

       到底是什麼原因導緻了主從的延遲呢?問題無非出在這三個步驟或過程中:主庫對DDL和DML産生binlog,和slave的Slave_IO_Running線程從主庫取日志,效率都比較高。但是,由于從庫的Slave_SQL_Running是單線程作業,不能并發執行,是以當主庫的TPS并發較高時,就容易産生延遲。

三. 如何解決主從延遲

1. 最簡單的減少slave同步延時的方案就是在架構上做優化,盡量讓主庫的DDL快速執行。

2. 還有就是主庫寫對資料安全性較高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設定,而slave則不需要這麼高的資料安全,完全可以将sync_binlog設定為0或者關閉binlog,innodb_flushlog也可以設定為0來提高sql的執行效率。

3. 另外就是使用比主庫更好的硬體裝置作為slave。

4. 另外,mysql-5.6.3已經支援了多線程的主從複制。

繼續閱讀