mysql之 誤用SECONDS_BEHIND_MASTER衡量MYSQL主備的延遲時間
連結:
MySQL 本身透過 show slave status 提供了 Seconds_Behind_Master ,用於衡量主備之間的複製延遲,但是今天碰到了一個場景,發現 Seconds_Behind_Master 為 0 , 備庫的 show slave status 顯示 IO/SQL 執行緒都是正常的 , MySQL 的主庫上的變更卻長時間無法同步到備庫上。如果沒有人為干預,直到一個小時以後,MySQL 才會自動重連主庫,繼續複製主庫的變更。
影響範圍: MySQL , Percona , MariaDB 的所有版本。
雖然這種場景非常特殊,遇到的機率並不高,但是個人覺得有必要提醒一下使用 MySQL 的 DBA 們。透過對這個場景的分析,也有助於我們更加深入的理解 MySQL replication 重試機制。
一、重現步驟
搭建主備的複製,臨時斷開主庫的網路,並 kill 掉主庫 MySQL 的 binlog dump 執行緒。
此時觀察備庫的複製情況, show slave status 中:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
但是此時你把網路恢復以後,在主庫做任何變更,備庫都無法獲得資料更新了。而且備庫上的show slave status 顯示: IO 執行緒 SQL 執行緒一切正常,複製延遲一直是 0 。
一切正常,普通的監控軟體都不會發現備庫有資料延遲。
二、原理分析
MySQL 的 Replication 是區別於其他資料庫很關鍵的地方。也是可擴充套件性和高可用的基礎。它本身已經非常智慧化,只需要我們呼叫 Change Master 指定 Binlog 檔名和偏移位置就可以搭建從主庫到備庫的複製關係。
MySQL 複製 執行緒 會自動將目前複製位置記錄下來,在主備複製中斷的時候自動連上主庫,並從上次中斷的位置重新開始複製。這些操作都是全自動化的,不需要人為的干預。這給了 MySQL DBA 帶來了很多便利,同時卻也隱藏了很多細節。
要真正的理解前面問題的真相以及怎麼解決這個問題,我們還是需要真正的理解 MySQL 複製的原理。
2.1“推”還是“拉”
首先, MySQL 的複製是“推”的,而不是“拉”的。“拉”是指 MySQL 的備庫不斷的迴圈詢問主庫是否有資料更新,這種方式資源消耗多,並且效率低。“推”是指 MySQL 的主庫在自己有資料更新的時候推送這個變更給備庫,這種方式只有在資料有變更的時候才會發生互動,資源消耗少。如果你是程式設計師出身,你一定會選擇“推”的方式。
那麼 MySQL 具體是怎麼“推”的列,實際上備庫在向主庫申請資料變更記錄的時候,需要指定從主庫Binlog 的哪個檔案 ( MASTER_LOG_FILE ) 的具體多少個位元組偏移位置 ( MASTER_LOG_POS ) 。對應的,主庫會啟動一個 Binlog dump 的執行緒,將變更的記錄從這個位置開始一條一條的發給備庫。備庫一直監聽主庫過來的變更,接收到一條,才會在本地應用這個資料變更。
2.2 原因解析
從上面的分析,我們可以大致猜到為什麼 show slave status 顯示一切正常,但是實際上主庫的變更都無法同步到備庫上來:
出現問題的時候, Binlog dump 程式被我們 kill 掉了。作為監聽的一方,備庫一直沒有收到任何變更,它會認為主庫上長時間沒有任何變更,導致沒有變更資料推送過來。備庫是無法判斷主庫上對應的Binlog dump 執行緒 到底是意外終止了,還是長時間沒有任何資料變更的。所以,對這兩種情況來說,備庫都顯示為正常。
當然, MySQL 會盡量避免這種情況。比如:
l 在 Binlog dump 被 kill 掉時通知備庫 執行緒 被 kill 掉了。所以我們重現時需要保證這個通知傳送不到備庫,也就是說該問題重現的關鍵在於 Binlog dump 被 kill 的訊息由於網路堵塞或者其他原因無法傳送到備庫。
l 備庫如果長時間沒有收到從主庫過來的變更,它會每隔一段時間重連主庫。
2.3 問題避免
基於上面的分析,我們知道 MySQL 在這種情況下確實無法避免,那麼我們可以有哪些辦法可以避開列:
1. 被動處理:修改延遲的監控方法,發現問題及時處理。
2. 主動預防:正確設定 --master-retry-count , --master-connect-retry , --slave-net-timeout 複製重試引數。
l 被動處理
MySQL 的延遲監控大部分直接採集 show slave status 中的 Seconds_Behind_Master 。這種情況下,Seconds_Behind_Master 就無法用來真實的衡量主備之間的複製延遲了。我們建議透過在主庫輪詢插入時間資訊,並透過複製到備庫的時間差來獲得主備延遲的方案。 Percona 提供了一種類似的方案 pt-heartbeat 。
發現這個問題以後,我們只需要 stop slave; start slave; 重啟複製就能解決這個問題。
l 主動預防
MySQL 可以指定三個引數,用於複製執行緒重連主庫: --master-retry-count , --master-connect-retry , --slave-net-timeout 。
其中 master-connect-retry 和 master-retry-count 需要在 Change Master 搭建主備複製時指定,而 slave-net-timeout 是一個全域性變數,可以在 MySQL 執行時線上設定。
具體的重試策略為:備庫過了 slave-net-timeout 秒還沒有收到主庫來的資料,它就會開始第一次重試。然後每過 master-connect-retry 秒,備庫會再次嘗試重連主庫。直到重試了 master-retry-count 次,它才會放棄重試。如果重試的過程中,連上了主庫,那麼它認為當前主庫是好的,又會開始 slave-net-timeout 秒的等待。
slave-net-timeout 的預設值是 3600 秒, master-connect-retry 預設為 60 秒, master-retry-count 預設為86400 次。也就是說,如果主庫一個小時都沒有任何資料變更傳送過來,備庫才會嘗試重連主庫。這就是為什麼在我們模擬的場景下,一個小時後,備庫才會重連主庫,繼續同步資料變更的原因。
這樣的話,如果你的主庫上變更比較頻繁,可以考慮將 slave-net-timeout 設定的小一點,避免主庫Binlog dump 執行緒 終止了,無法將最新的更新推送過來。
當然 slave-net-timeout 設定的過小也有問題,這樣會導致如果主庫的變更確實比較少的時候,備庫頻繁的重新連線主庫,造成資源浪費。
沃趣科技的 Q Monitor 監控中對主備複製的延遲監控,並不是透過 Seconds_Behind_Master 來監控主備的。它採用了類似於 pt-heartbeat 的方式對主備進行復制延遲監控。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2217559/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 請不要用SECONDS_BEHIND_MASTER來衡量MYSQL主備的延遲時間ASTMySql
- mysql主從延遲複製MySql
- mysql主從同步(5)-同步延遲狀態考量(seconds_behind_master和pt-heartbea)MySql主從同步AST
- dataguard主備延遲多長時間的2種查詢方法
- MySQL高可用(二)主備延時如何解決?MySql
- MySQL主從複製延遲解決方案MySql
- Mysql配置從庫延遲應用MySql
- mysql的主從複製資料延遲問題MySql
- Mysql 主從延時監控MySql
- 【MySQL】 效能優化之 延遲關聯MySql優化
- MySQL之 從複製延遲問題排查MySql
- 【MySQL】 效能最佳化之 延遲關聯MySql
- MySQL主從複製延遲原因及處理思路MySql
- mysql主從同步(4)-Slave延遲狀態監控MySql主從同步
- MySQL:雙主單寫 主庫偶爾出現大量延遲的原因MySql
- MySQL主從延遲解決方法的歸納和總結MySql
- 記一次 MySQL 主從複製延遲的踩坑MySql
- 如何避免MYSQL主從延遲帶來的讀寫問題?MySql
- Bash: sleep - 延遲指定時間
- MySQL 5.7 延遲複製配置MySql
- MySQL 延遲從庫介紹MySql
- MySQL5.6升級5.7時,出現主從延遲問題排查過程MySql
- 影響MySQL主從延遲的幾個因素及解決方法MySql
- 【Mysql】Mysql負載過大,app訪問延遲MySql負載APP
- 面試官:我們們來聊一聊mysql主從延遲面試MySql
- 在Linux中,mysql 如何減少主從複製延遲?LinuxMySql
- 如何解決 MySQL 主從延時問題?MySql
- MySQL alter table時執行innobackupex全備再看Seconds_Behind_MasterMySqlAST
- Mysql slave 延遲故障一列MySql
- MySQL Slave延遲很大優化方法MySql優化
- jQuery實現的元素延遲指定時間之後隱藏jQuery
- 實時重新整理快取-處理mysql主從延遲的一些設計方案快取MySql
- MySQL 主備MySql
- MySQL主從資料庫同步延遲問題怎麼解決MySql資料庫
- mysql同步問題之Slave延遲很大最佳化方法MySql
- 【MYSQL實時備份】主從模式MySql模式
- MySQL 主從切換延時高問題分析MySql
- 指定執行緒延遲時間(毫秒)執行緒