1.业务场景
小猛同学在某公司的大数据部门,现在要做一个高并发的同步系统,把某个业务的数据同步到自己的系统中,然后在做各种复杂的操作后提供接口给其他部门查询,每天日同步数据要达到上千万级别。
整个数据同步前期流程是从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。
小猛同学初步架构设计是:从一个mysql监听到binlog后发送消息到MQ中,另外一个服务在消费MQ中的数据写到自己的库中,但是现在存在一个问题。
多个业务系统执行sql往mysql 里增删改对应的数据,但是小猛发现自己这边库的数据有时候跟业务方的库数据不一致。
问题:大家思考上面问题产生原因,如何去解决上面的技术问题?
2.解决方案
其他汇总方案:
1、小猛同学是使用的RocketMQ,在监听binlog的服务中发送消息到RocketMQ的时候,一条数据的增删改路由到同一个messagequeue中保证消息的顺序性;
2、A同学会问:如何解决监听到binlog后发送消息到RocketMQ的失败问题呢? 答:发送消息时重试、多次重试失败后,提供兜底补偿方案
3、B同学会问:发送binlog01、binlog02,01发送失败重试,02发送成功到时无序怎么办?答:修改MQ的配置,需要等消息01发送成功后才能发送02;或者修改binlog为row模式,不使用insert update delete等逻辑上的binlog
4、C同学会问:如何保证MQ中的消息不丢失?答:RocketMQ的master、slave高可用,基于一致性算法raft来写commitlog
5、D同学会问:如何保证消费messagequeue时消息的有序性?答:单线程消费;如何提升系统性能?答:单线程消费后,路由到队列中,在每个队列一个线程消费。如何解决数据丢失问题?答:ack机制、优雅停机
6、E同学会问:消费方执行本地落库的事务成功了,但是ack的时候失败,有重复消费怎么办? 答:在消费方来保证幂等
7、F同学会问:为啥要单独在搞个MQ直接用同步工具不就好了吗?答:比如alibaba otter、离线dataX、kettle等
8、补充说明:整个数据同步过程中,还是需要定期的比对数据;定期的全量同步数据;
网友评论