MySQL 中主庫跑太快,從庫追不上咋整?

php自學中心發表於2021-01-22

文章來源:www.jb51.net/article/158469.htm
有些友友學習PHP總是喜歡用視訊教程,雖然這種跟著學的方法是有些慢,但是見效還是很快的,小編在這裡給大家整理了一些關於PHP的視訊教程,給大家分享一下,都是免費的,希望能幫助到你。點選獲取教程

文章正文

我們知道生產環境中經常會遇到MySQL主從延遲問題,從原理上也能看出主庫的事務提交是併發模式,而從庫只有一個SQL執行緒負責解析,所以本身上就可能存在延遲。


基本原理

MySQL主從複製實際上基於二進位制日誌,Mysql 中主從複製時有兩個很重要的日誌檔案:binlog(二進位制日誌檔案),relay log(中繼日誌檔案),基本原理看圖片

圖片

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


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

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


隨機重放

Mysql 主庫中寫 binlog 的操作是順序寫的,之前我們提到過,磁碟的順序讀寫速度是很快的。同樣的,從庫中的 I/O 執行緒操作日誌的速度效率也是很高的。但是別忘了,還有一個 SQL 執行緒來進行資料重放,而重放的過程是隨機寫盤的。到這裡你應該就明白了吧,某一時刻 relay log 裡的資料來不及重放進從庫,就會產生主從延遲的情況。


主庫併發高
知道了從庫中 SQL 執行緒的重放情況,對於主庫併發高導致主從延遲肯定就不難理解了。某一時刻,大量寫請求打到主庫上,意味著要不斷對 binlog 進行寫入,此時從庫中的 SQL 執行緒就會應接不暇,自然會產生主從延遲。


鎖等待

對於 SQL 單執行緒來說,當遇到阻塞時就會一直等待,直到執行成功才會繼續進行。如果某一時刻從庫因為查詢產生了鎖等待的情況,此時只有當前的操作執行完成後才會進行下面的操作,同理也就產生了主從延遲的情況。


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

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

改變引數設定

因為主伺服器要負責更新操作, 它對安全性的要求比從伺服器高, 所有有些設定可以修改,比如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。


從伺服器作備份使用

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


增加從伺服器

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


3. 判斷主從延遲的方法

MySQL提供了從伺服器狀態命令,可以通過 show slave status 進行檢視, 比如可以看看Seconds_Behind_Master引數的值來判斷,是否有發生主從延時。

其值有這麼幾種:

NULL - 表示io_thread或是sql_thread有任何一個發生故障,也就是該執行緒的Running狀態是No,而非Yes.
0 - 該值為零,是我們極為渴望看到的情況,表示主從複製狀態正常

系統的學習PHP,關注公眾號後可在公眾號內獲取

1 Vue2.5核心技術原始碼分析
公眾號裡回覆:19082201

2 設計模式例項剖析與深入解讀
公眾號裡回覆:20190714

3 PHP高階實戰教程全集
公眾號裡回覆:20190625

4 與mysql的零距離接觸
公眾號裡回覆:20190128

5 高效能Linux伺服器搭建實戰
公眾號裡回覆:20190622

6 ThinkPHP5底層原始碼分析
公眾號裡回覆:20190621

7 Thinkphp外掛化開發微信系統
公眾號裡回覆:201907282319

8 Laravel 基礎入門到微信商城實戰開發
公眾號裡回覆:08250045

9 PHP非同步通訊框架Swoole實戰
公眾號裡回覆:08250024


更多視訊教程,請在每天分享的文章教程裡獲取,感謝你的支援!
關注php自學中心,獲取各種視訊教程

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章