線上快取不一致問題排查

2022-02-03 09:54:08 字數 2124 閱讀 1539

兩個系統共用同一張表,只是維護的字段不一樣。

email【郵箱】是我們新版本中新支援的功能。綜合系統沒有 email 字段,會員系統裡有 email 字段。

使用者反饋說: 郵箱收不郵件,去設定中看,郵箱設定會自動消失。重新設定一下就好了。

一) 排查資料問題

懷疑是綜合系統中,將 email 字段更新成了預設的空值 。

系統缺少必要的日誌,無法追蹤問題。並且缺少sql日誌. 無法定位具體問題。

觀察了系統監控,沒有異常。 記憶體,網路也沒有波動。問題拋給了測試同學,希望能復現出來。

使用者反饋說:又出現郵箱收不到郵件,還沒來得及重置,但過了大概乙個小時,自動好了。

一)排查資料庫

此時使用者沒有做更新操作。保護了資料庫現場。

馬上查詢資料庫. 得到以下結果:

使用者的 email 是存在的。

資料的最後更新時間,還是使用者上次反饋的時間。

資料現場表明 , 自從上次使用者更新過後,沒再發生過變化 。字段丟失,然後自動恢復顯然不是發生在資料庫上。

此時想到是多服務間的資料不一致性。

二)排查快取

此時想到是快取問題。

經過**求證。 綜合系統和會員系統是用的兩個快取key,所以不存在新舊系統的快取衝突問題。

二) 排查服務

此時又想到是不同服務間的字段不一致,導致快取不一致的可能性。

由於每個服務都是單獨的應用。對於 email 字段,只有基礎服務,介面服務使用到了。 上線時只公升級了這兩個服務,其他服務沒有做相應公升級。

也就是說,其他服務在做查詢時,是沒有 email 欄位的 , 那麼在寫快取時也是沒有的。

到這一步,基本確定是不同服務間的快取更新,導致的快取不一致問題。基本符合使用者描述的問題。

於是將步驟同步給測試同學,由測試同學去復現 。

問題癥結

尷了尬的。 居然沒有復現出來。

這時才注意到另乙個點。 快取預設時長是 6 小時 。 使用者有說過大概乙個小時後恢復了。

使用者是持續性事件 ,快取週期是 6 小時 , 不可能只乙個小時就更新了快取。

輔助工具不給力

一)運維平台的 快取查詢功能 , 由於年久失修, 並且過度設計,已經不能支援會員系統的快取查詢 。

二)線上的快取伺服器只開放給運維人員 , 開發負責人都沒許可權 的。 關鍵運維還沒人值班,大晚上也找不到人 。

使用者反饋說:郵件又不生效了, 此時設定介面也沒有郵箱了 。 給我些時間定位問題,他先不重置。

馬上去查詢資料庫 ,得到以下結果:

使用者的 email 字段還是存在的

資料的最後更新時間,還是使用者第一次反饋的時間。

由此可以確定 。md,就是快取的問題 。

確認是快取不一致問題 。

理論上應該是服務間資料不一致導致的快取不一致。

無法復現

無法解釋一小時自動恢復

缺少必要的支援,問題只能先暫停一下。 跟使用者溝通好後 , 決定明天如果還找不到根源,就先把會員系統的其他所有服務都公升級一把。

快取平台,由於運維人員維護不力 ,必須得催促一下。 太影響工作了。

也就是第二天了 。

先找運維要來了快取伺服器許可權 , 由於沒有現場, 想來問題肯定不止影響乙個使用者。去資料庫裡找了幾個活躍使用者, 果然試也沒幾個就找到了問題的使用者。

找到了問題快取 。 是由於資料同步服務,在查詢資料時,寫快取導致把原快取覆蓋了。

理論上會員基本的crud都應該由基礎服務來提供介面操作 , 但由於開發人員的不規範開發 , 在資料同步服務直接操作了資料庫和快取 。

公升級了資料同步服務, 問題就解決了。

但沒有完美解決 , 後續很大概率還會出現服務公升級不同步, 及開發不規範導致的快取不一致問題。 需求從技術層面解決服務間快取不一致的問題。

解決思路:

對快取新增版本號

版本號是在打包時生成 ,減少人工成本。

當 快取版本 》= 當前服務版本,ok,沒問題,快取是最新的

當 快取版本 《 當前服務版本 , 有問題。快取舊,不適合當前服務使用。 那麼淘汰快取 ,重新生成。

好了, 有活幹了, 對快取的封裝,要趕快做起來了。

神奇的一小時 ,還是沒解出來 。 還有 md,測試沒復現是 測試的同學步驟錯了。。。

快取不一致

當程式在執行過程中,會將運算需要的資料從主存複製乙份到cpu的快取記憶體當中,那麼cpu進行計算時就可以直接從它的快取記憶體讀取資料和向其中寫入資料,當運算結束之後,再將快取記憶體中的資料重新整理到主存當中。舉個簡單的例子 i i 1。當執行緒執行這個語句時,會先從主存當中讀取i的值,然後複製乙份到...

快取不一致問題分析

快取不一致問題 快取更新的4種策略 解決方案 延時雙刪除,偽 如下 public void write string key,object data 假設這會有兩個請求,乙個請求a做查詢操作,乙個請求b做更新操作,那麼會有如下情形產生 1 快取剛好失效 2 請求a查詢資料庫,得乙個舊值 3 請求b將...

version magic 不一致問題

碰到乙個問題,在開發過程中發現以前編譯的模組載入失敗了。wlan version magic 4.1.15 gfb2dbf6 smp preempt mod unload armv7 p2v8 should be 4.1.15 ge5de83b dirty smp preempt mod unloa...