主从复制延迟导致坑

背景:

线上出现了用户注册了多条重复记录

排查问题:
  • 第一种一开始怀疑是不是并发问题造成,后来查了大多数都是隔了几秒钟,并发出现概率小
  • 第二种就是看出现重复数据的时间,然后线上看到从库出现了延迟复制的问题,这就问题出现的关键
原来代码逻辑:

先查询传过来的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

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