程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL slave狀態之Seconds_Behind_Master

MySQL slave狀態之Seconds_Behind_Master

編輯:MySQL綜合教程

   在MySQL的主從環境中,我們可以通過在slave上執行show slave status來查看slave的一些狀態信息,其中有一個比較重要的參數Seconds_Behind_Master。那麼你是否明白它的真正含義以及它是怎麼計算的呢?
          在之前我一直誤以為Seconds_Behind_Master是表示slave比master落後多少,如果這個值為0的表示主從已經處於一致了(在非同步模式下,現在官方最多也只在5.5中增加了半同步復制)。但是最近我終於認識到之前的錯誤理解。首先我們需要明白的一點:Seconds_Behind_Master表示slave上SQL thread與IO thread之間的延遲,我們都知道在MySQL的復制環境中,slave先從master上將binlog拉取到本地(通過IO thread),然後通過SQL thread將binlog重放,而Seconds_Behind_Master表示本地relaylog中未被執行完的那部分的差值。
  www.2cto.com  
手冊上的定義: In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O thread. 所以如果slave拉取到本地的relaylog(實際上就是binlog,只是在slave上習慣稱呼relaylog而已)都執行完,此時通過show slave status看到的會是0,那麼Seconds_Behind_Master的值為0是否表示主從已經處於一致了呢?答案幾乎是否定的!為什麼幾乎是否定的?因為絕大部分的情況下復制都是異步的,異步就意味著master上的binlog不是實時的發送到slave上,所以即使Seconds_Behind_Master的值為0依然不能肯定主從處於一致,這也是我之前強調非同步復制的原因(現在已經有公司在做同步復制了,比如網易自己實現了VSR,VirtualSynchronized Replication,由於同步復制性能較差,所以網易再實現同步復制的同時還打了group commit的補丁)。所以如果我們要以這個參數來估計主從延遲多久的話至少得在一個比較好的網絡環境中,這樣才能保證幾乎master上的binlog都已經發送到slave上。
  www.2cto.com           上面解釋了Seconds_Behind_Master這個值的真正含義,那麼它的值到底是怎麼計算出來的呢?實際上在binlog中每個binlog events都會附上執行時的timestamp,所以在在確定Seconds_Behind_Master的值時MySQL是通過比較當前系統的時間戳與當前SQL thread正在執行的binlog event的上的時間戳做比較,這個差值就是Seconds_Behind_Master的值。也許你會有疑問那要是兩台服務器之間的時鐘不一致怎麼辦?確實會存在這種情況,那麼此時這個值的可靠性就不大了,手冊上對此也進行了說明: This time difference computation works even if the master and slave do not have identical clock times, provided that the difference,
computed when the slave I/O thread starts, remains constant from then on. Any changes—including NTP updates—can lead to clock
skews that can make calculation of Seconds_Behind_Master less reliable         Seconds_Behind_Master的值除了是非負數之外還可能是NULL,它是由如下幾種情況導致的:SQL thread沒運行/IO thread沒運行/slave沒有連接到master。    www.2cto.com           接下來再簡單介紹一下異步復制/半同步復制之間的區別。         異步復制,master上的操作記錄binlog的同時不關心binlog是否已經被slave接收。         半同步復制,master上的操作記錄binlog的同時會關心binlog是否被slave接受。但是由於它的處理邏輯問題可能丟一個事務,如下圖所示: 這樣的處理流程存在一個問題,當存儲引擎提交(storage commit)後,此時如果master掛了那麼會存在主從不一致,對於這個問題orczhou好像自己對源碼進行了修改更改storage commit的順序來達到一個增強的半同步復制。         對Seconds_Behind_Master就解釋到這裡,希望對你也能有點幫助。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved