主從複製延遲導致坑

背景:

線上出現了用戶註冊了多條重複記錄

排查問題:
  • 第一種一開始懷疑是不是併發問題造成,後來查了大多數都是隔了幾秒鐘,併發出現概率小
  • 第二種就是看出現重複數據的時間,然後線上看到從庫出現了延遲複製的問題,這就問題出現的關鍵
原來代碼邏輯:

先查詢傳過來的openid是否在從庫中存在,不存在就進行主庫插入。

出現問題關鍵點:

前端第一次請求時候,判斷從庫不存在,然後主庫插入註冊數據。由於出現複製延遲,前端第二請求過來,因爲延遲了從庫查詢還是不存在,那就GG了,又重複插了一條。

解決方法:

方法有很多種,列舉一些

  • 我們採用的是在註冊的時候在加多鎖判斷,如果這麼多分鐘內重複註冊就代表重複註冊,後面的請求就直接返回。
  • 可以用唯一索引限制
  • 或者用insert … select … where not exist 這種方式
延伸一些也是很明顯的主從複製的錯誤:
$intStatus = $arrInput[status];
$this->objActTmp->updateInfoByAId($intActId, $intStatus);
// 更新後,馬上查
$arrActContent = $this->objActTmp->getActByStatus($intStatus);

這就是主從延遲出現的地方,update後,馬上get。

參考鏈接:

http://itindex.net/detail/57223-mysql-%E5%A4%8D%E5%88%B6-%E5%BB%B6%E8%BF%9F

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章