主從復(fù)制延遲的監(jiān)測(cè),我以前的做法是通過(guò)比較show slave statusG中的兩個(gè)變量的差值(Read_Master_Log_Pos,Exec_Master_Log_Pos),將差值設(shè)置為一個(gè)自己認(rèn)為合理的范圍,Seconds_Behind_Master 沒(méi)有適用過(guò),今天做一次解析:
創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元宜秀做網(wǎng)站,已為上家服務(wù),為宜秀各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
Seconds_Behind_Master 是通過(guò)比較 SQL THREAD 接受 events事件的時(shí)間戳(timestamp) 與IO THREAD 執(zhí)行事件 events時(shí)間戳的差值--秒數(shù)來(lái)確定slave 落后于master多少。如果主從機(jī)器的時(shí)間不同,該時(shí)間的計(jì)算也是不會(huì)受影響的(如果時(shí)間發(fā)生異常,則這個(gè)秒數(shù)的就不怎么可靠啦)
如果slave SQL thread 或者 slave I/O thread 或者沒(méi)有連接到master,那么該變量的值為NULL.
0:表示master slave 復(fù)制沒(méi)有延遲(大部分情況下是這個(gè)樣子)。
正值:表示slave落后于master的秒數(shù)。
在網(wǎng)絡(luò)很快的情況下,I/O thread 能夠很快的從master上獲取binlog到slave的 relay-log。這種情況下, seconds_behind_master的值能真正代表slave落后于master的秒數(shù)。在網(wǎng)絡(luò)很差的情況下,I/O thread 同步很慢,slave收到的二進(jìn)制日志信息,SQL THREAD能夠很快的執(zhí)行。這個(gè)時(shí)候 seconds_behind_master 是0,這種情況下 slave落后于master很多。
為了排除網(wǎng)絡(luò)的干擾,我們可以參考percona 的工具 pt-heartbeat.
該工具可以計(jì)算出MySQL復(fù)制或者是PostgreSQL,它可以更新master或者監(jiān)控復(fù)制。它還可以從my.cnf 讀取配置。它借助timestmp的比較實(shí)現(xiàn)的,首先需要保證主從服務(wù)器時(shí)間必須要保持一致,通過(guò)與相同的一個(gè)NTP server同步時(shí)鐘。它需要在主庫(kù)上創(chuàng)建一個(gè)heartbeat的表,里面的時(shí)間戳ts就是當(dāng)前的時(shí)間戳 now(),該結(jié)構(gòu)也會(huì)被復(fù)制到從庫(kù)上。表建好以后,會(huì)在主庫(kù)上以后臺(tái)進(jìn)程的模式去執(zhí)行一行更新操作的命令,定期去向表中的插入數(shù)據(jù),這 個(gè)周期默認(rèn)為1 秒,同時(shí)從庫(kù)也會(huì)在后臺(tái)執(zhí)行一個(gè)監(jiān)控命令,與主庫(kù)保持一致的周期+0.5S(默認(rèn)0.5S延遲檢查)去比較,復(fù)制過(guò)來(lái)記錄的ts值與主庫(kù)上的同一條ts值,差值為0表示無(wú)延時(shí),差值越大表示 延時(shí)的秒數(shù)越多。
1.網(wǎng)絡(luò)的延遲
由于mysql主從復(fù)制是基于binlog的一種異步復(fù)制,通過(guò)網(wǎng)絡(luò)傳送binlog文件,理所當(dāng)然網(wǎng)絡(luò)延遲是主從不同步的絕大多數(shù)的原因,特別是跨機(jī)房的數(shù)據(jù)同步出現(xiàn)這種幾率非常的大,所以做讀寫(xiě)分離,注意從業(yè)務(wù)層進(jìn)行前期設(shè)計(jì)。
2.主從兩臺(tái)機(jī)器的負(fù)載不一致
由于mysql主從復(fù)制是主數(shù)據(jù)庫(kù)上面啟動(dòng)1個(gè)io線程,而從上面啟動(dòng)1個(gè)sql線程和1個(gè)io線程,當(dāng)中任何一臺(tái)機(jī)器的負(fù)載很高,忙不過(guò)來(lái),導(dǎo)致其中的任何一個(gè)線程出現(xiàn)資源不足,都將出現(xiàn)主從不一致的情況。
3.max_allowed_packet設(shè)置不一致
主數(shù)據(jù)庫(kù)上面設(shè)置的max_allowed_packet比從數(shù)據(jù)庫(kù)大,當(dāng)一個(gè)大的sql語(yǔ)句,能在主數(shù)據(jù)庫(kù)上面執(zhí)行完畢,從數(shù)據(jù)庫(kù)上面設(shè)置過(guò)小,無(wú)法執(zhí)行,導(dǎo)致的主從不一致。
4.key自增鍵開(kāi)始的鍵值跟自增步長(zhǎng)設(shè)置不一致引起的主從不一致。
怎樣解決MySQL數(shù)據(jù)庫(kù)主從復(fù)制延遲的問(wèn)題
可以通過(guò)監(jiān)控show slave status\G命令輸出的Seconds_Behind_Master參數(shù)的值來(lái)判斷,是否有發(fā)生主從延時(shí)。
其值有這么幾種:
NULL - 表示io_thread或是sql_thread有任何一個(gè)發(fā)生故障,也就是該線程的Running狀態(tài)是No,而非Yes.
0 - 該值為零,是我們極為渴望看到的情況,表示主從復(fù)制良好,可以認(rèn)為lag不存在。
正值 - 表示主從已經(jīng)出現(xiàn)延時(shí),數(shù)字越大表示從庫(kù)落后主庫(kù)越多。
負(fù)值 - 幾乎很少見(jiàn),只是聽(tīng)一些資深的DBA說(shuō)見(jiàn)過(guò),其實(shí),這是一個(gè)BUG值,該參數(shù)是不支持負(fù)值的,也就是不應(yīng)該出現(xiàn)。