1. 程式人生 > >MySQL 主從同步延遲的原因及解決辦法

MySQL 主從同步延遲的原因及解決辦法

https://blog.csdn.net/soar_away/article/details/72615012

   mysql 用主從同步的方法進行讀寫分離,減輕主伺服器的壓力的做法現在在業內做的非常普遍。 主從同步基本上能做到實時同步。我從別的網站借用了主從同步的原理圖。

 

在配置好了, 主從同步以後, 主伺服器會把更新語句寫入binlog,   從伺服器的IO 執行緒(這裡要注意, 5.6.3 之前的IO執行緒僅有一個,5.6.3之後的有多執行緒去讀了,速度自然也就加快了)回去讀取主伺服器的binlog 並且寫到從伺服器的Relay log 裡面,然後從伺服器的 的SQL thread 會一個一個執行 relay log 裡面的sql , 進行資料恢復。

relay 就是 傳遞, relay race 就是接力賽的意思

1. 主從同步的延遲的原因

        我們知道, 一個伺服器開放N個連結給客戶端來連線的, 這樣有會有大併發的更新操作, 但是從伺服器的裡面讀取binlog 的執行緒僅有一個, 當某個SQL在從伺服器上執行的時間稍長 或者由於某個SQL要進行鎖表就會導致,主伺服器的SQL大量積壓,未被同步到從伺服器裡。這就導致了主從不一致, 也就是主從延遲。

2. 主從同步延遲的解決辦法

     實際上主從同步延遲根本沒有什麼一招制敵的辦法, 因為所有的SQL必須都要在從伺服器裡面執行一遍,但是主伺服器如果不斷的有更新操作源源不斷的寫入, 那麼一旦有延遲產生, 那麼延遲加重的可能性就會原來越大。 當然我們可以做一些緩解的措施。

    a. 我們知道因為主伺服器要負責更新操作, 他對安全性的要求比從伺服器高, 所有有些設定可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設定,而slave則不需要這麼高的資料安全,完全可以講sync_binlog設定為0或者關閉binloginnodb_flushlog, innodb_flush_log_at_trx_commit 也 可以設定為0來提高sql的執行效率 這個能很大程度上提高效率。另外就是使用比主庫更好的硬體裝置作為slave。

    b. 就是把,一臺從伺服器當度作為備份使用, 而不提供查詢, 那邊他的負載下來了, 執行relay log 裡面的SQL效率自然就高了。

    c. 增加從伺服器嘍,這個目的還是分散讀的壓力, 從而降低伺服器負載。

3. 判斷主從延遲的方法

    MySQL提供了從伺服器狀態命令,可以通過 show slave status 進行檢視,  比如可以看看Seconds_Behind_Master引數的值來判斷,是否有發生主從延時。
其值有這麼幾種:
NULL - 表示io_thread或是sql_thread有任何一個發生故障,也就是該執行緒的Running狀態是No,而非Yes.
0 - 該值為零,是我們極為渴望看到的情況,表示主從複製狀態正常

其它的方法我也沒試過, 暫時不做評論