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

      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或者關閉binlog,innodb_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 - 該值爲零,是我們極爲渴望看到的情況,表示主從複製狀態正常

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章