前言
作為一名DBA,在工作中會經常遇到一些MySQL主從同步延遲的問題,這些同步慢的問題,其實原因非常多,可能是因為主從的網絡問題導致,可能是因為網絡帶寬問題導致,可能是因為大事務導致,也可能是因為單線程復制導致的延遲。
今天遇到一個問題,Mysql持續報錯,主從同步延時數過大或錯誤。所以這篇文章給大家分享下主從同步的機制原理以及問題排查思路。
故障表現
最直觀的表現為:
mysql> show slave status/G; // 狀態一 Seconds_Behind_Master: NULL // 狀態二 Seconds_Behind_Master: 0 // 狀態三 Seconds_Behind_Master: 79
連續查詢,大部分時間該屬性值=0,偶發性出現Null或者79等延時值。導致觀察主從同步延時的監控持續報警。
故障原因及解決方案
多臺備機的server-id一致,導致主機無法長時間同某一臺備機連接,進而無法正常同步。
修改server-id后,重啟數據庫恢復。
主從同步機制
MySQL的主從同步,又稱為復制(replication),是一種內置的高可用高性能集群解決方案,主要功能有:
主從同步分為3步:
主從同步是一個異步實時的同步,會實時的傳輸,但存在執行上的延時,如果主服務器壓力很大,延時也會相應擴大。
通過上面的圖,可以看到一共需要3個線程:
查看MySQL線程
我們可以使用show full processlist;
命令來查看MySQL的狀態:
主機的狀態:
備機的狀態:
可以看到,我的集群架構為1臺主機、4臺備機,所以在主機中有4個同步線程(已經發送所有的binlog數據到備機,等待binlog日志更新),1個查看命令線程(show full processlist)。在備機中有1個查看命令線程,1個I/O線程(等待主機發送同步數據事件),1個SQL線程(已經讀取了所有中繼日志,等待I/O線程來更新它)。
查看同步狀態
因為主從同步是異步實時的,也就是會存在延時的情況,我們可以通過show slave status;來查看備機上的同步延時:
在主從同步中我們需要關注的一些屬性,已經給大家標紅了:
同樣可以通過show master status;命令來查看主服務器的運行狀態:
正常運行的主從同步狀態:
Slave_IO_Running: YES
Slave_SQL_Running: YES
Seconds_Behind_Master: 0
問題排查
在理解了主從同步的機制后,再來看今天遇到的問題,通過查看備機狀態,我們觀察在三種狀態下的幾個關鍵屬性值:
mysql> show slave status/G;#狀態一: Slave_IO_State: Reconnecting after a failed master event read Slave_IO_Running: No Slave_SQL_Running: Yes Seconds_Behind_Master: NULL#狀態二: Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0#狀態三: Slave_IO_State: Queueing master event to the relay log Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 636
通過MySQL主從復制線程狀態轉變,我們可以看到三種狀態的不同含義:
# 狀態一# 線程正嘗試重新連接主服務器,當連接重新建立后,狀態變為Waiting for master to send event。Reconnecting after a failed master event read# 狀態二# 線程已經連接上主服務器,正等待二進制日志事件到達。如果主服務器正空閑,會持續較長的時間。如果等待持續slave_read_timeout秒,則發生超時。此時,線程認為連接被中斷并企圖重新連接。Waiting for master to send event# 狀態三# 線程已經讀取一個事件,正將它復制到中繼日志供SQL線程來處理。Queueing master event to the relay log
在這里,我們可以猜測,由于某些原因,從服務器不斷的和主服務器進行斷開并嘗試重連,重連成功后又再次斷開。
我們再看看主機的運行情況:
發現問題出在10.144.63.*和10.144.68.*兩臺機器上,我們查看其中一臺的錯誤日志:
190214 11:33:20 [Note] Slave: received end packet from server, apparent master shutdown:
190214 11:33:20 [Note] Slave I/O thread: Failed reading log event, reconnecting to retry, log 'mysql-bin.005682' at postion 13628070
拿到關鍵字Slave: received end packet from server, apparent master shutdown: Google搜索一下,在文章Confusing MySQL Replication Error Message中可以看到原因為兩臺備機的server-id重復。
One day it happen to me, and took me almost an hour to find that out.
Moving foward I always use a base my.cnf to I copy to any other server and the first thing is to increase the server-id.
Could MySQL just use the servername intead of a numeric value?
問題修復
定位了問題,我們確認下是否重復,發現兩臺備機的該字段確實相同:
vim my.cnf#replicationlog-bin=mysql-bin# 這個隨機數字相同導致的server-id=177230069sync_binlog=1
更改一個其他不同的數字,保存,重啟MySQL進程,報警恢復。
總結
最終來看,這個問題的解決非常簡單,但從剛開始的迷茫到最后的思路清晰,都是我們排查問題所常見的,這篇文章的主要收獲是讓你明白主從同步的機制和追查問題的思路,希望下次我們都能很快的解決主從同步帶給我們的問題。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
參考資料
|
新聞熱點
疑難解答