mysql数据同步es踩坑记

本文记录了在将MySQL数据同步至Elasticsearch过程中遇到的问题及解决方案。通过记录上次同步的update_time进行增量同步,但当数据批量更新时,一次性取1000条并循环处理导致死循环。解决方案是每次取1000条,根据更新数量决定是否延时处理同一秒内的剩余数据,同时设置循环退出条件以避免无限循环。此外,还提到异常处理、超时控制和消息发送频率限制等其他优化点。
摘要由CSDN通过智能技术生成

背景:

需要把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条更新记录就有问题了。

问题的核心就

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值