mysql数据同步es踩坑记

背景:

需要把mysql的数据同步到es中。由于没有维护canal集群, 我们选择了通过记录最后一次同步数据的update_time来进行数据同步。

 

具体的做法,当有数据变更的时候,发个消息,表示需要进行数据同步。

消息的监听者加锁串行执行, 从要同步数据的表中获取上一次update_time之后的数据,并且把最后一条记录的update_time更新回去。

比如说有用户表

user

id:int

name:varchar

update_time:datetime

 

sync_log

syc_table_name

last_update_time

 

从sync_log中获取last_update_time, 执行sql: select * from user where update_time>=last_update_time.

 

问题:

我们当时限制了一次取一千条出来,发现在有DB工单执行,批量更新数据出现了死循环,

导致所有MQ消费线程被占用,其他消息无法消费,产生了消息堆积,因为写了一段代码

结果集=select * from user where update_time>=last_update_time limit 1000

while(非空结果集合){

同步数据

结果集=select * from user where update_time>=last_update_time limit 1000

}

一般情况是不会有问题的,当一秒有大量更新的时候,比如说一秒有2000条更新记录就有问题了。

问题的核心就

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值